服务是干什么的
irqbalance 是用户态守护进程,周期性读取各中断的计数与系统拓扑,把硬件中断(网卡多队列、存储控制器、USB 等)分散到不同 CPU 上,避免所有中断堆在 CPU0 形成软中断热点。它按 NUMA 节点与缓存层级做启发式分配,因此与手动 IRQ 亲和设置(tuna、smp_affinity、驱动参数)存在直接冲突:谁最后写入,谁的决定生效。
基本信息
| 适用平台 | 主流 Linux 发行版(RHEL/CentOS/Debian/Ubuntu) |
|---|---|
| 查看状态 | systemctl is-active irqbalance |
| 配置文件 | RHEL 系 /etc/sysconfig/irqbalance,Debian 系 /etc/default/irqbalance |
| 常用参数 | --banirq=<n> 把指定中断排除在均衡之外;--oneshot 执行一次后退出 |
| 冲突对象 | 手动 smp_affinity_list、tuna、驱动侧队列绑定 |
| 权限 | 读写中断亲和与改配置需 root |
典型使用场景
- 通用业务服务器:开启后自动分散中断,降低单核软中断打满的概率
- 低延迟/绑核调优:先停用 irqbalance,再按规划手工绑定中断与业务线程
- 排查「手动绑定几分钟后失效」:确认是 irqbalance 周期性重写亲和掩码
- 多队列网卡高 PPS 场景:结合队列数、RPS/RFS 与 irqbalance 策略决定是否手工接管
- NUMA 机器上核对中断是否落在设备所属节点,避免跨节点内存访问
查看与停止
查看与停止
systemctl is-active irqbalance # 先确认它是否在运行
cat /proc/interrupts | head -20 # 观察各中断计数在不同 CPU 上的分布
sudo irqbalance --oneshot --debug # 执行一次均衡并打印决策过程,便于对照理解
sudo systemctl stop irqbalance # 需要完全手工绑定时先停服务
sudo systemctl disable irqbalance # 方案验证通过后再禁止开机自启
grep -rn 'IRQBALANCE_ARGS' /etc/sysconfig/irqbalance /etc/default/irqbalance # 核对启动参数场景与取舍
| 场景 | 建议 | 原因 |
|---|---|---|
| 通用业务服务器 | 保持开启 | 自动均衡能有效避免单核中断热点 |
| 低延迟/绑核调优 | 停用并手工绑定 | irqbalance 会周期性覆盖手动亲和设置 |
| 只需固定个别中断 | 用 --banirq 排除 | 让 irqbalance 不再动该中断,同时保留其他中断的自动均衡 |
| NUMA 敏感业务 | 结合设备所属节点绑核 | 中断跨节点会抬高内存访问延迟 |
停用 irqbalance 后如果没有配套的手工规划,中断会按驱动默认掩码集中在少数核(常见 CPU0),单核软中断打满的风险反而更高。停之前先确定每条队列绑到哪个核,并记录原始 smp_affinity_list 以便回退。
容器内执行 stop/disable 或改中断亲和通常无效或看不到宿主中断,需要以宿主机视角操作;云主机上部分中断不向 guest 暴露,此时应从实例规格与宿主机侧指标评估。