在 CentOS 7 中调整系统级网卡中断并绑定到指定 CPU 核心前,需要先处理几个关键前提。第一,必须先停止 irqbalance 服务,否则即使你刚修改完 /proc/irq/$IRQ_NUM/smp_affinity,几秒后也可能被系统自动恢复。第二,确认网卡中断号时,应当到 /proc/interrupts 中使用 grep 查找包含网卡接口名的 PCI-MSI-X 或 MSI 相关行;如果使用的是多队列网卡,那么每个队列通常都会对应一个独立的 IRQ 中断号。第三,smp_affinity 必须填写十六进制位掩码,例如 CPU0 对应 0x1、CPU1 对应 0x2,不能误写成普通十进制数;此外,整个配置过程都需要在 root 权限下执行。

直接修改 /proc/irq/$IRQ_NUM/smp_affinity 就可以立即生效,但前提是一定要先关闭 irqbalance,否则几秒钟后配置就会被重新覆盖回默认状态。
怎么查网卡对应的中断号
对于多队列网卡(例如 Intel ixgbe、igb、virtio),每个 RX/TX 队列一般都会分配单独的中断号;而单队列网卡通常只对应一个 IRQ。查询时重点不是单纯看设备名(如 eth0),而是查看 /proc/interrupts 中带有网卡标识的中断记录:
- 执行
cat /proc/interrupts | grep -i "eth0|enp0s3|p15p1"(请替换为实际使用的网卡接口名) - 查找包含
PCI-MSI-X、MSI或IO-APIC的行,通常末尾会显示设备名,例如eth0-0、enp0s3 - 最左侧第一列的数字就是中断号,例如
122:表示 IRQ 122
需要注意的是,在某些虚拟化环境中(如 KVM + virtio),中断名称可能显示为 virtio0-input 或 virtio0-output。这种情况下,建议结合 ethtool -l eth0 查看队列数量,再通过 grep -A1 -B1 virtio0 /proc/interrupts 来进一步定位对应的网卡中断号。
怎么写 smp_affinity 值(十六进制位掩码)
smp_affinity 本质上是一个 CPU 位图,每一位代表一个逻辑 CPU,顺序是从右向左依次对应 CPU0、CPU1、CPU2……。如果格式填写错误,可能会导致写入失败,或者系统直接忽略该设置:
- CPU0 →
1(十六进制)→0x1 - CPU1 →
2→0x2 - CPU2 →
4→0x4 - CPU3 →
8→0x8 - CPU0+CPU2 →
1 | 4 = 5→0x5 - 16 核以上的服务器通常需要使用逗号分隔的 32 位十六进制块,例如 24 核环境中:CPU0 →
00000001,CPU23 →00800000,如果同时绑定 CPU0 和 CPU23,则应写为00800001
不要把它当成十进制来写 —— 比如 echo 2 > /proc/irq/122/smp_affinity 在 8 核以上主机中很容易造成绑核错误(系统会按 0x2 解释,也就是绑定到 CPU1)。因此在操作前,务必确认当前系统的 CPU 数量以及逻辑编号范围,可使用 lscpu | grep "^CPU(s| MHz) 进行检查。
为什么改了不生效或很快恢复
修改 CentOS 7 网卡中断绑定后如果没有生效,或者很快又恢复默认,最常见的原因通常有以下几种,而且都很容易被忽略:
irqbalance仍在运行:执行systemctl stop irqbalance && systemctl disable irqbalance,否则你刚写入完成,它可能在 2 秒后重新分配并覆盖成负载均衡值- 使用了
smp_affinity_list却没有同步确认smp_affinity:这两个文件存在联动关系,但在某些内核版本中(特别是 CentOS 7.9+),对smp_affinity_list的写入支持并不稳定,实际操作时更建议优先直接写smp_affinity的十六进制值 - 没有使用 root 权限:应使用
sudo sh -c 'echo 0x1 > /proc/irq/122/smp_affinity',因为直接执行echo往往会因权限不足而失败
要验证配置是否真正生效,修改后可以立即执行 cat /proc/interrupts | grep 122,观察对应中断计数是否只在目标 CPU 那一列持续增长;同时再查看 cat /proc/irq/122/smp_affinity,确认输出值是否与你写入的掩码一致。
真正更复杂的问题,其实在于 NUMA 节点对齐,以及后续软中断调度带来的影响。smp_affinity 能控制的只是硬中断分配,而像 ksoftirqd 这样的软中断线程,默认仍可能在所有 CPU 上参与调度。也就是说,如果你希望把 CPU 隔离做得更彻底,仅仅绑定网卡中断还不够,还需要结合 isolcpus 内核参数,以及对 /proc/sys/net/core/dev_weight 等参数的调优,进一步控制软中断处理权重。不过从实际运维角度来说,这一步已经不仅仅是“网卡中断绑定到特定 CPU 核心”这么简单,而是进入了更深一层的系统性能优化范畴。
