无滴答内核,isolcpus,nohz_full和rcu_nocbs

时间:2016-06-30 01:32:23

标签: linux linux-kernel interrupt

我添加" isolcpus = 3 nohz_full = 3 rcu_nocbs = 3"在grub.conf中 RedHat 7.1,内核:linux 3.10.0-229内核并根据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次, else cpu 1到cpu 3每2秒少于10个。

然后我测试以下来源:

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每2秒获得10~30个本地定时器中断,看起来很好, 然后我尝试运行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会导致核心3有 更多的计时器中断?!这是怎么回事?! 如果可以的话,如何修改它?!

1 个答案:

答案 0 :(得分:9)

在第二种情况下,内核需要在核心3上安排2个cpu绑定任务,动态滴答配置仅在只有一个可运行任务时才适用。 我以为SCHED_FIFO会停止这些中断(所以我开始回答),但是还没有实现https://www.kernel.org/doc/Documentation/timers/NO_HZ.txt

除了在不同的CPU上调度线程之外,无法更改此行为。您可以随时破解内核以实现您的需求。