先运行ethtool -g eth0查看当前值和硬件上限:pre-set maximums行显示驱动允许的最大rx/tx值(如4096),current hardware settings行显示当前生效值(如256),二者单位均为描述符数,不可超限。

怎么用 ethtool -g 确认当前值和硬件上限
直接运行 ethtool -g eth0(把 eth0 换成你的网卡名),输出里关键看两行:
-
Pre-set maximums: RX: 4096 TX: 4096—— 这是驱动允许的最大值,不能超,否则报错Operation not supported -
Current hardware settings: RX: 256 TX: 256—— 这是当前生效值,Intel igb 千兆卡默认常为 256,对高并发或小包场景明显偏小
注意:部分虚拟网卡(如 veth)或老旧 Realtek 芯片不支持该参数,执行会静默失败或报错,不是权限问题,是驱动不实现。
怎么用 ethtool -G 安全调整 RX 缓冲区
RX 是丢包主因,TX 一般不用动;调整会短暂中断接口,建议在低峰期操作:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 先试
ethtool -G eth0 rx 2048,观察几分钟ethtool -S eth0 | grep rx_missed_errors是否停止上涨 - 仍有丢包且
Pre-set maximums允许,再升到ethtool -G eth0 rx 4096 - 不要一步设到最大值——过大的 RX 值会增加 CPU cache miss,对低延迟服务反而引入抖动
- 某些万兆卡(如 X710)固件版本限制实际最大为 2048,即使
ethtool -g显示 4096 也设不上去,需查对应驱动文档
为什么调了 ethtool -G 还是丢包?内核队列必须同步调
Ring Buffer 只管“网卡 DMA 写入”这一跳,后面还有两道关卡:
-
net.core.netdev_max_backlog必须 ≥ RX 值,否则软中断处理队列溢出,命令:sysctl -w net.core.netdev_max_backlog=30000 -
net.core.rmem_max要够大,否则应用层setsockopt(SO_RCVBUF)会被静默截断,建议设为26214400(25 MB) - 若
netstat -s | grep UdpOverflows在涨,说明 socket 接收队列满了,和 Ring Buffer 无关,得从应用层 recv 频率或SO_RCVBUF设置入手
怎么验证是否真生效、不白调
别只信 ethtool -g 输出的数字,要盯运行时指标:
- 用
watch -n1 'ethtool -S eth0 | grep -E "rx_missed|rx_over|rx_fifo"'看计数器是否停涨 - 检查
cat /proc/interrupts | grep eth0,若某 CPU 核软中断长期 >90%,说明单核处理不过来,Ring Buffer 再大也没用,得配 RPS 或 RSS - 用
ss -nump | grep udp看 skmem 中rb字段是否接近你设的SO_RCVBUF值,否则上层没接住
临时命令重启就失效,/etc/sysctl.conf 里固化参数,但 ethtool -G 必须写进网络启动脚本(如 /etc/network/if-up.d/)或 udev rule 才能持久。










