nanosleep高CPU使用率?

5 linux sleep cpu-usage linux-kernel

我注意到一个叫做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;
}
Run Code Online (Sandbox Code Playgroud)

(是的,我意识到这个程序什么都不做)

如果我编译它并在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使用率.

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

caf*_*caf 19

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

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


Mar*_*n B 3

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

cat /boot/config-`uname -r`
Run Code Online (Sandbox Code Playgroud)

我认为可能相关的选项是CONFIG_HZ和。也许您的内核之间的差异......这可能会帮助您缩小范围。CONFIG_HPET_TIMERCONFIG_HIGH_RES_TIMERS

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