IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

while consommateur de cpu ?


Sujet :

Linux

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut while consommateur de cpu ?
    Bonjour à tous. Je rencontre un problème avec une application. Celle-ci consomme anormalement beaucoup de CPU (quasiement 50%), meme quand elle ne "fait rien". Elle comporte en fait une boucle principale contenant un "while" (comprenant meme "au cas ou" un "usleep" à la fin).Il y a peu de temps, cette application ne consommait que 0.1 de cpu, taux normal pour un petit processus de ce type (c'est un bot IRC). Apres une mise a jour de ma distribution (je ne sais pas si ce vient du kernel, de la libc, ou d'autre chose),cette application consomme 50% CPU.
    Je constate que quand je l'heberge sur une ancienne distrib (avec noyau 2.4), pas de souci, elle est bien à 0.1%. Sur ma fedora (kernel 2.6.23 et glibc 2.7), elle consomme 50%.
    Histoire de faire un test, j'ai fait un programme ne contenant que cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <unistd.h>
    int main()
    {
            while (1) 
                    usleep(5);
    }
    De la meme facon, sur mon pc ce code consomme presque 45% CPU alors que sur une distrib plus vieille, il ne consomme rien.
    Pourriez vous donc me dire s'il y a des précautions à prendre (outre un usleep tres long) lorsque l'on a un programme comportant une boucle permanante (cas d'un service tel un bot IRC) ? (ou meme dans l'exemple que je donne) pour ne pas avoir de consommation CPU (en tout cas pas autant).

    Merci par avance

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Par défaut
    fais un test en rajoutant en plus la commande 'i=0' (ou autre) dans ta boucle. Il me semble que ça résout ce genre de probleme meme si ça fait débutant.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut
    salut et merci pour ta réponse, mais amlheusreusement cela n'a rien changé chez moi.

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Passe à 1seconde ca devrait résoudre ton problème de CPU

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Par défaut
    t as fait une pause de 5 micro secondes !?!

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Un while(1) sans mise en sommeil prend énormément de temps CPU car ce dernier passe son temps à vérifier la condition de la boucle (dans ton cas je pense que tu as un processeur dual-coeur et un des deux coeurs est en fait utilisé à 100%). C'est une attente active...

    Ton sommeil de 5 microsecondes n'est pas suffisante.


    Si cela fonctionne avec un "vieux" noyau, cela signifie certainement que ce dernier ne respectait pas les 5µs (le temps d'attente de usleep() dépend aussi de la granularité du système, ce qui fait que tu pouvais très bien avoir une attente de 100ms déjà moins problématique).


    Donc comme cela a été dit la solution immédiate serait d'augmenter le temps d'attente à une valeur plus raisonnable.


    Et la meilleure solution serait d'utiliser une attente passive... mais là il faudrait savoir pourquoi tu utilises une telle attente (qu'est-ce que tu attends ?).


    a++

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut
    salut, j'ai mis usleep(250) et ca passe.
    Si je fais une attente, c'est justement pour ne pas avoir un processus qui consomme trop de cpu.

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par eponyme Voir le message
    salut, j'ai mis usleep(250) et ca passe.
    Si je fais une attente, c'est justement pour ne pas avoir un processus qui consomme trop de cpu.
    Mais pourquoi tu fais une attente active de la sorte ? Ici même avec 250µs cela revient à vérifier la condition 4000 fois par secondes

    Il y a surement mieux à faire...

    a++

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut
    si je ne mets rien, je consomme énormément de CPU.
    Donc j'ai mis ca pour diminuer la consomation.
    J'ai une telle boucle car mon programme est un processus qui doit tourner en permanance.

    epo

  10. #10
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par eponyme Voir le message
    si je ne mets rien, je consomme énormément de CPU.
    Donc j'ai mis ca pour diminuer la consomation.
    J'ai une telle boucle car mon programme est un processus qui doit tourner en permanance.

    epo
    mais ton programme ne fait que cela ? un while(1) ???

    Tu ne peux pas te mettre en attente plutot d'un signal ou d'un événement là tu ne consommerais carrément pas

  11. #11
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par eponyme Voir le message
    si je ne mets rien, je consomme énormément de CPU.
    Oui ca je sas très bien...

    Citation Envoyé par eponyme Voir le message
    J'ai une telle boucle car mon programme est un processus qui doit tourner en permanance.
    Mais je suppose que ta boucle ne se limite pas à cela...

    Ce type de boucle s'appelle une attente active : c'est à dire que tu attends en vérifiant une valeur assez souvent. Sans méthode de sommeil cela bouffe tout le CPU. En mettant une pause comme tu le fait le CPU est moins utilisé mais tu effectues quand même un grand nombre de vérifications de la condition...


    Dans bien des cas il est possible d'utiliser une attente passive qui endort le programme jusqu'à que l'attente soit fini (par exemple : attendre qu'un client se connecte sur une socket, que des données arrive dans un flux, etc.). Mais cela dépend de la raison pour laquelle tu fais une boucle...


    a++

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut
    Ce serait je suppose une solution qui s'applique a moi, puisque mon programme est un bot IRC .
    En fait j'ai un select pour eviter d'avoir une socket qui bloque en lecture. La seule raison est que mon bot peut prendre en charge des plugins qui doivent s'executer regulierement.

  13. #13
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Pour la petite histoire, les attentes actives sont très gourmandes en temps car le processus a besoin tout le temps de s'exécuter. L'OS change régulièrement de processus actif puisqu'un seul ne peut être exécuté en même temps (sauf cas particulier d emulti core, multi processeur).

    Un processus faisant par exemple une entrée sortie, un select sur un fd_set va s'endormir sur un événement et ne sera réveillé par le noyau que lorsque l'événement arrivera effectivement (en utilisant les fameuses primitives systèmes sleep et wakeup). En fait, comme ton processus s'est endormi, l'OS pourra switché avec d'autre processus et ton processus ne sera jamais remis dans le contexte d'exécution jusqu'à ce qu'il soit réveillé.

    Il faut savoir que le changement de contexte est couteux. Un processus ne faisant qu'un while(1) sans s'endormir va très fréquemment avoir besoin d'être remis dans le contexte et ça va encore plus prendre de CPU.
    En fait, la plupart des applications ne font que s'endormir et se réveiller.

    Pour ton truc, il faut éventuellement prévoir un système avec des synchronisations (par exemple pthread_cond_wait en C) ou se limiter à aller voir les mises à jour seulement toutes les 10 ou 20 sec (ce qui dans la plupart des cas est suffisant). Si tes plugins doivent s'exécuter régulièrement, tu peux lancer un thread en parallèle qui ne fera que lancer les plugins par exemple toutes les 20 sec

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut
    Bonne pioche !
    En passant mon select avec une attente supérieure a 0 secondes, la consommation cpu a fondu jusqu'a 0.1%
    Merci pour votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CPU] Sont-ils de grands consommateurs d'énergie?
    Par aziz jim dans le forum Composants
    Réponses: 28
    Dernier message: 30/03/2007, 22h52
  2. Récupérer la quantité de ressource disponible (RAM,CPU,HDD)
    Par telecnop dans le forum Programmation et administration système
    Réponses: 11
    Dernier message: 26/10/2005, 13h23
  3. Vitesse du CPU, quantité de RAM... en C
    Par dclink dans le forum C
    Réponses: 4
    Dernier message: 07/07/2003, 20h48
  4. Trouver le % d'utilisation du CPU
    Par le mage tophinus dans le forum Assembleur
    Réponses: 20
    Dernier message: 21/04/2003, 19h43
  5. Réponses: 3
    Dernier message: 25/11/2002, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo