ethtool:查/调网卡 ring、中断合并与 offload
更新时间:2026-09-19。ethtool 是查看和调整有线网卡参数的瑞士军刀。链路速率、驱动错误计数、队列/ring 大小、中断频率、各种硬件卸载(offload)都靠它。相关:网卡中断分布见多队列 RSS,内核侧丢包见 dropwatch。
一、基础信息与统计
ethtool eth0 # 链路状态:速率(1000/10000)、双工(Full)、Link detected
ethtool -i eth0 # 驱动/固件版本(排查驱动 bug 先看)
ethtool -S eth0 # 网卡私有计数器:rx_dropped、rx_missed_errors、fifo 等
ethtool -d eth0 # 寄存器 dump(高级排障)ethtool -S | grep -iE 'drop|miss|err|fifo' 是判断「丢包发生在网卡硬件/驱动层还是进栈后」的关键:这里涨说明 ring 溢出或硬件问题,应与 netstat/softnet 对照。
二、多队列(RSS)
ethtool -l eth0 # 查看支持/当前队列数(Pre-set/Current)
ethtool -L eth0 combined 8 # 设置收发合一队列数(一般对齐参与收包的核数)队列数决定 RSS 能把中断散到多少 CPU。队列开了但中断没散开要查 /proc/interrupts 和亲和性,见 RSS 与中断绑核。
三、Ring Buffer:接收突发缓冲
ethtool -g eth0 # 当前/最大 RX/TX ring 描述符数
ethtool -G eth0 rx 4096 tx 4096 # 调大 ring(不能超过 Pre-set 最大值)ring 是网卡和驱动之间的描述符队列。突发流量下若软中断来不及收包、ring 被填满,新报文被丢(ethtool -S 的 rx_missed/discards 上涨)。适当调大 RX ring 可吸收突发,但会增加延迟和内存——吞吐优先调大、低延迟优先适中。根治还要提升收包处理能力(多核 RSS、减少软中断占用)。
四、中断合并(coalescence)
ethtool -c eth0 # 查看:rx-usecs、rx-frames、adaptive-rx
ethtool -C eth0 rx-usecs 50 # 最多等 50 微秒聚合一次中断
ethtool -C eth0 adaptive-rx on # 自适应(内核按流量动态调,常用)中断合并让网卡攒一批报文再发一次硬中断:rx-usecs 是时间窗、rx-frames 是报文数。合并大 → 中断少、CPU 省、吞吐高,但单包延迟增加;合并小/关闭 → 延迟低、中断频繁、CPU 高。 多数场景用 adaptive-rx/tx on 让驱动自适应;HFT 等极低延迟场景才手动关小。
五、硬件卸载(offload)开关
ethtool -k eth0 # 查看所有 offload 状态(on/off)
ethtool -K eth0 tso on gso on gro on lro off # 逐项设置| 特性 | 作用 | 注意 |
|---|---|---|
| TSO/UFO | 网卡分段大包,降低 CPU | 抓包看到超大帧是 TSO 正常现象 |
| GSO/GRO | 分段/接收聚合(软件/通用) | 提升吞吐 |
| LRO | 激进的接收聚合 | 可能破坏端到端,虚拟化/转发场景常关 |
| checksum offload | 网卡算校验和 | 抓包看到错误 checksum 多是 offload 假象 |
| VLAN/encap | VLAN/VXLAN 卸载 | overlay 网络关注 |
虚拟化/容器桥接、做精细抓包或遇到奇怪的包损坏时,常临时关 gro/lro/tso 验证是否 offload 引起;物理高吞吐一般保持开启。
六、调整持久化
ethtool 的修改重启/网卡重载后失效,持久化要写到:/etc/network/if-up.d/ 脚本、NetworkManager dispatcher、systemd-networkd 的 LinkRequiredOnline/udev 规则或发行版网络配置(如 RHEL 的 ifcfg ETHTOOL_OPTS)。云环境部分参数受虚拟网卡/宿主机限制,改不动属正常。
坑
- 抓包发现 checksum 错误或 >MTU 大帧就以为网络坏了,多半是 TSO/checksum offload 在抓包点尚未处理。
- ring 一味调大:延迟和内存上升,真正瓶颈(单核软中断)没解决。
- 关闭中断合并追求低延迟,结果高 PPS 下硬中断风暴把 CPU 打满。
- 改完不持久化,重启后参数丢失。
- 队列调大但中断仍绑在单核,吞吐没有提升。
总结
ethtool 用 ethtool/-S 查链路与驱动丢包计数、-l/-L 管多队列 RSS、-g/-G 调收发 ring 以吸收突发、-c/-C 控制中断合并在吞吐与延迟间权衡、-k/-K 切换 TSO/GRO/LRO/checksum 等硬件卸载;排障路径是先看 -S 判断丢包是否在硬件层,再结合队列数、ring、软中断分布和内核 dropwatch 定位,所有改动都要注意重启失效并做持久化,云网卡还受虚拟化能力限制。