网卡软中断不均会导致某CPU核心si占比过高,挤占Redis等进程CPU时间,需通过mpstat和/proc/interrupts确认不均,启用多队列网卡,绑定硬中断并配置RPS/RFS实现软中断均衡。

确认软中断是否真的不均
先用 mpstat -P ALL 1 观察各 CPU 的 %soft 分布。若某核心持续高于 20%,其余核心低于 2%,就基本可判定不均。
再执行:
cat /proc/interrupts | grep -E "CPU|eth|enp"
查看各网卡中断号在不同 CPU 上的计数分布。比如 eth2-TxRx-0 全在 CPU0,而 CPU1–CPU7 几乎为 0,说明硬中断已集中;再结合 /proc/softirqs 中 NET_RX 和 NET_TX 的累计值,能进一步验证软中断是否也扎堆。
启用并检查多队列网卡支持
单队列网卡天然无法分散中断,必须先确认硬件和驱动是否支持多队列:
- 运行 lspci -vvv | grep -A 10 "Ethernet controller" | grep -E "(MSI-X|Queue)",看到
MSI-X: Enable+ Count=xx且TabSize > 1表示支持 - 检查队列目录:ls /sys/class/net/eth2/queues/,应存在多个
rx-0、rx-1… 目录 - 若无多队列,需升级网卡固件或更换支持 RSS 的网卡(如 Intel X550、Mellanox CX系列)
手动绑定硬中断 + 启用 RPS/RFS 均衡软中断
仅调硬中断亲和性不够——硬中断落在哪个核,软中断默认也在同核处理。必须配合 RPS(软件层面模拟 RSS)把软中断分发出去:
- 关闭 irqbalance:systemctl stop irqbalance && systemctl disable irqbalance
- 查 eth2 对应中断号范围:cat /proc/interrupts | grep eth2(例如 160–167)
- 将每个中断号轮询绑定到不同 CPU(如 24 核机器,用 CPU 2–25):
echo 2 > /proc/irq/160/smp_affinity_list
echo 3 > /proc/irq/161/smp_affinity_list
…(脚本批量更稳妥) - 启用 RPS:对每个接收队列设置允许使用的 CPU 掩码
echo ffffff > /sys/class/net/eth2/queues/rx-0/rps_cpus
(24 核对应 24 位二进制即0xffffff,十六进制写法) - 增大 RPS 流表大小防哈希冲突:
echo 4096 > /sys/class/net/eth2/queues/rx-0/rps_flow_cnt
验证与长期固化
操作后再次运行 mpstat -P ALL 1,观察 %soft 是否均匀回落至 2%–5% 区间;同时用 top -H -p $(pgrep codis-server) 看业务进程线程是否不再频繁被抢占。
为避免重启失效,把中断绑定逻辑写入开机脚本(如 /etc/rc.local 或 systemd service),并确保网卡加载完成后再执行。

















