CPU中断亲和性是将硬件中断固定绑定到指定CPU核心处理的机制,用于避免缓存失效、NUMA延迟、核心争用及实时任务干扰;可通过/proc/irq/N/smp_affinity_list查看和设置,推荐关闭irqbalance并采用静态绑定与内核隔离参数优化。

CPU中断亲和性是什么
CPU中断亲和性(IRQ Affinity)指将特定硬件设备产生的中断(如网卡、磁盘、USB控制器等)固定绑定到一个或多个指定CPU核心上处理。默认情况下,Linux内核会把中断分发给任意可用CPU,但这种“随机”分配可能导致缓存失效、跨核同步开销增大,尤其在高吞吐或低延迟场景下影响明显。
为什么要手动设置中断亲和性
自动分发中断看似省心,但存在几个现实问题:
- NUMA不友好:网卡中断被送到远端NUMA节点的CPU,内存访问延迟翻倍
- 核心争用:所有中断集中到0号核,挤占应用线程资源,top里%si持续偏高
- 缓存污染:频繁切换CPU导致L1/L2缓存反复失效,降低中断处理效率
- 干扰实时任务:关键业务线程与高频率中断(如NVMe轮询)共享核心,抖动加剧
如何查看和设置中断亲和性
每个中断对应/proc/irq/N/smp_affinity_list文件,其中N是中断号。例如查看网卡eth0的中断:
grep eth0 /proc/interrupts
输出类似:45: 123456 0 0 0 PCI-MSI 123456-edge eth0,说明中断号是45。再查其亲和性:
cat /proc/irq/45/smp_affinity_list
设置方式(以绑定到CPU 2和3为例):
echo "2,3" > /proc/irq/45/smp_affinity_list
注意:该设置重启后失效,需写入启动脚本或udev规则持久化。
irqbalance服务的作用与取舍
irqbalance是用户空间守护进程,目标是动态平衡中断负载。它会读取/proc/interrupts、监控CPU利用率、温度、拓扑关系,尝试把中断迁移到空闲核心。
但它并不总适合所有场景:
- 虚拟化环境:KVM宿主机上,irqbalance可能把网卡中断从vCPU所在物理核移走,反而增加上下文切换
- 确定性要求高:金融交易、DPDK应用需要中断100%落在预留核上,irqbalance的“智能”反而破坏确定性
- 误判负载:短时CPU尖峰被当作长期过载,触发不必要的中断迁移,引发瞬时丢包
建议做法:关掉irqbalance(systemctl stop irqbalance && systemctl disable irqbalance),改用静态亲和性+内核参数优化,例如:
- isolcpus=2,3,nohz_full=2,3,rcu.nocbs=2,3 隔离专用中断核
- net.core.netdev_budget=300 控制NAPI轮询量,避免单次处理太久










