nanosleep高CPU使用率?

时间:2009-07-14 13:13:58

标签: linux linux-kernel sleep cpu-usage

我注意到一个叫做nanosleep的小测试程序在使用内核比2.6.22更新的Linux机器上运行时显示出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-default),程序甚至不会出现在“top”生成的进程列表中,向我表明它正在使用它CPU时间很少。如果我在openSUSE 11.1机器上运行它(2.6.27.23-0.1-default),top会显示该程序占用40%的CPU时间。在Fedora 9(2.6.25-14.fc9.i686)上运行,Fedora 10也在“top”中显示了相同的高CPU使用率。

内核是否有影响这个的变化?

2 个答案:

答案 0 :(得分:18)

这是由于NO_HZ引入主线调度程序。

以前,您的1,000 ns睡眠通常是整个睡眠时间 - 1,000,000 ns。现在,当机器处于空闲状态时,它实际上只是为了你所要求的而睡觉。所以它运行while()循环和系统调用大约1000倍频繁 - 因此CPU使用率更高。如果你增加tv_nsec,你应该会看到CPU使用量的减少。

答案 1 :(得分:2)

我没有明确的答案......但我要看的第一件事是用于编译内核的配置选项:

cat /boot/config-`uname -r`

我认为可能相关的选项包括CONFIG_HZCONFIG_HPET_TIMERCONFIG_HIGH_RES_TIMERS。也许那些内核之间有所不同......这可能会帮助你缩小范围。

如果在实时调度程序策略(SCHED_FIFOSCHED_RR下运行,那么nanosleep将忙于等待2毫秒以下等待的2.4内核,请参阅nanosleep man page ),但由于所有内核都是2.6,这似乎不是一个因素。