ethtool -g eth0 是查看当前 RX/TX 环形缓冲区大小的唯一命令,输出含 Pre-set maximums(最大支持值)和 Current hardware settings(当前生效值),RX 过小是 UDP 丢包常见硬件原因。

环形缓冲区(Ring Buffer)过小是 UDP 丢包最常被忽略的硬件层原因,ethtool -g 是唯一能直接看到它当前值和上限的命令。
怎么用 ethtool 查看当前 RX/TX 环形缓冲区大小
执行 ethtool -g eth0(把 eth0 换成你实际的网卡名),输出里有两组关键数字:
-
Pre-set maximums:网卡驱动支持的最大值,比如RX: 4096 -
Current hardware settings:当前生效值,比如RX: 256
如果当前 RX 值远低于最大值(如默认的 256 或 512),而你又在跑高吞吐 UDP 流量(比如监控上报、音视频采集),那缓冲区溢出就是大概率丢包源头。
为什么只调大 RX、基本不动 TX
UDP 接收丢包主要卡在「网卡 DMA 写入 → 内核取走」这个环节,RX Ring Buffer 就是这段流水线的暂存区。TX 缓冲区影响的是发送端排队能力,UDP 发送不依赖深度排队,且丢包极少发生在 TX 环——除非你疯狂 sendto() 超过网卡物理带宽。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 调大
TX不解决接收丢包,还可能浪费内存 - 部分万兆卡(如 ixgbe)TX 最大值虽为 4096,但设为 256 反而更稳
- 确认是否真需要改 TX:查
ethtool -S eth0 | grep tx_.*drop,若无增长,别碰
ethtool -G 设置后不生效的常见原因
ethtool -G eth0 rx 4096 执行成功不代表永久生效,也不代表马上起作用:
- 接口会短暂 down/up,期间连接中断,别在生产流量高峰跑
- 必须小于等于
Pre-set maximums中的值,硬超会报错Operation not supported - 重启后回退到默认值——没写进启动脚本或 systemd 服务就白调
- 某些发行版(如 RHEL 8+)NetworkManager 会覆盖手动设置,得用
nmcli或禁用 NM 管理该接口
环形缓冲区不是越大越好
设成 8192 看似保险,但实际可能引入新问题:
- 单个 RX Ring 占用内存翻倍(每项约 16–32 字节),多队列网卡下总开销明显
- 缓冲区过大时,内核处理延迟可能上升,对低延迟场景(如金融行情)反而不利
- 真正瓶颈有时是软中断(
NET_RX)集中在单个 CPU 核,这时光加缓冲区没用,得配ethtool -L开多队列 +irqbalance或手动绑中断
调完记得用 netstat -s -u | grep "packet received" 和 ethtool -S eth0 | grep rx_.*drop 对比前后变化——没下降,说明问题不在 Ring Buffer。










