irqbalance 动态均衡详解(Linux 中断负载均衡机制)
irqbalance是 Linux 上用于自动分配硬件中断(IRQ)到不同 CPU 核的守护进程,目标是:
降低单核中断热点(IRQ Hotspot)
平衡多核负载
提高 cache locality(缓存命中)
优化网络、磁盘、存储设备吞吐
减少软中断(softirq)瓶颈
它本质上是:
动态调整
/proc/irq/*/smp_affinity的自动调度器
一、先理解什么是 IRQ 绑定
1. 一个网卡中断默认可能集中在一个核
看中断:
cat /proc/interrupts例如:
CPU0 CPU1 CPU2 CPU3 44: 1000000 0 0 0 IR-PCI-MSI eth0-TxRx-0 45: 950000 0 0 0 IR-PCI-MSI eth0-TxRx-1全部压在 CPU0:
CPU0软中断高
top -H可能:
si 50%或者:
ksoftirqd/0 100%这是热点。
2. 手工绑核
例如:
echo 2 > /proc/irq/44/smp_affinity2:
0010表示绑 CPU1。
问题:
手工维护困难
NUMA 拓扑变化难处理
网卡队列变化不好适配
所以需要 irqbalance。
二、irqbalance 工作原理
守护进程:
/usr/sbin/irqbalance周期运行:
默认约:
10 秒扫描一次做三件事:
(1)采集系统拓扑
读取:
/sys/devices/system/cpu/识别:
CPU core
socket
NUMA node
cache domain
例如:
Socket0 ├── Core0 ├── Core1 Socket1 ├── Core8 ├── Core9(2)分析中断负载
读:
/proc/interrupts统计:
每IRQ频率
每CPU中断量
哪个核过载
(3)动态迁移 IRQ
修改:
/proc/irq/N/smp_affinity把中断迁往空闲核:
例如:
原来:
eth0-rx0 -> CPU0 eth0-rx1 -> CPU0调整后:
eth0-rx0 -> CPU0 eth0-rx1 -> CPU2这叫动态均衡。
三、核心算法
Balance Level(平衡层级)
irqbalance 有拓扑层次:
package(socket级)
按CPU物理包均衡
socket0 ←→ socket1适合:
双路服务器
cache级
按共享L3缓存均衡:
Core0-3 共享cache IRQ尽量留在该组提高 cache hit。
core级
精细到核:
core-to-core适合高并发网络。
四、为什么它“动态”
因为负载变了它会重新迁移。
比如:
开始:
网卡忙 CPU0中断高迁移:
CPU2 分担后来:
磁盘开始繁忙:
CPU2压力高再迁:
IRQ -> CPU3这就是动态。
五、irqbalance 与 RSS/RPS关系
这是最容易混淆的地方。
(1)RSS(硬件多队列)
网卡自己分流:
Flow Hash Queue0 -> CPU0 Queue1 -> CPU1硬件层。
(2)irqbalance
决定:
Queue0 IRQ绑哪个CPU软件调度层。
(3)RPS
收到包后:
softirq再转别核软件第二层。
关系:
RSS ↓ irqbalance ↓ RPS三层协作。
六、查看 irqbalance 状态
服务状态
systemctl status irqbalance是否开机启动
systemctl is-enabled irqbalance查看实际效果
watch -n1 cat /proc/interrupts观察中断是否分散:
坏:
CPU0 10000000 CPU1 0好:
CPU0 2500000 CPU1 2500000 CPU2 2500000 CPU3 2500000看 affinity
cat /proc/irq/44/smp_affinity_list例如:
0-3七、配置文件
通常:
/etc/sysconfig/irqbalance或:
/etc/default/irqbalanceban cpu(排除CPU)
IRQBALANCE_BANNED_CPUS=00000001不让CPU0参与。
常用于:
留 CPU0 给 OS housekeeping
balance interval
--interval=55秒重平衡。
NUMA策略
--hintpolicy=subset按 NUMA hint 调优。
八、什么时候不建议开
场景1 低延迟交易系统
手工绑核优于动态迁移:
irqbalance off因为迁移导致 cache miss。
场景2 DPDK
用户态轮询:
不用中断irqbalance没意义。
场景3 数据库绑核
比如:
MySQL on CPU2-15 IRQ在CPU0-1需要手工隔离。
九、生产中常见误区
误区1
以为开 irqbalance 就自动优化网络。
错。
如果:
单队列网卡无队列可分。
效果有限。
误区2
irqbalance 和 RSS 冲突
错。
它们互补。
误区3
关闭 irqbalance 性能一定更高
错。
普通服务器:
开着通常更优。
十、性能收益(典型)
10G 网卡
不开:
单核瓶颈 4 Gbps开启:
多核分摊 9+ Gbps降低 softirq
ksoftirqd CPU 90% ↓ 30%降低丢包
rx_dropped下降十一、诊断命令组合
cat /proc/interrupts cat /proc/softirqs mpstat -P ALL 1 watch -n1 'grep eth /proc/interrupts' cat /proc/irq/*/smp_affinity_list配合:
ethtool -l eth0 ethtool -x eth0看 RSS 队列。
十二、本质总结
irqbalance 做的是:
实时观察: IRQ负载 CPU拓扑 NUMA结构 ↓ 动态修改: /proc/irq/*/smp_affinity ↓ 让中断跨核均衡本质是:
Linux 的 IRQ 自动调度器(AIOps for interrupts)
推荐生产策略
通用服务器
开 irqbalance 开 RSS 必要时开 RPS高性能数据库
IRQ绑 housekeeping cores 业务绑专属 cores 可关 irqbalance超高吞吐网络
irqbalance + RSS + XPS + RPS完整中断栈调优。