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

完整中断栈调优。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