应优先启用网卡硬件RSS,再依次配置RPS、RFS、XPS及中断亲和性:1.用ethtool启用多队列;2.为各rx队列设RPS CPU掩码;3.配置RFS流表容量与全局阈值;4.为tx队列设XPS掩码;5.禁用irqbalance并静态绑定中断到对应CPU。

用 ethtool -X(不是 -K)配置接收哈希(RSS),才能让多队列网卡真正把不同流量打散到多个队列。只开队列不调哈希,所有包可能全挤在一个队列里,等于白配。
确认网卡支持 RSS 并已启用多队列
先确保硬件和驱动层面已就绪:
- 运行
ethtool -l eth0,检查Combined当前值是否大于 1(比如Current: 8) - 执行
ethtool -x eth0,若能正常输出 indirection table(分流表)和 hash key,说明 RSS 已激活;若报错或无输出,需先用ethtool -L eth0 combined N开启队列并重启网卡 - 某些驱动(如 r8126、ixgbe)需加载时启用 RSS,可检查
modinfo ixgbe | grep rss确认模块参数支持
查看和修改 RSS 哈希字段
哈希字段决定哪些包头信息参与计算——选得不对,五元组高度相似的流量仍会哈希到同一队列:
- 查当前设置:
ethtool -x eth0或更细粒度地查某类流:ethtool --show-rxfh-indir eth0 - 为 IPv4 TCP 流启用源/目的 IP + 源/目的端口:
ethtool --config-rxfh eth0 tcp4 sdfn
其中sdfn表示:s(src IP)、d(dst IP)、f(src port)、n(dst port) - 其他常用组合:
sd(仅 IP)、sdfn(完整五元组)、sdn(IP+dst port);避免只用n(单端口)这类弱哈希
调整分流表(indirection table)让队列负载均衡
哈希结果要映射到实际队列,靠的是 128 项的 indirection table。默认可能全指队列 0,必须手动摊开:
- 查当前表:
ethtool --show-rxfh-indir eth0 - 生成均匀分布的表(例如 4 队列):
printf '%s\n' {0..3} | xargs -n32 echo | sed 's/ / /g',再用ethtool --set-rxfh-indir eth0 equal 4快速均分 - 如需自定义(比如让特定哈希段进高优先级 CPU 对应的队列),可用
ethtool --set-rxfh-indir eth0 0 0 0 ... 1 1 1 ...逐项写入 128 个数字
配合中断亲和性与 RPS/RFS 才算闭环
RSS 只负责硬件分队列,后续还需让每个队列的中断由不同 CPU 处理,并防止软件层又回退到单核:
- 查网卡中断:
grep eth0 /proc/interrupts,找到类似eth0-TxRx-0的行,记下 IRQ 编号 - 绑定 IRQ 到不同 CPU:
echo 0 > /proc/irq/123/smp_affinity_list(队列 0)、echo 1 > /proc/irq/124/smp_affinity_list(队列 1)…… - 若网卡 RSS 不稳定或驱动限制,可开启 RPS 作补充:
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus(十六进制掩码,f=CPU0–3)


















