网卡的 Ring Buffer 详解

news2024/10/4 21:19:49

1. 网卡处理数据包流程

网卡处理网络数据流程图:

 图片来自参考链接1

上图中虚线步骤的解释:

1 DMA NIC 接收的数据包逐个写入 sk_buff ,一个数据包可能占用多个 sk_buff , sk_buff 读写顺序遵循FIFO(先入先出)原则。

2 DMA 读完数据之后,NIC 会通过 NIC Interrupt Handler 触发 IRQ (中断请求)。

3 NIC driver 注册 poll 函数。

4 poll 函数对数据进行检查,例如将几个 sk_buff 合并,因为可能同一个数据可能被分散放在多个 sk_buff 中。

5 poll 函数将 sk_buff 交付上层网络栈处理。

完整流程:

1 系统启动时 NIC (network interface card)  进行初始化,系统分配内存空间给 Ring Buffer

2 初始状态下,Ring Buffer 队列每个槽中存放的 Packet Descriptor 指向 sk_buff ,状态均为 ready

3 DMA NIC 接收的数据包逐个写入 sk_buff ,一个数据包可能占用多个 sk_buff sk_buff 读写顺序遵循FIFO(先入先出)原则。4 被写入数据的 sk_buff 变为 used 状态。

5 DMA 读完数据之后,NIC 会通过 NIC Interrupt Handler 触发 IRQ (中断请求)。

6 NIC driver 注册 poll 函数。

7 poll 函数对数据进行检查,例如将几个 sk_buff 合并,因为可能同一个数据可能被分散放在多个 sk_buff 中。8 poll 函数将 sk_buff 交付上层网络栈处理。

9 poll 函数清理 sk_buff,清理 Ring Buffer 上的 Descriptor 将其指向新分配的 sk_buff 并将状态设置为 ready

2. CPU 下的 Ring Buffer 处理

因为分配给 Ring Buffer 的空间是有限的,当收到的数据包速率大于单个 CPU 处理速度的时候 Ring Buffer 可能被占满,占满之后再来的新数据包会被自动丢弃。

如果在多核 CPU 的服务器上,网卡内部会有多个 Ring BufferNIC 负责将传进来的数据分配给不同的 Ring Buffer,同时触发的 IRQ 也可以分配到多个 CPU 上,这样存在多个 Ring Buffer 的情况下 Ring Buffer 缓存的数据也同时被多个 CPU 处理,就能提高数据的并行处理能力。

当然,要实现“NIC 负责将传进来的数据分配给不同的 Ring Buffer”NIC 网卡必须支持 Receive Side Scaling(RSS) 或者叫做 multiqueue 的功能。RSS 除了会影响到 NIC IRQ 发到哪个 CPU 之外,不会影响别的逻辑了。数据处理过程跟之前描述的是一样的。

3. Ring Buffer 相关命令

在生产实践中,因 Ring Buffer 写满导致丢包的情况很多。当环境中的业务流量过大且出现网卡丢包的时候,考虑到 Ring Buffer 写满是一个很好的思路。

总结下 Ring Buffer 相关的命令:

3.1 网卡收到的数据包统计

[root@test ]$ ethtool -S em1 | more

NIC statistics:

     rx_packets: 35874336743

     tx_packets: 35163830212

     rx_bytes: 6337524253985

     tx_bytes: 3686383656436

     rx_broadcast: 15392577

     tx_broadcast: 873436

     rx_multicast: 45849160

     tx_multicast: 1784024

RX 就是收到数据,TX 是发出数据。

3.2 带有 drop 字样的统计和 fifo_errors 的统计

[root@test ]$ethtool -S em1 | grep -iE "error|drop"

rx_crc_errors: 0

rx_missed_errors: 0

tx_aborted_errors: 0

tx_carrier_errors: 0

tx_window_errors: 0

rx_long_length_errors: 0

rx_short_length_errors: 0

rx_align_errors: 0

