高pps下网卡环形缓冲区过小导致rx_fifo_errors、rx_over_errors上升及rx overruns增长,应通过ethtool -g阶梯式调大rx/tx队列至硬件上限(如4096),并用systemd服务持久化配置。

在高PPS(每秒数据包数)场景下,网卡RX/TX环形缓冲区过小会导致硬件层丢包,典型表现为rx_fifo_errors、rx_over_errors持续上升,以及ifconfig中RX overruns不断增长。用ethtool -G精准调大队列深度,是零成本、见效快的核心手段。
确认是否为环形缓冲区溢出
先验证问题根源,避免误调:
- 运行
ethtool -S eth0 | grep -E "(overrun|fifo|missed|drop)",重点关注:
rx_fifo_errors或rx_over_errors:说明数据还没进驱动环形缓冲区,就被网卡FIFO硬丢弃,必须增大RX队列
rx_missed_errors:驱动取空了环形缓冲区却没及时补充新描述符,指向RX队列太小或中断处理不及时
rx_dropped非零且增长:数据已入环形缓冲区,但内核拷贝阶段因内存/调度失败丢弃,需同步查系统负载 - 同时执行
ifconfig eth0,观察RX overruns值是否随流量升高而快速增加——这是环形缓冲区不足的强信号
查看当前设置与硬件上限
执行ethtool -g eth0,输出类似:
Pre-set maximums: RX: 4096 TX: 4096
Current hardware settings: RX: 256 TX: 256
注意两点:
- Pre-set maximums是网卡硬件支持的绝对上限,不能突破;常见千兆卡多为4096,万兆卡可达8192甚至更高
- Current hardware settings是当前生效值,256在高PPS下极易溢出,尤其对UDP小包或突发流量
阶梯式安全调整RX/TX队列
不建议一步设到最大值,防止老驱动异常或内存压力突增:
- 首次尝试:
ethtool -G eth0 rx 2048 tx 2048 - 若仍有
rx_fifo_errors增长,再升至:ethtool -G eth0 rx 4096 tx 4096(多数Intel ixgbe/i40e、Mellanox ConnectX等主流卡适用) - 调整后立即用
ethtool -g eth0确认生效,并持续观察2–5分钟统计项变化 - 部分Realtek或老旧芯片可能返回
Operation not supported,需升级驱动或检查内核兼容性
让配置永久生效
ethtool -G是临时操作,重启即失效。推荐用systemd服务方式持久化:
- 创建
/etc/systemd/system/ethtool-eth0.service,内容如下:
Description=Set ring buffer for eth0
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/ethtool -G eth0 rx 4096 tx 4096
[Install]
WantedBy=multi-user.target
- 启用服务:
systemctl daemon-reload && systemctl enable --now ethtool-eth0.service - 注意:该操作会短暂闪断接口,建议安排在维护窗口执行











