rx_no_buffer_count 是网卡驱动因 rx ring buffer 无空闲描述符而丢弃接收包的计数,增长表明内核/驱动层软丢包,主因是 ring 深度不足、中断处理延迟或 NAPI 轮询跟不上流量。
rx_no_buffer_count 是什么,为什么它增长说明丢包
rx_no_buffer_count 是网卡驱动在接收数据包时,发现 rx ring buffer 中没有空闲描述符(即没有可用的 skb 或 page 缓冲区)而被迫丢弃的数据包计数。它不等于「物理线缆丢包」,而是内核/驱动层因资源不足导致的软丢包。
这个值持续上涨,基本意味着当前 rx ring 深度不够、中断处理不及时、或 NAPI 轮询跟不上流量节奏。常见于高吞吐(如 10G+)、小包(64B)、或 CPU 调度受限(比如绑核不当、软中断集中在一个 CPU)场景。
如何确认 rx ring 当前大小并安全调大
用 ethtool -g 查看和设置 ring buffer 大小。注意:不是所有驱动都支持动态调整,且最大值受硬件和驱动限制(例如 ixgbe 支持最大 4096,igb 通常上限 2048)。
- 先查当前配置:
ethtool -g eth0 - 尝试增大(以 ixgbe 卡为例):
ethtool -G eth0 rx 4096(需 root 权限) - 增大后务必验证:
ethtool -g eth0看是否生效;再观察ethtool -S eth0 | grep rx_no_buffer_count是否停止上涨 - 某些驱动(如 vmxnet3)不支持
ethtool -G,只能通过模块参数(如ring_size=4096)或 guest 内核启动参数调整
光调大 rx ring 不够:还要配好中断与 NAPI 行为
ring buffer 只是第一环。如果软中断(softirq)处理不过来,即使 buffer 很大,也会反复填满又来不及消费,最终仍触发 rx_no_buffer_count 增长。