ethtool -h 仅操作 rss 哈希表映射,不开启哈希字段;真正决定哈希输入的是 ethtool -n(设字段)和 ethtool -x/-k(设键与类型),需协同配置才能优化流量分散。

在 Linux 中,使用 ethtool -H(即 ethtool --show-rxfh-indir / --set-rxfh-indir)可查看或修改网卡的接收侧扩展(RSS, Receive Side Scaling)哈希表(indirection table),从而将不同流的网络包更均匀地分发到多个 CPU 队列,缓解单核软中断瓶颈。但需注意:ethtool -H 本身不“开启”哈希字段,它只操作哈希结果映射;真正决定哪些字段参与哈希的是 RSS 哈希键(RSS key)和网卡支持的哈希类型(如 toeplitz、hash function)——这些需通过 ethtool -X 和 ethtool -K 配合设置。
确认网卡是否支持 RSS 及当前配置
执行以下命令检查硬件能力与当前状态:
-
ethtool eth0 | grep -i "receive.*scaling\|rss\|rxfh"—— 查看是否启用 RSS、支持队列数、哈希函数类型 -
ethtool -x eth0—— 显示当前 RSS 哈希键(key)和哈希类型(如tcp4,udp4,ip4) -
ethtool -n eth0 rxflow-hash tcp4—— 查看 TCPv4 流量当前使用的哈希字段(如sd表示源+目的 IP+端口)
调整哈希字段组合以改善流量分散性
非平衡流量(如大量连接来自同一源 IP 或固定端口)常因哈希字段过窄导致所有包落入少数队列。应扩大哈希维度:
- 对 IPv4 TCP 流:用
ethtool -N eth0 rxflow-hash tcp4 sdfn(s=src-ip, d=dst-ip, f=src-port, n=dst-port) - 对 IPv4 UDP 流:用
ethtool -N eth0 rxflow-hash udp4 sdfn - 若网卡支持 IPv6,对应设为
tcp6/udp6并指定sdfn(IPv6 地址字段名相同) - 禁用不必要字段(如仅用
sd)会加剧倾斜;启用四元组(sdfn)是多数场景推荐起点
自定义哈希表(Indirection Table)实现负载再均衡
RSS 哈希值对队列数取模后查 indirection table,该表默认常为线性填充(如 0,1,2,3…),但若 CPU 核心负载不均,可手动重分布:
- 先导出当前表:
ethtool -x eth0 > rxfh_current.txt - 编辑文件,将索引位置映射到期望的 RX 队列号(如 128 项,每项填 0~7 表示 8 个队列)
- 写入新表:
ethtool -X eth0 weight 0 1 2 3 4 5 6 7(简单轮询)或更精细控制:ethtool -X eth0 equal 8(自动均分) - 高级场景下可按 CPU 负载热点,把更多哈希桶映射到空闲核心对应的队列(需配合
/proc/interrupts观察)
验证与持续观察
修改后必须验证效果,避免误配导致丢包或性能下降:
- 检查中断分布:
watch -n1 'grep eth0 /proc/interrupts',观察各 CPU 的rx-*中断计数是否趋近均衡 - 确认无丢包:
ethtool -S eth0 | grep -i "drop\|err\|over",重点看rx_missed_errors、rx_over_errors - 压测对比:用
iperf3或真实业务流量,对比修改前后top -H中软中断(softirq)CPU 占用分布 - 注意:部分网卡(如某些 Realtek 或老旧 Intel)不支持动态修改哈希字段,需加载驱动时加参数(如
ixgbe.RSS=8)或升级固件
不复杂但容易忽略:哈希字段设置(-N)和哈希表映射(-X)需协同生效;仅调表不扩字段,或仅扩字段不调表,都难以解决本质的哈希碰撞问题。











