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的中断:
输出类似:
45: 123456 0 0 0 PCI-MSI 123456-edge eth0
,说明中断号是45。再查其亲和性:
设置方式(以绑定到CPU 2和3为例):
CentOS Linux 7.9.2009
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
下载
注意:该设置重启后失效,需写入启动脚本或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轮询量,避免单次处理太久
grep eth0 /proc/interruptscat /proc/irq/45/smp_affinity_listecho "2,3" > /proc/irq/45/smp_affinity_list