2009-07-14 13 views
5

私は、2.6.22より新しいカーネルを持つLinuxマシンで実行すると、nanosleepを呼び出す小さなテストプログラムがCPU使用量に大きな違いを見出していることに気付きました。ナノスリープ高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; 
} 

私はこれをコンパイルして(2.6.22.19-0.2-デフォルト)のopenSUSE 10.3のマシン上でそれを実行した場合

(はい、私はこのプログラムは何もしません実現)、プログラムにも表示されません。 "top"によって生成されたプロセスリスト上で、CPU時間がごくわずかであることを示しています。 openSUSE 11.1マシン(2.6.27.23-0.1-default)で実行すると、topにはCPU時間の40%を占めるプログラムが表示されます。 Fedora 9(2.6.25-14.fc9.i686)とFedora 10で実行すると、 "top"と同じ高いCPU使用率が示されました。

これに影響するカーネルに変更がありましたか?

答えて

2

私は決定的な答えを持っていない...しかし、私は見てしまうまず最初にカーネルがコンパイルされたとの設定オプションがある:私は、関連するかもしれないと思う

cat /boot/config-`uname -r` 

オプションがCONFIG_HZです、CONFIG_HPET_TIMERおよびCONFIG_HIGH_RES_TIMERS。たぶんあなたのカーネル間でそれらの違いがあります...あなたがそれを絞り込むのに役立つかもしれません。

、それは(SCHED_FIFOまたはSCHED_RRnanosleep man pageを参照してください)リアルタイムスケジューラポリシーの下で実行されている場合にnanosleepは2アンダーミリ秒の待機のために忙しく、待って2.4カーネル上にあるように使用されますが、カーネルのすべてが2.6であるため、それは要素ではないようです。

18

これは、メインラインスケジューラにNO_HZが導入されたためです。

これまでは、1000 nsの睡眠は、通常、1時間に一度の睡眠で1,000,000 nsでした。さて、マシンがアイドル状態になると、実際にはあなたが求めていたもののために眠っているだけです。だから、while()ループとsyscallを約1,000回頻繁に実行しています。したがって、より多くのCPU使用量があります。 tv_nsecを大きくすると、CPU使用率が低下するはずです。