2009-07-14 14 views
5

J'ai remarqué qu'un petit programme de test qui appelle nanosleep montre une énorme différence dans l'utilisation du processeur lorsqu'il est exécuté sur des machines Linux avec un noyau plus récent que 2.6.22.nanosleep haute utilisation du processeur?

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

(Oui, je sais que ce programme ne fait rien)

Si je compile ce et l'exécuter sur une machine openSUSE 10.3 (2.6.22.19-0.2 par défaut), le programme ne montre même pas sur la liste de processus générée par "top", m'indiquant qu'il utilise très peu de temps CPU. Si je l'exécute sur une machine openSUSE 11.1 (2.6.27.23-0.1-default), le haut montre que le programme prend 40% du temps CPU. En cours d'exécution sur Fedora 9 (2.6.25-14.fc9.i686) et Fedora 10 ont également montré la même utilisation élevée du processeur dans "top".

Y at-il eu un changement dans le noyau qui affecte cela?

Répondre

2

Je n'ai pas de réponse définitive ... mais la première chose que je regarderais est les options de configuration avec laquelle le noyau a été compilé:

cat /boot/config-`uname -r` 

options que je pense peut-être pertinents sont CONFIG_HZ , CONFIG_HPET_TIMER et CONFIG_HIGH_RES_TIMERS. Peut-être que ceux-ci diffèrent parmi vos noyaux ... cela pourrait vous aider à le réduire.

Il fut un temps sur les noyaux 2.4 que nanosleep serait une boucle d'attente pour les temps d'attente de moins de 2 ms en cas d'exécution en vertu des politiques de planificateur en temps réel (SCHED_FIFO ou SCHED_RR, voir le nanosleep man page), mais étant donné que tous les noyaux sont 2,6, cela ne semble pas être un facteur.

18

Cela est dû à l'introduction de NO_HZ dans le planificateur de ligne principale.

Auparavant, votre sommeil de 1 000 ns dormait habituellement pendant une tique entière - 1 000 000 ns. Maintenant, quand la machine est inactive, elle ne fait que dormir pour ce que vous avez demandé. La boucle while et syscall est donc 1000 fois plus utilisée, d'où une utilisation beaucoup plus importante du processeur. Si vous augmentez tv_nsec, vous devriez voir une réduction de l'utilisation du processeur.