我注意到,当在内核高于2.6.22的Linux机器上运行时,一个名为nanosleep的小测试程序在CPU使用率上显示出巨大的差异。
#include <time.h>
int main (void)
{
struct timespec sleepTime;
struct timespec returnTime;
sleepTime.tv_sec = 0;
sleepTime.tv_nsec = 1000;
while (1)
{
nanosleep(&sleepTime, &returnTime);
}
return 0;
}(是的,我意识到这个程序什么也做不了)
如果我编译这个程序并在openSUSE 10.3机器上运行它(2.6.22.19-0.2-默认),程序甚至不会出现在由"top“生成的进程列表中,这表明它占用的CPU时间非常少。如果我在openSUSE 11.1机器上运行它(2.6.27.23-0.1-默认),top显示程序占用了40%的CPU时间。运行在Fedora 9 (2.6.25-14.fc9.i686)和Fedora 10上的"top“也显示出相同的高CPU使用率。
内核中有没有影响这一点的变化?
发布于 2009-07-30 05:43:25
这是由于在主线调度器中引入了NO_HZ。
以前,你的1,000 ns睡眠通常是睡眠一整刻度-- 1,000,000 ns。现在,当机器处于空闲状态时,它实际上只是在按照您的要求休眠。因此,它运行while()循环和syscall的频率要高出1000倍-因此CPU使用率要高得多。如果您增加CPU,您应该会看到tv_nsec使用率的降低。
发布于 2009-07-14 14:28:56
我没有一个明确的答案...但我首先要看的是内核编译时使用的配置选项:
cat /boot/config-`uname -r`我认为可能相关的选项是CONFIG_HZ、CONFIG_HPET_TIMER和CONFIG_HIGH_RES_TIMERS。也许这些在你的内核中是不同的。或许能帮你缩小范围。
过去,如果在实时调度策略(SCHED_FIFO或SCHED_RR,请参阅nanosleep man page)下运行,nanosleep会在2.4内核上忙碌-等待低于2ms的等待,但由于所有内核都是2.6,这似乎不是一个因素。
https://stackoverflow.com/questions/1125297
复制相似问题