irqbalance 动态均衡详解
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_affinity
2:
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/irqbalance
ban cpu(排除CPU)
IRQBALANCE_BANNED_CPUS=00000001
不让CPU0参与。
常用于:
-
留 CPU0 给 OS housekeeping
balance interval
--interval=5
5秒重平衡。
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
完整中断栈调优。
更多推荐


所有评论(0)