2009-07-14 14 views
5

Ho notato che un piccolo programma di test che chiama nanosleep sta mostrando un'enorme differenza nell'utilizzo della CPU quando viene eseguito su macchine Linux con un kernel più recente di 2.6.22.utilizzo della CPU ad alta nanosleep?

#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; 
} 

(Sì, mi rendo conto che questo programma non fa nulla)

Se compilo questo ed eseguirlo su una macchina di openSUSE 10.3 (2.6.22.19-0.2-default), il programma non ha nemmeno presentarsi sulla lista dei processi generata da "top", indicando che sta usando pochissimo tempo di CPU. Se lo eseguo su una macchina openSUSE 11.1 (default 2.6.27.23-0.1), la parte superiore mostra il programma che impiega il 40% del tempo della CPU. In esecuzione su Fedora 9 (2.6.25-14.fc9.i686) e Fedora 10 hanno mostrato lo stesso elevato utilizzo della CPU in "top".

C'è stato un cambiamento nel kernel che influisce su questo?

risposta

2

Non ho una risposta definitiva ... ma la prima cosa che vorrei guardare è l'opzioni di configurazione con cui il kernel è stato compilato:

cat /boot/config-`uname -r` 

Opzioni che penso potrebbero essere rilevanti sono CONFIG_HZ , CONFIG_HPET_TIMER e CONFIG_HIGH_RES_TIMERS. Forse quelli differiscono tra i tuoi chicchi ... che potrebbero aiutarti a restringere il campo.

E 'usato per essere sul kernel 2.4 che nanosleep sarebbe occupato-attendere attese di sotto dei 2 ms se in esecuzione nel quadro delle politiche di pianificazione in tempo reale (SCHED_FIFO o SCHED_RR, vedere la nanosleep man page), ma dal momento che tutti i kernel sono 2.6, non sembra essere un fattore.

18

Ciò è dovuto all'introduzione di NO_HZ nello scheduler principale.

In precedenza, il sonno di 1.000 ns di solito dormiva per un intero tick - 1.000.000 ns. Ora, quando la macchina è inattiva, in realtà sta dormendo solo per quello che hai chiesto. Quindi esegue il ciclo while() e syscall circa 1.000 volte più frequentemente, quindi un utilizzo della CPU molto maggiore. Se si aumenta tv_nsec si dovrebbe vedere una riduzione dell'utilizzo della CPU.

Problemi correlati