Linux网卡丢包分类整理(1)——网卡篇

网卡丢包怎么办?或者再具体点,使用ifconfig查看网卡,发现有dropped统计时可以从哪些方面进行调查?要想知道为什么丢包,首先要弄清楚接收数据包的流程。

一. 收包模块间的关系

Linux系统从网卡收到数据包到最终上层应用处理之间涉及到多个模块,包括物理硬件、驱动、缓存队列、内核、再到应用程序。如下图,其中任一模块出问题都有可能导致网卡丢包。

二. 数据包接收流程

如上图,接收数据包会遵循硬件(device)->内核(kernel)->用户态应用(user)这一处理流程。

1. 数据包到达网卡(物理硬件)时,对数据包进行CRC校验,如果校验无误,就把帧头去掉,把数据包拷贝(DMA)到内存的ringbuffer中,然后网卡会向cpu发送一个irq硬中断,cpu在收到硬中断后会通知驱动处理数据。

2. 驱动收到cpu的通知,会开启NAPI(一种轮询机制,能够避免频繁触发中断),然后发出软中断。软中断会触发ksoftirqd内核线程进行数据处理,ksoftirqd会将数据包封装为skb结构,然后上送到内核协议栈。

3. 协议栈分层对数据进行解析,如解析以太头、IP头、TCP/UDP头等,随后将数据拷贝到socket buffer中。

4. 用户态应⽤程序从socket buffer 中读取数据,进行业务处理。

三. 丢包分析思路

可以了解到接收数据包主要会涉及⽹卡设备、⽹卡驱动、内核协议栈三⼤类。排查丢包原因也要从这三类入手。

四. 硬件网卡丢包

1. Ring Buffer溢出

1) 数据帧由物理介质到达网卡(NIC)后,首先会写入设备内部缓冲区Ring Buffer中,再向cpu发送硬中断。

2) cpu收到硬中断后通知网卡驱动,驱动程序触发Softirq,由ksoftirqd内核线程从Ring Buffer中消费数据。

Ring Buffer的大小因网卡设备而异。当网络数据包到达(生产)的速率快于内核处理(消费)的速率时,Ring Buffer很快会被填满,新来的数据包将被丢弃。

查看方式

通过ethtool或/proc/net/dev可以查看因Ring Buffer满而丢弃的包统计,在统计项中以fifo标识:

ethtool -S ens5f0 | grep rx_fifo

cat /proc/net/dev

 查看网卡Ring Buffer最大值和当前设置

ethtool -g ens5f0

 

解决方案

修改网卡接收与发送硬件缓存区大小

ethtool -G ens5f0 rx 4096 tx 4096

2. 网卡端口协商丢包

接收设备的网卡会和与之相连的另一块网卡协商传输速率,正常情况下,两端的传输速率硬相同,但仍有可能出现两端速率不一致的情况。

查看方式

使用ethtool查看网卡配置状态:

ethtool ens5f0

 黄色框中为传输速率,红色框为是否开启自动协商。

解决方案

  • 重新自协商:
ethtool -r ens5f0;
  • 如果上游不支持自协商,可以强制设置端口速率:
ethtool -s ens5f0 speed 1000 duplex full autoneg off

3. 网卡流控丢包

查看方式

1) 查看流控统计:

ethtool -S ens5f0 | grep control

rx_flow_control_xon是在网卡的RX Buffer满或其他网卡内部的资源受限时,给交换机端口发送的开启流控的pause帧计数。对应的,tx_flow_control_xoff是在资源可用之后发送的关闭流控的pause帧计数。 

2) 查看网络流控配置:

ethtool -a ens5f0

解决方案

关闭网卡流控

ethtool -A ethx autoneg off //自协商关闭
ethtool -A ethx tx off //发送模块关闭
ethtool -A ethx rx off //接收模块关闭

4. CRC校验错误

查看方式

查看crc校验统计:

ethtool -S ens5f0 | grep crc_errors

 解决方案

一般试着重新插拔一下网线,或者换一根网线,排查插口是否符合端口规格等。

5. 报文长度丢包

网卡有接收正确报文长度范围,一般正常以太网报文长度范围:64-1518,发送端正常情况会填充或者分片来适配,偶尔会发生一些异常情况导致发送报文不正常丢包。

查看方式

ethtool -S ens5f0|grep length_errors

解决方案

1 调整接口MTU配置,是否开启支持以太网巨帧;

2 发送端开启PATH MTU进行合理分片;

### TCP丢包率检测工具与方法 在Linux环境中,可以通过多种方式来测试TCP协议的丢包率。以下是几种常见的工具和方法: #### 使用 `ping` 和 `tcpping` 虽然传统的 `ping` 命令主要用于ICMP数据包的往返时间测量,但它并不适用于TCP协议。因此可以使用专门针对TCP的工具——`tcpping` 来替代。 要安装并运行 `tcpping` 脚本,需先完成以下准备工作: - 安装依赖项 `tcptraceroute` 和 `bc`[^1]。 - 下载 `tcpping` 脚本文件,并赋予其可执行权限。 通过该脚本发送指定数量的数据包至目标服务器端口,统计成功连接次数以及失败次数即可计算出丢包率。 ```bash ./tcpping.sh www.example.com 80 100 ``` 上述命令表示向www.example.com 的HTTP服务发起一百次尝试连接请求,最后会显示成功率百分比从而间接反映丢失比例情况。 #### 利用Netperf/Netcat组合方案 另一种更为精确的方法是借助于性能评估套件 Netperf 或者简单实用型程序 netcat (nc) 实现自定义客户端和服务端之间的通信交互过程来进行更细致入微地观察分析整个链路上是否存在异常状况发生。 对于netcat而言,则可通过如下操作步骤达成目的: 创建监听进程等待来自外部访问的同时记录日志以便后续审查是否有中断现象存在; ```bash nc -lvp 12345 > output.log & ``` 与此同时,在另一台机器上启动主动发起连续不断地写入动作直到满足预设条件为止: ```bash while true; do echo "test message" | nc target_ip_address 12345 ; sleep interval_time_in_seconds; done ``` 之后可以根据实际需求调整参数设置比如改变休眠间隔长短或者限定循环总轮数等等进一步获取更加详尽的结果用于判断当前网络环境质量水平如何变化趋势怎样发展等问题解答提供依据支持[^2]. #### 配置Tc模拟真实世界中的丢包情景 如果想人为制造一些特定条件下才会显现出来的潜在隐患的话那么就可以利用Linux自带的强大功能模块traffic control即简称tc来做相应的设定处理工作啦! 例如下面这条指令就是用来给网卡eth0增加一个固定的延时效果同时还附加有一定概率随机发生的丢弃事件的发生几率配置选项说明文档里都有详细介绍哦记得查阅官方手册学习更多高级玩法技巧哈😊 ```bash sudo tc qdisc add dev eth0 root netem loss 0.5% delay 100ms ``` 此命令设置了100毫秒固定延迟加上0.5%的数据包丢失比率仿照现实生活中可能出现的各种复杂情形供开发者们调试验证算法有效性之用处多多呢😄[^4] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高晓伟_Steven

相逢即是有缘,动力源于金钱。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值