我在RedHat 7.1的grub.conf,kernel:linux 3.10.0-229内核中添加了“isolcpus = 3 nohz_full = 3 rcu_nocbs = 3”,根据http://www.breakage.org/2013/11/15/ nohz_fullgodmode /我也执行以下命令:
cat /sys/bus/workqueue/devices/writeback/cpumask f echo 1 > /sys/bus/workqueue/devices/writeback/cpumask cat /sys/bus/workqueue/devices/writeback/numa 1 echo 0 > /sys/bus/workqueue/devices/writeback/numa
这个盒子只有4个cpu核心,我运行下面的shell:
watch -d 'cat /proc/interrupts'
看起来像完美的工作,只有cpu0本地定时器中断每2秒2000,其他CPU 1到CPU 3每秒不到10。
然后我testing下面的来源:
void *Thread2(void *param) { pthread_detach(pthread_self()); while( 1 ){ sleep( 100000 ) ; } } void *Thread1(void *param) { pthread_detach(pthread_self()); while( 1 ){ ; } } int main(int argc, char** argv) { pthread_t tid ; pthread_create(&tid , NULL, Thread1, (void*)(long)3); pthread_create(&tid , NULL, Thread2, (void*)(long)3); while( 1 ) sleep( 5 ) ; }
并运行它:
taskset -c 3 ./x1.exe
观看输出:
watch -d 'cat /proc/interrupts'
这一次,CPU 3得到10〜30每2秒本地计时器中断,看起来不错,然后我尝试运行2 thread1通过:
pthread_create(&tid , NULL, Thread1, (void*)(long)3); pthread_create(&tid , NULL, Thread1, (void*)(long)3);
然后再运行它:
taskset -c 3 ./x1.exe
那么我看到核心3具有相同的本地定时器中断与核心0,它是每2秒2000中断。
请问,为什么2非常繁忙的thread1会导致core3有更多的定时器中断呢? 这是什么原因呢? 以及如何修改它?
在第二种情况下,内核需要在核心3上安排2个cpu绑定任务,动态滴答配置仅适用于只有一个可运行任务。 我以为SCHED_FIFO会停止这些中断(所以我开始回答),但是还没有按照https://www.kernel.org/doc/Documentation/timers/NO_HZ.txt
除了在不同的CPU上调度线程,没有办法改变这种行为。 你总是可以破解内核来实现你所需要的。