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)