ethtool -g 只显示不修改,因其为只读命令;真正修改需用大写 -g(如 ethtool -g eth0 rx 4096),且部分驱动要求先 down 网卡,改后需用 -g 验证,若报 “operation not supported” 则驱动不支持调整。

直接运行 ethtool -g eth0,输出中 “Current hardware settings” 下的 RX 值就是当前生效的环形缓冲区深度,单位是描述符数量,不是字节。
为什么 ethtool -g 只显示不修改?
很多人输完 ethtool -g eth0 rx 4096 没反应,是因为 -g 是只读命令——它没有写入能力。真正修改要用大写的 -G(ethtool -G eth0 rx 4096)。大小写输错是最常见的卡点,命令静默失败且无提示。
-
ethtool -g eth0:纯查看,安全,无需 down 网卡 -
ethtool -G eth0 rx 4096:修改命令,部分驱动(如e1000e)要求先ip link set eth0 down,改完再up - 执行后必须再次跑
ethtool -g eth0验证,不能只信返回无报错
看到 Operation not supported 怎么办?
不是权限或拼写问题,而是网卡驱动根本不支持 ring buffer 调整。典型场景包括:
- 虚拟网卡(如
veth、virtio_net),ethtool -S eth0可能连统计都为空 - 老旧或精简驱动(某些嵌入式平台的定制内核)
- 部分 USB 网卡或 Realtek RTL81xx 系列,硬件层面未暴露该接口
此时 ethtool -g eth0 会直接报 Cannot get device ring settings: Operation not supported,不用再试 -G。
RX 值为 256 或 512 就一定小吗?
不一定。默认值本身不说明问题,关键看丢包指标是否在涨:
- 查溢出信号:
ethtool -S eth0 | grep -i "rx_missed_errors\|rx_fifo_errors"—— 这两个值持续上升,才是 Ring Buffer 不够用的铁证 -
ifconfig eth0输出里的RX-DRP或overruns上升,只是结果,无法定位到是 Ring Buffer 溢出还是 SKB 分配失败 - 别只盯着
ethtool -g的Max行——Intel X710 卡标称最大 4096,但固件版本旧可能实际只允许设到 2048
调大后还是丢包?别只盯 ethtool -G
Ring Buffer 只管“网卡 DMA 写入”这一跳。即使 rx_missed_errors 归零,丢包还可能卡在后面两处:
- 内核软中断队列满:
cat /proc/net/softnet_stat第二列(dropped)上涨,说明包进了 Ring Buffer,但 CPU 没来得及处理 - 应用层接收队列溢出:
netstat -s | grep UdpOverflows在涨,和 Ring Buffer 无关,得调net.core.rmem_max或加快recvfrom频率 - 单核瓶颈:
cat /proc/interrupts | grep eth0显示中断全集中在某一个 CPU 核,需开 RSS 或 RPS 分流
真实环境里,ethtool -G 往往只是调优链条的第一步,不是万能解药。最容易被忽略的是:改完 rx 值后,没同步调大 net.core.netdev_max_backlog,导致软中断队列立刻成为新瓶颈。











