服务器网卡中断优化实战:RSS多队列与IRQ亲和性配置

服务器在高并发下出现单核CPU软中断飙高,网卡收包中断全部落在同一个CPU核心上,吞吐上不去、延迟抖动,这是多核服务器常见的性能瓶颈。问题根源是默认情况下网卡把所有中断发往同一个核。服务器网卡中断优化的核心思路就两条:让多队列网卡把流量分摊到多个队列,再把每个队列的中断绑定到不同CPU核心。下面按排查、配置、验证三步走。

服务器网卡中断问题的识别方法

先确认瓶颈在中断分发,执行以下命令查看软中断分布:

# 查看CPU软中断占比,单核接近100%说明中断集中
mpstat -I CPU 2 5

# 查看网卡队列数与各队列中断次数
cat /proc/interrupts | grep eth0

# 查看当前网卡队列配置
ethtool -l eth0

如果某个CPU的softirq一直打满,而其他核心空闲,说明中断没有均衡分发。接下来分两种情况处理:网卡支持多队列(RSS),就开启RSS并绑定队列中断;网卡只有单队列(虚拟化或老型号),就上RPS做软件分发。

RSS多队列:网卡硬件层面的中断均衡

RSS(Receive Side Scaling)由网卡硬件把收包流量散列到多个接收队列,每个队列独立产生中断。配置示例:

# 查看当前队列数
ethtool -l eth0

# 设置4个接收队列(以4核为例)
ethtool -L eth0 combined 4

# 查看RSS哈希配置
ethtool -x eth0

# 设置哈希函数
ethtool -X eth0 hfunc toeplitz

队列数建议与物理核心数一致,超线程环境按物理核分配即可。RSS的散列基于四元组(源/目的IP+端口),同一连接固定落在同一队列,不会出现乱序。

RPS与RFS:单队列网卡的软件中断分发方案

虚拟机和部分老型号只有单队列,此时用内核RPS(Receive Packet Steering)把收包处理分散到多核:

# 将eth0的RPS绑到CPU0-3(bitmap 0xf)
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus

# 同时开启RFS,避免重排序
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
echo 2048 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt

RFS在内核里根据Socket的CPU亲和性,把同一流的包尽量送达处理它的核心,减少跨核缓存失效。配置后用cat /proc/interrupts确认中断已分散到多个核。

IRQ亲和性:把中断钉到独立CPU

RSS/RPS只是让包进多队列,中断处理和软中断执行的CPU还要手动指定,否则irqbalance可能把中断聚到一起。做法是把网卡中断写进smp_affinity_list:

# 查看网卡中断号
grep eth0 /proc/interrupts

# 假设中断号为66-69,分别绑定到0-3核
echo 0 > /proc/irq/66/smp_affinity_list
echo 1 > /proc/irq/67/smp_affinity_list
echo 2 > /proc/irq/68/smp_affinity_list
echo 3 > /proc/irq/69/smp_affinity_list

生产环境建议先停掉irqbalance(systemctl stop irqbalance),否则它的动态调整可能覆盖手工绑定。绑定后,中断处理、软中断、应用进程各占独立的CPU核心,避免互相干扰。

优化效果验证与配置持久化

压测验证直接看软中断分布和吞吐:

# 压测中持续观察每个CPU的软中断占比
mpstat -P ALL 1

# 查看整体吞吐与丢包
sar -n DEV 1 5
netstat -s | grep -i drop

优化后各核心软中断占比应趋于平均,丢包与超时下降。ethtool与sysctl的配置重启后失效,写成systemd服务或rc.local在开机时统一恢复。高并发小包场景下,这个优化能把单机吞吐拉高两倍以上。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/fu-wu-qi-wang-ka-zhong-duan-you-hua-shi-zhan-rss-duo-dui/

(0)
小编小编
上一篇 2小时前
下一篇 2小时前

相关推荐