You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在带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-2rcu_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

火山引擎 最新活动