2009-07-14 14 views
5

Zauważyłem, że mały program testowy, który wywołuje nanoseleep, wykazuje ogromną różnicę w wykorzystaniu procesora, gdy jest uruchomiony na maszynach Linux z jądrem nowszym niż 2.6.22.nanosleep użycia wysokiego 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; 
} 

(Tak, zdaję sobie sprawę, ten program nie robi nic)

Gdybym to skompilować i uruchomić go na openSUSE 10.3 maszyny (2.6.22.19-0.2 domyślny), program nie pojawi się nawet na liście procesów generowanych przez "top", wskazując mi, że używa bardzo mało czasu procesora. Jeśli uruchomię go na maszynie openSUSE 11.1 (2.6.27.23-0.1-default), góra pokazuje program zajmujący 40% czasu procesora. Uruchamianie w Fedorze 9 (2.6.25-14.fc9.i686) i Fedorze 10 również pokazało to samo wysokie użycie procesora w "top".

Czy nastąpiła zmiana w jądrze, która ma na to wpływ?

Odpowiedz

2

nie mam ostateczną odpowiedź ... ale pierwszą rzeczą, którą chciałbym spojrzeć na to opcje konfiguracyjne z którego jądro zostało skompilowane:

cat /boot/config-`uname -r` 

opcji, które myślę, że może być istotne są CONFIG_HZ , CONFIG_HPET_TIMER i CONFIG_HIGH_RES_TIMERS. Może te różnią się między twoimi ziarnami ... to może ci pomóc.

Kiedyś na jądrze 2.4, które nanosleep będzie zajęty-wait dla czeka poniżej 2 ms, jeśli działa w ramach polityk harmonogramu czasu rzeczywistego (SCHED_FIFO lub SCHED_RR, zobacz nanosleep man page), ale od wszystkich jądrach są 2,6, to nie wydaje się być czynnikiem.

18

Jest to spowodowane wprowadzeniem NO_HZ do głównego programu planującego.

Wcześniej Twój sen o wartości 1000 ns zwykle spał przez cały tyknięcie - 1 000 000 ns. Teraz, gdy maszyna jest bezczynna, w rzeczywistości spala tylko o to, o co prosiłeś. Tak więc działa pętla while() i syscall około 1000 razy częściej - stąd znacznie więcej procesorów. Jeśli zwiększysz tv_nsec, powinieneś zobaczyć zmniejszenie zużycia procesora.