软中断分布不均会拖慢Nginx性能,需通过启用网卡多队列、配置RPS、绑定Nginx worker到对应CPU并监控NET_RX均衡性来优化。

软中断(softirq)分布不均会直接拖慢 Nginx 处理网络请求的速度,尤其在高并发场景下,单个 CPU 被 NET_RX 占满,其余核闲置,负载均衡就成了一句空话。优化的关键不是调 Nginx 配置本身,而是让网络数据从网卡进来那一刻起,就均匀落到多个 CPU 上。
确认软中断瓶颈是否真实存在
先用系统命令验证问题:运行 watch -n 1 'cat /proc/softirqs | grep NET_RX',观察各 CPU 列的数值增长速度。如果某一个 CPU(比如 CPU1)的 NET_RX 值远高于其他核(例如高出 3–5 倍),且 top 中对应 CPU 的 si(softirq)占比长期超过 15%,就说明软中断已构成瓶颈。再配合 cat /proc/interrupts | grep eth 查看硬中断是否也集中在同一 CPU——若硬中断也偏斜,说明底层网卡队列没打开多队列支持。
启用网卡多队列并绑定 CPU
单队列网卡只能把所有中断发给一个 CPU,必须升级为多队列模式:
- 检查网卡是否支持多队列:
ethtool -l eth0,查看 Combined 最大值(如显示 8,说明最多支持 8 队列) - 启用多队列:
ethtool -L eth0 combined 8 - 确认队列创建成功:
ls /sys/class/net/eth0/device/msi_irqs/应出现 8 个编号目录 - 设置 RPS(Receive Packet Steering)将软中断分散到多个 CPU:
echo ffff > /sys/class/net/eth0/queues/rx-0/rps_cpus(十六进制位掩码,ffff 表示前 16 个 CPU 全部可用;按实际核数调整,如 8 核用ff)
配合 Nginx 进程绑定提升局部性
光分散软中断还不够,Nginx worker 进程也要和处理该网卡流量的 CPU 对齐,减少跨核缓存失效:
- 设
worker_processes auto;或显式指定为 CPU 总核数 - 用
worker_cpu_affinity绑定每个 worker 到独立 CPU,例如 8 核服务器:worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; - 搭配
worker_priority -20提升调度权重,确保在竞争时优先获得时间片
验证优化效果与持续监控
重启 Nginx 并重载网卡驱动后,再次运行 watch -n 1 'cat /proc/softirqs | grep NET_RX',应看到各 CPU 的增长速率趋于一致。同时用 pidstat -w 1 观察 Nginx worker 进程的上下文切换(cswch/s)是否下降——软中断均衡后,进程被频繁唤醒的次数会明显减少。建议将这些指标接入 Prometheus + Grafana,长期跟踪 si%、NET_RX per CPU 和 Nginx request latency P95 三者关联变化,形成闭环反馈。











