0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux网卡收包流程

马哥Linux运维 来源:马哥Linux运维 2024-12-05 16:21 次阅读

Linux 网卡收包流程如下

网卡收到数据包

将数据包从网卡硬件缓存移动到服务器内存中(DMA方式,不经过CPU)

通过硬中断通知CPU处理

CPU通过软中断通知内核处理

经过TCP/IP协议栈处理

应用程序通过read()从socket buffer读取数据

9860dcb4-af11-11ef-93f3-92fbcf53809c.png

网卡丢包
我们先看下ifconfig的输出:

# ifconfig eth0
eth0: flags=4163  mtu 1500
        inet 10.5.224.27  netmask 255.255.255.0  broadcast 10.5.224.255
        inet6 fe80::5054fea4:44ae  prefixlen 64  scopeid 0x20
        ether 52:54:00:a4:44:ae  txqueuelen 1000  (Ethernet)
        RX packets 9525661556  bytes 10963926751740 (9.9 TiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8801210220  bytes 12331600148587 (11.2 TiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0Copy

登录系统底层,检查管理网网卡收发是否存在持续增长的errors包,使用命令:

# watch -n 1 "ifconfig eth0"
# watch -n 1 ip -s link show eth0
说明:watch可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令,-n或-interval来指定间隔的时间,缺省每2秒运行一下程序;eth1为网卡名称。

正常的

987770b4-af11-11ef-93f3-92fbcf53809c.png

异常的

9883d2dc-af11-11ef-93f3-92fbcf53809c.png

RX(receive) 代表接收报文, TX(transmit) 表示发送报文。

RX errors: 表示总的收包的错误数量,这包括 too-long-frames 错误,Ring Buffer 溢出错误,crc 校验错误,帧同步错误,fifo overruns 以及 missed pkg 等等。

RX dropped: 表示数据包已经进入了 Ring Buffer,但是由于内存不够等系统原因,导致在拷贝到内存的过程中被丢弃。

RX overruns: 表示 fifo 的 overruns,由于 Ring Buffer(aka Driver Queue) 传输的 IO 大于 kernel 能够处理的 IO 导致的,而 Ring Buffer 则是指在发起 IRQ 请求之前的那块 buffer。很明显,overruns 的增大意味着数据包没到 Ring Buffer 就被网卡物理层给丢弃了,CPU 无法及时的处理中断是造成 Ring Buffer 满的原因之一,可能原因是因为 interruprs 分布的不均匀,没有做 affinity 而造成的丢包。

RX frame: 表示 misaligned 的 frames。

dropped 与 overruns 的区别:

dropped,表示这个数据包已经进入到网卡的接收缓存 fifo 队列,并且开始被系统中断处理准备进行数据包拷贝(从网卡缓存 fifo 队列拷贝到系统内存),但由于此时的系统原因(比如内存不够等)导致这个数据包被丢掉,即这个数据包被 Linux 系统丢掉。

overruns,表示这个数据包还没有被进入到网卡的接收缓存 fifo 队列就被丢掉,因此此时网卡的 fifo 是满的。为什么 fifo 会是满的?因为系统繁忙,来不及响应网卡中断,导致网卡里的数据包没有及时的拷贝到系统内存, fifo 是满的就导致后面的数据包进不来,即这个数据包被网卡硬件丢掉。所以,如果遇到 overruns 非0,需要检测cpu负载与cpu中断情况。

环形队列Ring Buffer溢出
当网卡的缓存区(ring buffer)设置的太小。网络数据包到达(生产)的速率快于内核处理(消费)的速率时, Ring Buffer 很快会被填满,新来的数据包将被丢弃。
通过 ethtool 或 /proc/net/dev 可以查看因Ring Buffer满而丢弃的包统计

[root@xxx ~]# ethtool -S ens2 | grep fifo
     rx_fifo_errors: 0
     tx_fifo_errors: 0
[root@xxx ~]# cat /proc/net/dev | grep ens2
  ens2:  659229    8107    0    0    0     0          0         0   249827    2833    0    0    0     0       0          0

可以通过ethtool 设置ring buffer 的缓冲区大小

# 修改网卡eth0接收与发送硬件缓存区大小
$ ethtool -G eth0 rx 4096 tx 4096
Pre-set maximums:
RX:     4096   
RX Mini:    0
RX Jumbo:   0
TX:     4096   
Current hardware settings:
RX:     4096   
RX Mini:    0
RX Jumbo:   0
TX:     4096

中断过程中的问题

什么是中断
中断有两种:一种硬中断;一种软中断。硬中断是由硬件产生的,比如,像磁盘,网卡,键盘;软中断是由当前正在运行的进程所产生的。

硬中断,是一种由硬件产生的电信号直接发送到中断控制器上,然后由中断控制器向 CPU 发送信号,CPU 检测到该信号后,会中断当前的工作转而去处理中断。然后,处理器会通知内核已经产生中断,这样内核就会对这个中断进行适当的处理。

当网卡收到数据包时会产生中断请求(硬中断)通知到 CPU,CPU 会中断当前正在运行的任务,然后通知内核有新数据包,内核调用中断处理程序(软中断)进行响应,把数据包从网卡缓存及时拷贝到内存,否则会因为缓存溢出被丢弃。剩下的处理和操作数据包的工作就会交给软中断。

什么是多队列网卡
当网卡不断的接收数据包,就会产生很多中断,一个中断请求只能被一个CPU处理, 而现在的机器都是用多个CPU,同时只有一个 CPU 去处理 Ring Buffer 数据会很低效,这个时候就产生了叫做 Receive Side Scaling(RSS) 或者叫做 multiqueue 的机制来处理这个问题, 这就是为啥需要多队列的原因。

RSS(Receive Side Scaling)是网卡的硬件特性,实现了多队列。通过多队列网卡驱动加载,获取网卡型号,得到网卡的硬件 queue 的数量,并结合 CPU 核的数量,最终通过 Sum=Min(网卡 queue,CPU core)得出所要激活的网卡 queue 数量。

NIC 收到 Frame 的时候能通过 Hash Function 来决定 Frame 该放在哪个 Ring Buffer 上,触发的 IRQ 也可以通过操作系统或者手动配置 IRQ affinity 将 IRQ 分配到多个 CPU 上。这样 IRQ 能被不同的 CPU 处理,从而做到 Ring Buffer 上的数据也能被不同的 CPU 处理,从而提高数据的并行处理能力。

RSS 除了会影响到 NIC 将 IRQ 发到哪个 CPU 之外,不会影响别的逻辑。

什么是RPS
Receive Packet Steering(RPS) 是在 NIC 不支持 RSS 时候在软件中实现 RSS 类似功能的机制。其好处就是对 NIC 没有要求,任何 NIC 都能支持 RPS,但缺点是 NIC 收到数据后 DMA 将数据存入的还是一个 Ring Buffer,NIC 触发 IRQ 还是发到一个 CPU,还是由这一个 CPU 调用 driver 的 poll 来将 Ring Buffer 的数据取出来。RPS 是在单个 CPU 将数据从 Ring Buffer 取出来之后才开始起作用,它会为每个 Packet 计算 Hash 之后将 Packet 发到对应 CPU 的 backlog 中,并通过 Inter-processor Interrupt(IPI) 告知目标 CPU 来处理 backlog。后续 Packet 的处理流程就由这个目标 CPU 来完成。从而实现将负载分到多个 CPU 的目的。通常如果开启了RPS会加重所有 CPU 的负担.

IRQ 中断请求 亲和绑定
/proc/interrupts 文件中可以看到各个 CPU 上的中断情况。

/proc/irq/[irq_num]/smp_affinity_list 可以查看指定中断当前绑定的 CPU。

可以通过配置 IRQ affinity 指定 IRQ 由哪个 CPU 来处理中断, 先通过 /proc/interrupts 找到 IRQ 号之后,将希望绑定的 CPU 号写入 /proc/irq/IRQ_NUMBER/smp_affinity,写入的是 16 进制的 bit mask。比如看到队列 rx_0 对应的中断号是 41 那就执行:

echo 6 > /proc/irq/41/smp_affinity
6 表示的是 CPU2 和 CPU1

0 号 CPU 的掩码是 0x1 (0001),1 号 CPU 掩码是 0x2 (0010),2 号 CPU 掩码是 0x4 (0100),3 号 CPU 掩码是 0x8 (1000) 依此类推。

softirq 数统计
通过 /proc/softirqs 能看到每个 CPU 上 softirq 数量统计:

cat /proc/softirqs
                    CPU0       CPU1       
          HI:          1          0
       TIMER: 1650579324 3521734270
      NET_TX:   10282064   10655064
      NET_RX: 3618725935       2446
       BLOCK:          0          0
BLOCK_IOPOLL:          0          0
     TASKLET:      47013      41496
       SCHED: 1706483540 1003457088
     HRTIMER:    1698047   11604871
         RCU: 4218377992 3049934909

NET_RX 表示网卡收到包时候触发的 softirq,一般看这个统计是为了看看 softirq 在每个 CPU 上分布是否均匀,不均匀的话可能就需要做一些调整。比如上面看到 CPU0 和 CPU1 两个差距很大,原因是这个机器的 NIC 不支持 RSS,没有多个 Ring Buffer。开启 RPS 后就均匀多了。

如何开启RPS
RPS 默认是关闭的,当机器有多个 CPU 并且通过 softirqs 的统计 /proc/softirqs 发现 NET_RX 在 CPU 上分布不均匀或者发现网卡不支持 mutiqueue 时,就可以考虑开启 RPS。

开启 RPS 需要调整 /sys/class/net/DEVICE_NAME/queues/QUEUE/rps_cpus 的值。比如执行:

echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus
表示的含义是处理网卡 eth0 的 rx-0 队列的 CPU 数设置为 f 。即设置有 15 个 CPU 来处理 rx-0 这个队列的数据,如果你的 CPU 数没有这么多就会默认使用所有 CPU 。

netdev_max_backlog调优
netdev_max_backlog 是内核从 NIC 收到包后,交由协议栈(如 IP、TCP )处理之前的缓冲队列, 通过softnet_stat可以确定是否发生了netdev backlog队列溢出

[root@xxx ~]# cat /proc/net/softnet_stat
000000bf 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000028 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
000000c7 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000031 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
000021d8 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000929 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

C#复制全屏

每一行代表每个 CPU 核的状态统计,从 CPU0 依次往下。 每一列代表一个 CPU 核的各项统计:第一列代表中断处理程序收到的包总数;第二列即代表由于 netdev_max_backlog 队列溢出而被丢弃的包总数。 第3列表示软中断一次取走netdev_budget个数据包,或取数据包时间超过2ms的次数。 第4~8列固定为0,没有意义。 第9列表示发送数据包时,对应的队列被锁住的次数。

netdev_max_backlog 的默认值是 1000,我们可以修改内核参数来调优:

sysctl -w net.core.netdev_max_backlog=2000

链接:https://www.cnblogs.com/OpenSourceSite/p/18121680

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11292

    浏览量

    209317
  • 网卡
    +关注

    关注

    4

    文章

    307

    浏览量

    27374

原文标题:Linux之网络排错

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RZ T2H PCIe裸机程序开发和Linux下的配置介绍

    ,还提供2个PCIe Gen3通道等高速外设。本文主要介绍PCIe外设的功能、裸机下EP模式的程序开发、以及在Linux下,如何编译网卡流程
    的头像 发表于 12-18 11:14 399次阅读
    RZ T2H PCIe裸机程序开发和<b class='flag-5'>Linux</b>下的配置介绍

    linux网卡配置文件

    网卡配置文件     网卡目录[root@localhost opt]# ls /etc/sysconfig/network-scripts/网卡文件名字,和我们ifconfig看到的一样
    的头像 发表于 12-10 10:09 196次阅读

    网卡的演进和应用

    随着云计算和虚拟化技术的发展,网卡在功能和硬件结构方面也经历了四个阶段,即网卡、智能网卡、基于FPGA的DPU和DPU SoC网卡。本文将重点介绍这些不同类型的网络适配器和处理器,在硬
    的头像 发表于 10-24 16:45 312次阅读
    <b class='flag-5'>网卡</b>的演进和应用

    服务器网卡和普通网卡区别

    处理能力 服务器网卡具有更强的处理能力,可以处理更复杂的网络协议和数据。普通网卡的处理能力相对较弱。 1.3 延迟 服务器网卡的延迟通常较低,这对于需要快速响应的应用程序非常重要。
    的头像 发表于 10-10 16:37 413次阅读

    Linux网络协议栈的实现

    请求并与底层的网络硬件进行交互。本文将深入探讨 Linux 网络协议栈的架构与实现,涵盖数据处理流程、关键模块、协议栈层次以及性能优化等方面。
    的头像 发表于 09-10 09:51 298次阅读
    <b class='flag-5'>Linux</b>网络协议栈的实现

    Linux启动流程基本分析

    Linux启动流程总的来说可以分成三个阶段 Linux启动流程图   第一步:上电 Ø在 x86 系统中,将 1M 空间最上面的 0xF0000 到 0xFFFFF 这 64K 映射给
    的头像 发表于 05-11 08:49 661次阅读
    <b class='flag-5'>Linux</b>启动<b class='flag-5'>流程</b>基本分析

    电池生产的工艺流程

    电池,又称为聚合物锂离子电池,其生产工艺流程相对复杂,涉及到多个精细的步骤。
    的头像 发表于 05-07 11:19 2605次阅读

    门禁物联网卡的使用与管理

    门禁物联网卡,作为现代门禁系统的重要组件,它使得门禁系统能够与网络相连,从而实现远程监控、数据记录、智能控制等多种功能。那么,门禁物联网卡究竟如何使用呢?本文将详细解析门禁物联网卡的使用步骤
    的头像 发表于 04-11 16:51 575次阅读
    门禁物联<b class='flag-5'>网卡</b>的使用与管理

    网卡揭秘:如何选择适合您需求的网卡

    网卡(Network Interface Card,NIC),也称网络适配器,是连接计算机与网络的硬件设备。在光通信系统中,网卡特指光纤网卡,它通过光纤接口与外部网络通信,传输数据。早期的网卡
    的头像 发表于 04-10 10:04 697次阅读
    光<b class='flag-5'>网卡</b>揭秘:如何选择适合您需求的<b class='flag-5'>网卡</b>

    Linux常用网络命令介绍

    默认使用该命令会一直发送ICMP直到用户手动中止,可以使用-c命令指定发送数据的个数,使用-W指定最长等待时间,如果有多张网卡,还可以通过-I指定发送
    发表于 03-25 14:45 457次阅读
    <b class='flag-5'>Linux</b>常用网络命令介绍

    linux怎么查看网卡光功率?

    linux怎么查看网卡光功率? 在Linux系统中,可以使用一些命令和工具来查看网卡光功
    的头像 发表于 01-31 14:24 3580次阅读

    RZ/G验证的Linux软件V2.1.20-RT 修补程序应用指南

    电子发烧友网站提供《RZ/G验证的Linux软件V2.1.20-RT 修补程序应用指南.pdf》资料免费下载
    发表于 01-03 14:12 0次下载
    RZ/G验证的<b class='flag-5'>Linux</b>软件<b class='flag-5'>包</b>V2.1.20-RT 修补程序应用指南

    RZ/G验证的Linux软件V2.1.20-RT组件列表

    电子发烧友网站提供《RZ/G验证的Linux软件V2.1.20-RT组件列表.pdf》资料免费下载
    发表于 01-03 14:11 0次下载
    RZ/G验证的<b class='flag-5'>Linux</b>软件<b class='flag-5'>包</b>V2.1.20-RT组件列表

    RZ/G验证的Linux软件V2.1.20-RT 发布说明

    电子发烧友网站提供《RZ/G验证的Linux软件V2.1.20-RT 发布说明.pdf》资料免费下载
    发表于 01-03 10:11 0次下载
    RZ/G验证的<b class='flag-5'>Linux</b>软件<b class='flag-5'>包</b>V2.1.20-RT 发布说明

    网卡硬件故障及解决方法

    网卡硬件故障及解决方法 网卡是计算机与网络之间进行通信的重要组件之一。然而,由于各种原因,网卡硬件故障可能会导致计算机无法连接到网络或者网络连接缓慢不稳定。本文将介绍常见的网卡硬件故障
    的头像 发表于 12-27 15:17 3469次阅读