在带RT补丁的CentOS 7 x86机器上禁用1-2核定时器中断求助
解决RT补丁CentOS7隔离核受定时器中断干扰的问题
从你提供的系统信息来看,核心问题出在Local timer interrupts(LOC)——隔离的CPU1和CPU2上有大量LOC中断计数,这正是干扰实时进程的元凶。虽然你已经配置了nohz_full=1-2,但还有几个关键配置需要调整,下面一步步来解决:
1. 定位问题根源
看/proc/interrupts的输出,CPU1和CPU2的LOC中断数都在3亿左右,说明这两个核心一直在接收本地定时器的周期性中断,而nohz_full的作用就是让隔离核脱离周期性tick,显然这里没有完全生效。
2. 手动绑定LOC中断到非隔离核
LOC中断默认会绑定到所有CPU,我们需要把它限制在CPU0上:
- 查看当前LOC中断的CPU亲和性:
cat /sys/devices/system/cpu/cpu1/irq/LOC/smp_affinity cat /sys/devices/system/cpu/cpu2/irq/LOC/smp_affinity - 修改为只允许CPU0处理LOC中断(
01是十六进制,对应CPU0的位掩码):echo 01 > /sys/devices/system/cpu/cpu1/irq/LOC/smp_affinity echo 01 > /sys/devices/system/cpu/cpu2/irq/LOC/smp_affinity - 持久化设置:把这两行命令加到
/etc/rc.d/rc.local,并确保rc.local有执行权限:chmod +x /etc/rc.d/rc.local
3. 清理隔离核上的非实时进程/线程
即使隔离了核心,有些内核线程可能还是会跑上去,抢占实时进程的时间片:
- 查看当前绑定到CPU1/2的进程:
ps -eo pid,cmd,psr | grep -E '1|2' - 把非实时进程/内核线程绑定到CPU0,比如用
taskset:taskset -pc 0 <目标PID> - 确认
isolcpus生效:检查/sys/devices/system/cpu/isolated,应该输出1,2
4. 优化RCU配置(可选但推荐)
你已经加了rcu_nocbs=1-2和rcu_nocb_poll,但rcu_nocb_poll可能会带来额外的周期性唤醒。如果你的场景对延迟要求极高,可以尝试去掉rcu_nocb_poll,改用rcu_nocbs=1-2 rcu_expedited,让RCU在隔离核上的处理更高效。
5. 验证效果
调整完成后,重新查看/proc/interrupts,观察CPU1和CPU2的LOC计数是否停止快速增长。同时可以用perf工具监控实时进程的中断情况:
perf record -g -a -e irq:* -p <实时进程PID> perf report
如果LOC中断不再出现在隔离核上,说明配置生效,实时进程的中断干扰会大幅减少。
内容的提问来源于stack exchange,提问作者Moses Reuben




