前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >网卡的 Ring Buffer 详解

网卡的 Ring Buffer 详解

作者头像
用户1278550
发布于 2023-02-24 07:27:29
发布于 2023-02-24 07:27:29
2.1K00
代码可运行
举报
文章被收录于专栏:idbaidba
运行总次数:0
代码可运行

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 Buffer,NIC 负责将传进来的数据分配给不同的 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 网卡收到的数据包统计

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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 的统计

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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 大小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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 队列数量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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 大小:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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 函数对收到的数据包进行分发。能调整不同队列的权重,用于分配数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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 是不是增长的很快。

参考链接:

https://ylgrgyq.github.io/2017/07/23/linux-receive-packet-1/

https://heapdump.cn/article/3947686

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yangyidba 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Ubuntu20.04的主题美化
在正式开始之前先放一下效果图,当然,这里的主题是模仿了mac,,主要改了主题与图标。网上有各式各样的主题,可以根据自己的喜好来进行设置,下面正式开始
全栈程序员站长
2022/09/29
1.1K0
Ubuntu20.04的主题美化
5分钟将Ubuntu18.04美化为Mac风格
Ubuntu18.04的美化教程有很多, 但大多非常复杂,没有半小时根本折腾不完,其实美化可以很简单,找一个好的风格, 去模仿它就好了
zhaoolee
2020/02/25
1.6K0
5分钟将Ubuntu18.04美化为Mac风格
Ubuntu18.04美化_乌班图美化
和网上的美化一样,但是我当初跟着博客美化的时候遇到一些问题,按博客的做法无法解决。
全栈程序员站长
2022/11/09
2.5K0
Ubuntu18.04美化_乌班图美化
ubuntu 更换主题[通俗易懂]
sudo apt-get update sudo apt-get install gnome-tweak-tool
全栈程序员站长
2022/11/09
4.8K0
ubuntu 更换主题[通俗易懂]
Ubuntu20.04 体验和美化
windows用久了,换下系统也挺好的。ubuntu20.04优化后,用起来蛮舒服的。
Ryan-Miao
2020/10/27
2.9K0
Ubuntu20.04 体验和美化
ubuntu桌面主题更换_ubuntu18主题美化
本文针对的是ubuntu的GNOME桌面环境,根据ubuntu官方消息,ubuntu已经放弃原来的Unity桌面环境,改回最先使用的GNOME桌面环境,如果你觉得Gnome的默认桌面环境不够Fashion的话,可以下载自己喜欢的主题风格来更换,具体教程如下。
全栈程序员站长
2022/11/09
1.8K0
ubuntu桌面主题更换_ubuntu18主题美化
Ubuntu抛弃了Untiy转向Gnome,美化之路怎么办?不用怕咱一步一步大变身!
跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux 常用软件安装+系统软件卸载:http://www.cnblogs.com/du
逸鹏
2018/04/11
1.1K0
Ubuntu抛弃了Untiy转向Gnome,美化之路怎么办?不用怕咱一步一步大变身!
ubuntu 更换主题为苹果 macos
eisc
2024/12/05
2560
ubuntu 更换主题为苹果 macos
Ubuntu美化
当初倒腾 Ubuntu 18.04 的时候积攒了一些美化经验, 但是一直没有将其系统整理归纳. 暂借这次升级系统的机会, 重新记录一下 Ubuntu 的美化流程.
Erwin
2020/01/02
3.5K0
不美翻怎么开发!Ubuntu 16.04 LTS深度美化!(2017年度定稿版)
前言 本篇尝试对ubuntu 16.04 LTS进行美化和优化, 基本上就是本人长期使用的经验分享, 如有不足, 欢迎指正交流! 简单说下版本选择的原因, 没有去选择最新的版本, 而是选择了最新的长期支持版本, 也就是LTS. 但事实上, 如果你使用其它ubuntu版本, 整体处理也是大同小异. 多图预警, 然后转载请注明出处. 更新了终端美化, 让你的终端飞起来. 更新了超棒的主题和图标包. 更新了终端美化细节和其它细节. 重新整理编辑了整篇文章. ---- 外观美化 主题 主题推荐一: flat
sean_yang
2018/09/04
2.2K1
不美翻怎么开发!Ubuntu 16.04 LTS深度美化!(2017年度定稿版)
安装完Ubuntu 18.04之后要做的几件事
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u011054333/article/details/82901838
乐百川
2019/07/02
8910
安装完Ubuntu 18.04之后要做的几件事
美化ubuntu主题系统
对于ubuntu14.04来说 ubuntu-tweeks和unity-tweak-tool都可以
全栈程序员站长
2022/11/09
2K0
美化ubuntu主题系统
Ubuntu18 的超详细常用软件安装
心血来潮,在笔记本安装了Ubuntu 18 用于日常学习,于是有了下面的安装记录。
未读代码
2019/11/04
1.7K0
Ubuntu18 的超详细常用软件安装
Ubuntu美化
主题下载网站:https://www.gnome-look.org/ 进入后,你将在左上角看到所有有关主题的选项。我们要更改的主题内容主要有四项:
分享者
2022/05/17
2.3K0
Ubuntu美化
ubuntu 美化全攻略
用了好久的ubuntu,最近突发奇想想给ubuntu做做美化。说干就干。 版本: ubuntu 18.04 gnome-shell : GNOME Shell 3.28.4
超级大猪
2019/12/20
1.3K0
ubuntu 美化全攻略
Ubuntu安装主题_炫酷的Ubuntu主题
Created with Raphaël 2.1.2 开始配置主题 应用程序:优化 扩展 User Themes 外观设置:主题arc 结束
全栈程序员站长
2022/11/09
9240
Ubuntu 优化、美化(主题、终端)[通俗易懂]
安装完系统之后,需要更新一些补丁。Ctrl+Alt+T调出终端,执行一下代码: sudo apt-get update sudo apt-get upgrade
全栈程序员站长
2022/09/15
4.8K0
Ubuntu 优化、美化(主题、终端)[通俗易懂]
Ubuntu 安装后的配置及美化(一)
然后在 搜狗输入法Linux官网 下载 64位程序,解压并移动到当前目录下,执行如下指令:
希希里之海
2018/12/21
2.3K0
如何移除或禁用 Ubuntu Dock
Ubuntu Dock - 屏幕左侧栏,可用于固定应用程序或访问已安装的应用程序。使用默认的 Ubuntu 会话时,无法使用 Gnome Tweaks 禁用它(禁用无效)。但是如果你需要,还是有几种方法来摆脱它的。下面我将列出 4 种方法可以移除或禁用 Ubuntu Dock,以及每个方法的缺点(如果有的话),还有如何撤销每个方法的更改。本文还包括在没有 Ubuntu Dock 的情况下访问 活动概览(Activities Overview)和已安装应用程序列表的其它方法。
用户8639654
2021/10/25
7K0
Ubuntu 18.04 LTS快速美化
前言 之前我也写过一篇关于Ubuntu 16.04 LTS美化的. 其实大部分内容依旧实用, 不过由于Ubuntu的界面由unity变成了gnome, 所以有些小的变化. ---- gnome-tweak-tool 同样, 先要安装美化管理工具gnome-tweak-tool. 界面如下展示: sudo apt-get install gnome-tweak-tool 但是这个shell一开始是有感叹号的, 强迫症不能忍. 所以需要解决掉它: sudo apt-get install gn
sean_yang
2019/03/15
1.2K0
Ubuntu 18.04 LTS快速美化
相关推荐
Ubuntu20.04的主题美化
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 1. 网卡处理数据包流程
    • 完整流程:
  • 2. 多 CPU 下的 Ring Buffer 处理
  • 3. Ring Buffer 相关命令
  • 3.1 网卡收到的数据包统计
  • 3.2 带有 drop 字样的统计和 fifo_errors 的统计
  • 3.4 调整 Ring Buffer 队列数量
  • 3.5 调整 Ring Buffer 队列的权重
  • 3.6 更改 Ring Buffer Hash Field
  • 3.6 IRQ 统计
  • 参考链接:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档