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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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++

+ 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