6

我注意到一个调用 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 使用率。

内核中是否发生了影响这一点的变化?

4

2 回答 2

22

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

以前,您的 1,000 ns 睡眠通常是在整个滴答声中睡眠 - 1,000,000 ns。现在,当机器处于闲置状态时,它实际上只是按照您的要求而休眠。因此,它运行 while() 循环和系统调用的频率提高了大约 1,000 倍——因此 CPU 使用率更高。如果增加 tv_nsec,您应该会看到 CPU 使用率降低。

于 2009-07-30T05:43:25.113 回答
3

我没有明确的答案......但我首先要看的是编译内核的配置选项:

cat /boot/config-`uname -r`

我认为可能相关的选项CONFIG_HZCONFIG_HPET_TIMERCONFIG_HIGH_RES_TIMERS。也许这些在您的内核中有所不同......这可能会帮助您缩小范围。

它曾经在 2.4 内核上,如果在实时调度程序策略下运行 nanosleep 会忙等待 2 毫秒以下的等待(SCHED_FIFO或者SCHED_RR,请参阅nanosleep 手册页),但由于所有内核都是 2.6,因此不会似乎是一个因素。

于 2009-07-14T14:28:56.487 回答