dropped_smbus: 0

rx_errors: 0

tx_errors: 0

tx_dropped: 0

rx_length_errors: 0

rx_over_errors: 0

rx_frame_errors: 0

rx_fifo_errors: 79270

tx_fifo_errors: 0

tx_heartbeat_errors: 0

rx_queue_0_drops: 16669

rx_queue_1_drops: 21522

rx_queue_2_drops: 0

rx_queue_3_drops: 5678

rx_queue_4_drops: 5730

rx_queue_5_drops: 14011

rx_queue_6_drops: 15240

rx_queue_7_drops: 420

发送队列和接收队列 drop 的数据包数量显示在这里。并且所有 queue_drops 加起来等于 rx_fifo_errors。所以总体上能通过 rx_fifo_errors 看到 Ring Buffer 上是否有丢包。如果有的话一方面是看是否需要调整一下每个队列数据的分配,或者是否要加大 Ring Buffer 的大小。

3.3 查询 Ring Buffer 大小

[root@test]$ ethtool -g em1

Ring parameters for em1:

Pre-set maximums:

RX: 4096

RX Mini: 0

RX Jumbo: 0

TX: 4096

Current hardware settings:

RX: 256

RX Mini: 0

RX Jumbo: 0

TX: 256

RX TX 最大是 4096,当前值为 256 。队列越大丢包的可能越小,但数据延迟会增加。

3.4 调整 Ring Buffer 队列数量

[root@test]$ ethtool -l em1

Channel parameters for em1:

Pre-set maximums:

RX:        0

TX:        0

Other:        1

Combined:    8

Current hardware settings:

RX:        0

TX:        0

Other:        1

Combined:    8

Combined = 8,说明当前 NIC 网卡会使用 8 个进程处理网络数据。

更改 eth0 网卡 Combined 的值:

ethtool -L eth0 combined 8

需要注意的是,ethtool 的设置操作可能都要重启一下才能生效。

3.4 调整 Ring Buffer 队列大小 查看当前 Ring Buffer 大小:

[root@test]$ ethtool -g em1

Ring parameters for em1:

Pre-set maximums:

RX:        4096

RX Mini:    0

RX Jumbo:    0

TX:        4096

Current hardware settings:

RX:        256

RX Mini:    0

RX Jumbo:    0

TX:        256

看到 RX TX 最大是 4096,当前值为 256。队列越大丢包的可能越小,但数据延迟会增加.

设置 RX TX 队列大小:

ethtool -G em1 rx 4096

ethtool -G em1 tx 4096

3.5 调整 Ring Buffer 队列的权重

NIC 如果支持 mutiqueue 的话 NIC 会根据一个 Hash 函数对收到的数据包进行分发。能调整不同队列的权重,用于分配数据。

[root@test]$ ethtool -x em1

RX flow hash indirection table for em1 with 8 RX ring(s):

    0:      0     0     0     0     0     0     0     0

    8:      0     0     0     0     0     0     0     0

   16:      1     1     1     1     1     1     1     1

   24:      1     1     1     1     1     1     1     1

   32:      2     2     2     2     2     2     2     2

   40:      2     2     2     2     2     2     2     2

   48:      3     3     3     3     3     3     3     3

   56:      3     3     3     3     3     3     3     3

   64:      4     4     4     4     4     4     4     4

   72:      4     4     4     4     4     4     4     4

   80:      5     5     5     5     5     5     5     5

   88:      5     5     5     5     5     5     5     5

   96:      6     6     6     6     6     6     6     6

  104:      6     6     6     6     6     6     6     6

  112:      7     7     7     7     7     7     7     7

  120:      7     7     7     7     7     7     7     7

RSS hash key:

Operation not supported

