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进行合理分片;

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于 Linux 中的 br0 网卡丢包的问题,有几个常见的可能原因和解决方法: 1. 网络拓扑问题:确保所有连接到 br0 网桥的物理网卡都正常工作,并且没有任何硬件故障。检查物理网卡的状态和链路是否稳定。 2. MTU 设置问题:br0 网桥上的 MTU 设置可能导致丢包。请确保所有连接到 br0 的物理网卡以及 br0 本身的 MTU 设置一致,通常为1500字节。可以使用 ifconfig 命令检查和设置 MTU。 示例命令: ``` ifconfig br0 mtu 1500 ``` 3. 网桥配置问题:检查 br0 网桥的配置文件,确保没有配置错误或冲突。可以使用以下命令编辑配置文件(假设使用的是 vim): ``` sudo vim /etc/network/interfaces ``` 确认配置是否正确,然后重启网络服务以使更改生效: ``` sudo service networking restart ``` 4. 内核参数调整:有时需要调整一些内核参数来优化网桥性能。可以尝试调整以下参数:net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables、net.bridge.bridge-nf-call-arptables。将这些参数设置为0以禁用它们,然后重新启动网络服务。 示例命令: ``` sudo sysctl -w net.bridge.bridge-nf-call-iptables=0 sudo sysctl -w net.bridge.bridge-nf-call-ip6tables=0 sudo sysctl -w net.bridge.bridge-nf-call-arptables=0 sudo service networking restart ``` 如果以上方法都无效,可能需要进一步调查问题。可以分析网络流量、查看系统日志等来获取更多信息,并在需要时咨询网络管理员或社区支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

高晓伟_Steven

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

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

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

打赏作者

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

抵扣说明:

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

余额充值