CentOS 7 网卡中断不平衡导致网络性能下降怎么绑定 CPU 亲和性?

文章导读
在 CentOS 7 生产环境中,若监控发现单个 CPU 核心软中断(si)过高且伴随网络丢包或延迟抖动,手动绑定网卡中断到多核通常能缓解瓶颈。但操作前需确认是否为中断分布问题,并注意持久化配置及 irqbalance 服务的影响。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 持久化配置方案
  5. 怎么验证是否生效
  6. 常见坑
  7. 参考来源
A A

在 CentOS 7 生产环境中,若监控发现单个 CPU 核心软中断(si)过高且伴随网络丢包或延迟抖动,手动绑定网卡中断到多核通常能缓解瓶颈。但操作前需确认是否为中断分布问题,并注意持久化配置及 irqbalance 服务的影响。

先说结论:中断不平衡确实会导致单核满载而其它核心空闲,进而限制网络吞吐,但盲目绑定可能适得其反。

  • 先定位:通过 /proc/interrupts 确认网卡中断是否集中在单核
  • 谨慎操作:关闭 irqbalance 服务会导致所有设备中断不再自动平衡,建议仅针对高负载网卡手动绑定
  • 必做持久化:手动修改 /proc 仅临时生效,重启需通过 systemd 或 rc.local 恢复
  • 再验证:观察软中断分布变化及网络业务指标

命令速用版

# 查看中断分布
cat /proc/interrupts | grep eth0
# 关闭自动平衡服务(注意:会影响所有设备中断平衡)
systemctl stop irqbalance
systemctl disable irqbalance
# 设置中断亲和性 (示例:IRQ 40 绑定到 CPU 0-3)
echo 0-3 > /proc/irq/40/smp_affinity_list

为什么会这样

网卡收到数据包后会向 CPU 发送硬件中断,CPU 暂停当前任务处理网络协议栈,这部分消耗称为软中断。默认情况下,CentOS 7 运行 irqbalance 服务尝试自动分配中断,但在高并发场景下,自动策略可能将所有队列中断映射到同一个 CPU 核心,导致该核心成为瓶颈,而其它核心闲置。

分步处理

1. 确认网卡对应的中断号

cat /proc/interrupts | grep eth0

找到 eth0 对应的 IRQ 编号(最左侧数字),例如 40、41、42...

2. 查看当前 CPU 亲和性

cat /proc/irq/40/smp_affinity_list

3. 停止自动平衡服务(避免手动设置被覆盖)

注意:停止 irqbalance 后,其他非网卡设备的中断也将不再自动平衡,可能影响磁盘 IO 等性能。若仅希望防止网卡中断被重置,可尝试配置 irqbalance 忽略特定 IRQ,但 CentOS 7 默认配置支持有限,生产环境通常直接停止服务并接受风险。

systemctl stop irqbalance

4. 绑定中断到指定 CPU 核心

注意:smp_affinity_list 接受 CPU 编号列表(如 0-3),而非 hex 掩码。避免绑定 CPU 0,以防影响系统调度任务。

echo 0-3 > /proc/irq/40/smp_affinity_list

5. 设置开机生效(需写入 rc.local 或创建 systemd 服务)

持久化配置方案

修改 /proc 文件重启后会失效,必须配置开机自启。

方案一:使用 rc.local(简单)

CentOS 7 网卡中断不平衡导致网络性能下降怎么绑定 CPU 亲和性?
# 确保 rc.local 有执行权限
chmod +x /etc/rc.d/rc.local
# 编辑文件,添加绑定命令
vi /etc/rc.d/rc.local
# 内容示例:
echo 0-3 > /proc/irq/40/smp_affinity_list
echo 0-3 > /proc/irq/41/smp_affinity_list

方案二:创建 systemd 服务(推荐)

创建文件 /etc/systemd/system/irq-affinity.service:

[Unit]
Description=Set IRQ Affinity
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo 0-3 > /proc/irq/40/smp_affinity_list'
ExecStart=/bin/bash -c 'echo 0-3 > /proc/irq/41/smp_affinity_list'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

启用服务:

systemctl daemon-reload
systemctl enable irq-affinity.service

怎么验证是否生效

1. 使用 top 命令按 1 键展开所有核心,观察 si(软中断)占用是否分散。

2. 再次查看 /proc/interrupts 计数是否在不同 CPU 列上增长。

watch -n 1 'cat /proc/interrupts | grep eth0'

3. 结合业务监控判断网络吞吐及延迟是否有改善。公开资料中没有看到可靠的量化数据表明具体提升比例,需结合业务监控判断。

常见坑

1. irqbalance 服务未停止:导致手动设置重启或一段时间后失效。

2. 绑定核心包含 0 号核:可能影响系统调度任务,建议预留 CPU 0 给系统进程。

3. NUMA 架构跨 socket 绑定:会增加内存访问延迟,建议绑定在同一 NUMA 节点内的 CPU。

4. 修改后未持久化:重启恢复默认,务必配置 systemd 或 rc.local。

5. 格式错误:smp_affinity_list 使用 CPU 范围(0-3),smp_affinity 使用十六进制掩码(f),勿混用。

参考来源

  • Red Hat Enterprise Linux 7 Performance Tuning Guide, 4.4. IRQ Balance
  • Linux Kernel Documentation, Documentation/proc.txt