我的 NIC 一共有 8 个队列,一共有 128 个不同的 Hash 值,上面就是列出了每个 Hash 值对应的队列是什么。最左侧 0 8 16 是为了能让你快速的找到某个具体的 Hash 值。比如 Hash 值是 76 的话我们能立即找到 72 那一行:"72: 4 4 4 4 4 4 4 4",从左到右第一个是 72 数第 5 个就是 76 这个 Hash 值对应的队列是 4

设置 8 个队列的权重。加起来不能超过 128 128 indirection table 大小,每个 NIC 可能不一样。

3.6 更改 Ring Buffer Hash Field

分配数据包的时候是按照数据包内的某个字段来进行的,这个字段能进行调整。

[root@test]$ ethtool -n em1 rx-flow-hash tcp4

TCP over IPV4 flows use these fields for computing Hash flow key:

IP SA

IP DA

L4 bytes 0 & 1 [TCP/UDP src port]

L4 bytes 2 & 3 [TCP/UDP dst port]

也可以设置 Hash 字段:查看 tcp4 Hash 字段。

ethtool -N em1 rx-flow-hash udp4 sdfn

sdfn 需要查看 ethtool 看其含义,还有很多别的配置值。

3.6 IRQ 统计

/proc/interrupts 能看到每个 CPU IRQ 统计。一般就是看看 NIC 有没有支持 multiqueue 以及 NAPI IRQ 合并机制是否生效。看看 IRQ 是不是增长的很快。

-End-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/421708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis(四)事务 multi、exec

哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮 有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。 文章目录1 前言1.1 什么是Redi…

从零开始的Web渗透:信息收集步骤详解

一、域名信息收集 1.获取域名的whois信息是、 什么是Whois Whois是一种传输协议,用于查询域名注册所有者等信息。它可以帮助您查询域名是否已被注册,以及获取有关已注册域名的详细信息,例如域名注册商和域名所有人。 早期的Whois查询通常…

Docker 部署Jira8.1.0

Jira与Confluence一样,都需要用到独立的数据库,对于数据库的安装我们不做介绍,主要介绍如何用Docker部署Jira以及对Jira进行破解的操作。 1、数据库准备 关于数据库官方文档说明:https://confluence.atlassian.com/adminjiraserv…

【Spring6】| Spring对事务的支持

目录 一:Spring对事务的支持 1. 事务概述 2. 引入事务场景 3. Spring对事务的支持 3.1 Spring实现事务的两种方式 3.2 Spring事务管理API 3.3 声明式事务之注解实现方式 3.4 事务属性 3.5 事务传播行为propagation 3.6 事务的隔离级别isolation 3.7 事务…

【Android安全】Soot 静态分析教程

参考教程 https://github.com/noidsirius/SootTutorial Windows Soot 环境配置 下载代码 git 拷贝仓库 git init git clone https://github.com/noidsirius/SootTutorial.git ./gradlew.bat build 报错:Unsupported class file major version 57 ./gradlew.b…

JDK定时/延迟任务实现原理

