irqbalance
irqbalance 是一个用于自动调整“中断亲和性(IRQ affinity)”的用户态守护进程。
它的核心作用是:
将硬件中断合理分配到多个 CPU 核心上,避免中断集中在单一 CPU,提升整体性能与稳定性。
中断(Interrupt Request,IRQ) 是硬件向 CPU 发出的即时通知,例如:
- 网卡收到数据包
- 磁盘 I/O 完成
- 定时器触发
- 硬件错误
当中断发生时:
- CPU 暂停当前执行的任务
- 进入内核态
- 执行对应的 中断处理函数
中断亲和性 指的是:
某个中断只能由哪些 CPU 核心来处理
在 Linux 中:
- 每个 IRQ 都有一个
smp_affinity位掩码 - 决定该 IRQ 可在哪些 CPU 上运行
查看方式:
cat /proc/interrupts
cat /proc/irq/IRQ编号/smp_affinity
在很多系统中(尤其是服务器、虚拟机、双路 NUMA):
- 网卡中断集中在 CPU0
- CPU0 软中断(softirq)占用极高
- 其他 CPU 空闲
典型问题:
- 网络吞吐下降
- 延迟升高
- CPU 使用率不均衡
- 数据库、网络服务性能不稳定
irqbalance 周期性执行以下步骤:
- 读取系统中所有 IRQ
- 分析:
- 中断频率
- CPU 负载
- NUMA 拓扑
- 计算更优的中断分配方案
- 动态调整每个 IRQ 的
smp_affinity
irqbalance 主要考虑:
- CPU 核心数量
- CPU 当前负载
- 中断触发频率
- NUMA 节点亲和性
- 是否为 MSI/MSI-X 中断
在 NUMA 系统中:
- 优先将设备中断绑定到 本地 NUMA 节点的 CPU
- 减少跨 NUMA 内存访问
- 提升缓存命中率
- 多核服务器
- 双路 / 多路 NUMA 服务器
- 高速网卡(10G / 25G / 100G)
- 虚拟化宿主机
- 容器宿主机
-
实时系统
- 需要严格、可预测的中断延迟
-
数据库或网络服务已手动绑定中断
- 人工指定 IRQ -> CPU
-
高性能调优场景
- 明确知道每个中断应该跑在哪个 CPU 上
- 自动化
- 开箱即用
- 减少 CPU 热点
- 改善网络和 I/O 性能
- 对 NUMA 友好
- 行为不可完全预测
- 可能打乱人工优化的 IRQ 绑定
- 对极端低延迟场景不友好
systemctl status irqbalance
systemctl enable --now irqbalance
systemctl disable --now irqbalance
cat /proc/interrupts
关注:
- 单个 IRQ 是否集中在某一个 CPU
- 网卡相关 IRQ 是否分散
echo 4 > /proc/irq/IRQ编号/smp_affinity
含义:
- 将中断绑定到 CPU2(位掩码)
irqbalance 会覆盖你手动设置的中断亲和性
如果你需要手动控制:
- 必须停止 irqbalance
- 或在 irqbalance 配置中排除指定 IRQ
/etc/sysconfig/irqbalance
IRQBALANCE_BANNED_CPUS=00000001
含义:
-
禁止将中断分配到 CPU0
-
常用于:
- CPU0 专门跑系统任务
- 其它 CPU 跑业务负载
- 避免网卡中断堆积
- 减少软中断延迟
- 提升 PPS 和吞吐
- 减少 CPU 抢占
- 提升 I/O 稳定性
- 降低尾延迟(tail latency)
irqbalance 的本质是:自动管理中断亲和性,让中断“平均且合理”地跑在多个 CPU 上。
| 场景 | 建议 |
|---|---|
| 普通服务器 | 开启 |
| NUMA 服务器 | 开启 |
| 人工 IRQ 调优 | 关闭 |
| 实时系统 | 关闭 |