网卡多队列 RSS 和中断绑核怎么提升网络性能?
更新时间:2026-09-19。短答页。高吞吐/高 PPS(每秒报文数)场景,单核处理网卡中断会成为瓶颈,多队列 + 中断分散是常见优化。
一句话回答
RSS(Receive Side Scaling)让网卡把入向流量按五元组哈希散列到多个硬件队列,每个队列的硬中断绑定到不同 CPU,从而把报文接收、协议栈处理并行摊到多核,避免单核软中断 100% 成为网络瓶颈。
为什么需要
- 只有一个队列时,所有收包硬中断都打到某一个 CPU,该核
NET_RX软中断打满,其它核却空闲,整体 PPS 上不去、延迟升高。 - 多队列把中断和随之的软中断分散,mpstat 能看到负载是否均衡。
怎么看现状
bash
# 网卡支持/当前队列数(Combine 是收发合一队列)
ethtool -l eth0
# 各队列中断号
grep eth0 /proc/interrupts
# 看每个 CPU 的软中断(%soft)与单核是否打满
mpstat -P ALL 1怎么配置
bash
# 开启并设置多队列(队列数一般对齐 CPU 数,不超队列上限)
sudo ethtool -L eth0 combined 8
# 查看/设置某队列中断的 CPU 亲和性掩码(绑到指定核)
cat /proc/irq/<IRQ>/smp_affinity
echo 02 > /proc/irq/<IRQ>/smp_affinity_list # 绑到 CPU1(用 _list 更直观)- 静态绑核:写
smp_affinity_list,把队列均匀映射到物理核,避开跑业务主循环的核(减少 cache 争抢)。 - irqbalance:系统默认服务会动态分配中断;追求确定性低延迟时常对网卡队列改为手动绑定并对这些 IRQ 禁止 irqbalance(ban 配置)。
- RPS/RFS:没有硬件多队列(虚拟网卡常见)时用软件方式在多 CPU 间分发收包/把流定向到消费它的核,是 RSS 的软件补充,详见 ethtool/网卡调优。
注意点
- 队列数不是越多越好,过多队列带来缓存失效和中断开销;通常与参与收包的物理核数匹配。
- RSS 哈希要让同一连接落到同一队列(保序),默认按五元组;同一长连接无法被多核并行(连接级并行,不是包级)。
- 配合调整 ring buffer、中断合并(coalescing)减少每包中断频率。
- 云环境虚拟网卡队列上限取决于规格;队列开了还要在驱动/guest 内有足够 vCPU 承接。
坑
- 开了多队列但中断仍全在一个核(亲和性没配/被 irqbalance 聚合),等于没开。
- 把网卡中断绑到正在跑高频业务的核,cache 互抢反而降速。
- 只看总 CPU 不看单核,单核 NET_RX 已 100% 而均值显示 50%。
- 虚拟网卡不支持多队列却硬调,应改用 RPS。
队列/ring/offload 操作见 ethtool 实战,内核丢包见 dropwatch。
总结
单队列网卡把所有收包中断压在一个 CPU 上,高 PPS 时该核 NET_RX 软中断打满形成瓶颈;RSS 通过对五元组哈希把流量散到多个硬件队列、再把每个队列的硬中断用 smp_affinity 绑定到不同 CPU 并配合中断合并,使收包和协议栈处理在多核并行,用 ethtool -L 开队列、/proc/interrupts 和 mpstat 验证是否均衡;没有硬件队列时用 RPS/RFS 软件分发,队列数对齐物理核、避开业务核并保证同流同队列保序,是主要的调优纪律。