

skb缓冲区丢包的三大核心原因:
一、RingBuffer skb分配失衡
1、驱动层:硬件缓冲区溢出(RX_OVERRUNS)
● cat /proc/net/dev 关注fifo字段是否存在持续增长,代表硬件缓冲区存在溢出

● ifconifg关注 rx_overruns 指标,也代表硬件缓冲区溢出

2、skb 分配失败(RX_DROPPED)
cat /proc/net/dev 查看 drops
或者 dmesg | grep -i ‘skb allocation failed’
二、内核层:队列与软中断处理瓶颈
1、接收队列溢出(Softnet Backlog)
cat /proc/net/softnet_stat
行:CPU0~CPU7 ,列:第二列代表backlog溢出丢包数的增加。

2、软中断处理不足(NET_RX_SOFTIRQ 瓶颈)
netdev_budget(默认值为 300)限制了单次软中断处理的最大 skb 数量。
cat /proc/sys/net/core/netdev_budget

如果这个值设置得过小,软中断在一次处理中所能处理的 skb 数量就会受限,导致大量 skb 滞留队列。随着滞留 skb 的增多,网络延迟会不断升高,重传机制也会频繁触发,最终可能引发丢包。
mpstat -P ALL 1 查看系统中单核软中断(si%)的使用情况

如果单核软中断长期高于 50%,就说明软中断处理能力不足,可能存在 NET_RX_SOFTIRQ 瓶颈,需要对netdev_budget参数进行适当调整 。
三、硬件层:多核 CPU 中断负载不均
在硬件层,多核 CPU 的中断负载不均是导致 skb 缓冲区丢包的另一个关键因素,主要体现在 RSS 队列未启用和中断亲和性配置错误两个方面。
Linux skb丢包根源分析
267

被折叠的 条评论
为什么被折叠?



