无滴答内核,isolcpus,nohz_full,和rcu_nocbs
tickless kernel , isolcpus,nohz_full,and rcu_nocbs
我在grub.conf中添加了"isolcpus=3 nohz_full=3 rcu_nocbs=3"
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 by :
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会导致core 3有
更多的定时器中断?!是什么原因造成的?!
以及如果可以的话如何修改?!
在第二种情况下,内核需要在核心 3 上调度 2 cpu 个绑定任务,并且动态 ticks 配置仅在只有一个可运行任务时才适用。
我以为 SCHED_FIFO 会停止这些中断(所以我开始回答),但尚未按照 https://www.kernel.org/doc/Documentation/timers/NO_HZ.txt
实施
除了在不同的 CPU 上调度线程外,没有办法改变这种行为。你总是可以破解内核来实现你需要的。
我在grub.conf中添加了"isolcpus=3 nohz_full=3 rcu_nocbs=3" 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 by :
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会导致core 3有 更多的定时器中断?!是什么原因造成的?! 以及如果可以的话如何修改?!
在第二种情况下,内核需要在核心 3 上调度 2 cpu 个绑定任务,并且动态 ticks 配置仅在只有一个可运行任务时才适用。 我以为 SCHED_FIFO 会停止这些中断(所以我开始回答),但尚未按照 https://www.kernel.org/doc/Documentation/timers/NO_HZ.txt
实施除了在不同的 CPU 上调度线程外,没有办法改变这种行为。你总是可以破解内核来实现你需要的。