相关疑难解决方法(0)

实时Linux:禁用本地计时器中断

TL; DR:将Linux内核实时与NO_HZ_FULL一起使用,我需要隔离一个进程才能获得确定的结果,但是/ proc / interrupts告诉我仍然存在本地计时器中断(以及其他中断)。如何禁用它?

长版:

我想确保我的程序没有被中断,所以我尝试使用实时Linux内核。我使用的是Arch Linux的实时版本(AUR上的linux-rt),并且修改了内核的配置,以选择以下选项:

CONFIG_NO_HZ_FULL=y
CONFIG_NO_HZ_FULL_ALL=y
CONFIG_RCU_NOCB_CPU=y
CONFIG_RCU_NOCB_CPU_ALL=y
Run Code Online (Sandbox Code Playgroud)

然后我重新启动计算机,以使用以下选项在此实时内核上启动:

nmi_watchdog=0
rcu_nocbs=1
nohz_full=1
isolcpus=1
Run Code Online (Sandbox Code Playgroud)

我还禁用了BIOS中的以下选项:

C state
intel speed step
turbo mode
VTx
VTd
hyperthreading
Run Code Online (Sandbox Code Playgroud)

我的CPU(i7-6700 3.40GHz)具有4个内核(具有超线程技术的8个逻辑CPU),在/ proc / interrupts文件中可以看到CPU0,CPU1,CPU2,CPU3。

CPU1由isolcpus内核参数隔离,我想在此CPU上禁用本地计时器中断。尽管具有CONFIG_NO_HZ_FULL和CPU隔离(isolcpus)的实时内核足以做到这一点,但我尝试通过运行以下命令进行检查:

cat /proc/interrupts | grep LOC > ~/tmp/log/overload_cpu1
taskset -c 1 ./overload
cat /proc/interrupts | grep LOC >> ~/tmp/log/overload_cpu1
Run Code Online (Sandbox Code Playgroud)

过载过程在哪里:

***overload.c:***
int main()
{
  for(int i=0;i<100;++i)
    for(int j=0;j<100000000;++j);
}
Run Code Online (Sandbox Code Playgroud)

该文件overload_cpu1包含结果:

LOC:     234328        488      12091      11299   Local timer interrupts
LOC:     239072        651      12215 …
Run Code Online (Sandbox Code Playgroud)

real-time timer interrupt scheduler linux-kernel

5
推荐指数
1
解决办法
2605
查看次数

标签 统计

interrupt ×1

linux-kernel ×1

real-time ×1

scheduler ×1

timer ×1