刚刚好点进去看了,做个笔记 先读 这样子的延迟任务代码很常见,在保持心跳、延迟确认等等场景 从源码的角度看他是怎么实现的 Testpublic void delayTest() throws InterruptedException {Executors.newScheduledThreadPool(1).schedule(() -> {System.out.println("一…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的拉普拉斯算法增强(C#)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的拉普拉斯算法增强(C#)Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合OpenCV使用图像增强算法1.引用合适的类文件2.BGAPI SDK在图像回调…

数学与应用数学有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是数学与应用数学领域的几个知名SCI期刊: Annals of Mathematics: 成立于1884年,是数学领域最古老和最著名的期刊之一,由普林斯顿大学出版。 该期刊发表了许多重要的数学成果,如Gdel不完全定理、费马大定理证明…

景点VR全景虚拟体验系统定制

为深度挖掘行业特色,利用5G、VR,AI,AR等数字化技术,为行业领域量身打造数字化解决方案已成趋势 VR内容定制可包括: VR旅游、VR展馆、VR教育、VR汽车、VR电商、VR地产等等。我们是国内较早从事沉浸式VR内容开发的企业,在…

Python将Excel文件内容写入Word文件

在日常办公中我们经常需要将Excel文件中的数据写入Word中,如果是手动一个一个进行复制粘贴,那将会非常的耗时且繁琐! 遇到这种问题我们首先想到就是利用b编程解决,今天我分享一个excel转word的小方法! 首先我有一个E…

儿童乙肝的预防和治疗,看这一篇就够了

儿童乙肝治疗应早期进行从1967年发现乙型肝炎(以下简称乙型肝炎)病毒,1969年开发乙型肝炎疫苗,到乙型肝炎治疗药物不断出现,乙型肝炎的防治取得了显著成效。目前,乙型肝炎的预防已经取得了积极的效果。儿童…

配置FTP/TFTP协议的ASPF

在多通道协议和NAT的应用中,ASPF是重要的辅助功能。通过配置ASPF功能,实现内网正常对外提供FTP和TFTP服务,同时还可避免内网用户在访问外网Web服务器时下载危险控件。 组网需求 如图1所示,FW部署在某公司的出口,公司提…

Jenkins Harbor

Harbor 环境搭建 https://github.com/goharbor/harbor/releases/tag/v2.5.6 点击下载地址安装包 安装 解压安装包 [rootlocalhost ~]# tar -zxvf harbor-offline-installer-v2.5.6.tgz -C /usr/local/修改harbor.yml配置 [rootlocalhost harbor]# cp harbor.yml.tmpl ha…

VMware vSphere中三种磁盘模式:精简置备/厚置备置零/厚置备延迟置零

在VMware vSphere中,不管是以前的5.1版本,或者是现在的6.5版本,创建虚拟机时,在创建磁盘时,都会让选择磁盘的置备类型,如下图所示,分为: Thick ProvisionedLazy Zeroed(厚置备延迟置…

从0开始使用flask搭建WEB前端可视化界面

目录1.download一个模板2.配置flask python文件3.移动模板中文件的相对位置4.修改html中的原路径5.运行与调试1.download一个模板 模板 将其中的html结尾的文件放入template文件夹,其余的放入static文件夹,再创建一个python文件使用flask,…

亚马逊云科技从成本规划,开启云财务管理之旅

亚马逊云科技的云财务管理旨在帮助企业建立一个成功的CFM战略:通过4个云财务管理CFM原则或步骤作为路线图:SEE-查看、SAVE-保存、PLAN-计划和RUN-运行。 对现有工作负载的预测和规划 1、 优化计算资源与架构:与技术业务相关部门合作&#xff…

AI数字人在VR全景中的应用有哪些?有哪些优势?

“十年生死两茫茫,不思量,自难忘”。以往我们对于逝者的怀念只限于看着老照片落泪,现如今,各种科技的发展让我们的思念有了新的承载之地。AI数字人的出现,可以为用户提供更加智能、有趣的社交体验,通过唇形…

为什么要写博客?现身说法

我为什么不想写博客? 大四学生现身说法,其实早在大二,听各种大牛说写博客的重要性,真的也很想开始动手,但两个很现实的顾虑摆在眼前: 啥都不会,写啥啊?大牛是因为有新东西可写&…

Linux学习[6]文件权限深入1

文章目录前言1. 文件的各个字段含义2. 修改文件权限3. 有点意思的东西总结前言 前六个博客是基于树莓派的linux教程书籍写的,因为之前的书籍是以树莓派为基准,所以在linux上没有很详细。这个博客开始记录的是我看书过程中遇到的有意思的,没见…

提取文本关键词?很 easy 啊,用 Python 三行搞定

从大量文本中提取有用的关键信息是数据分析的一个重要环节。 Python 作为一门广泛应用于数据分析领域的编程语言,有着强大的文本处理库。 整理了几个用于文本关键词提取的优秀工具,一起学习下。 1、jieba库 jieba 是一个中文分词库,可以将…