• # Un indice...

    Posté par  . Évalué à 1.

    fopen ("/proc/loadaverage","r");
    ...
    • [^] # Re: Un indice...

      Posté par  . Évalué à 1.

      Merci.

      Cependant le fait de lire dans /proc veut-il dire qu'il faille une option dans le noyau ou bien est-ce implémenté d'office? Je pose la question histoire d'être sûr que l'application tournera sur n'importe qu'elle distribution.
      • [^] # Re: Un indice...

        Posté par  . Évalué à 2.

        C'est à mon avis présent par défaut sur toutes les distribs... mais bon je ne suis pas allé vérifier!
      • [^] # Re: Un indice...

        Posté par  (site web personnel) . Évalué à 3.

        /proc n'est pas portable. Même s'il est présent par défaut sur la plupart des distributions GNU/Linux, sur les *BSD par exemple il est souvent absent ou différent. Si tu veux un truc un minimum portable, vaut mieux s'arranger pour utiliser des appels systèmes standards que /proc mais j'avoue que dans ce cas ci je sais pas trop ce qui peut remplacer /proc/$PID/stat
        getloadavg(3) peut remplacer /proc/loadavg mais à part ça...et sysctl(2) n'est pas plus portable. Ceci dit si ton programme n'est censé tourner que sur des distributions GNU/Linux "normales", tu ne devrais pas avoir de problèmes.

        pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

    • [^] # Re: Un indice...

      Posté par  (site web personnel) . Évalué à 4.

      Et en quoi /proc/loadavg indique le pourcentage d'occupation CPU d'une application ?
      • [^] # Re: Un indice...

        Posté par  . Évalué à 4.

        Heuuuu... suffit de lire la question plus rapidement et de croire qu'on demande en fait la charge CPU globale :-)
  • # /proc

    Posté par  . Évalué à 1.

    Je pense que tu devrais trouvé cette information dans le repertoire /proc/<pid de ton process>

    A mon avis, c'est le fichier stat qui t'intéresse.
    Après, si tu veux être sur qu'il s'agisse la de la bonne méthode, je te conseille de regarder les sources de top et/ou ps ou, plus facile encore, tracer l'execution de l'une des ces 2 commandes (strace -o pouet ps aux && more pouet )
  • # Récupérer la charge processeur d'une application

    Posté par  . Évalué à 1.

    Ben les distros sans procfs son casi inexistante, et pour avoir le "load" d'un dit process vaut mieux voir dans /proc/$processID/qlqchoze !! :)

    cdlt
    • [^] # Re: Récupérer la charge processeur d'une application

      Posté par  . Évalué à 2.

      Je commence à trouver pas mal d'informations dans /proc/id/stat mais je ne trouve toujours pas le %CPU et %MEM affichés par top. J'ai tracé ce soft, il regarde bien stat ainsi que status et cmdline, mais je ne vois pas comment il calcule l'occupation processeur et mémoire ?

      Quelqu'un aurait-il une idée ?
      • [^] # Re: Récupérer la charge processeur d'une application

        Posté par  . Évalué à 4.

        Tu ne trouveras pas ces informations parce qu'elles n'ont pas forcément de sens ou parce qu'il est impossible d'avoir l'information.

        LE CPU
        =====

        Que signifie le %CPU ? Sur une machine monoprocesseur, lorsque le processus est actif, il consomme 100% du CPU. Lorsqu'il est en attente du processeur, il consomme 0% et lorsqu'il est en attente d'un evenement, il consomme également 0%.

        Le % d'occupation CPU n'a de sens que lorsqu'on fait une moyenne sur un certain intervalle de temps, mais la valeur va beaucoup varier en fonction des autres processus qui s'exécutent sur la machine.

        On peut éventuellement donner un peu de sens au temps CPU consommé sur un certain intervale, pour cela, tu vas trouver le temps CPU user, le temps CPU systeme et l'heure de démarrage du processus, tu peux alors calculer un ratio un peu comme tu veux en utilisant cela.

        La Mémoire
        ========

        Linux est un OS conçu de façon intelligente et supportant de nombreuses fonctionnalitées. Librairies, Swap, mémoire partagée, copie à l'écriture...

        Regarde donc le fichier /proc/self/maps

        Lorsqu'un processus s'exécute, le binaire est chargé en mémoire; mais si le même programme est lancé deux fois et qu'il ne s'agit pas de code auto-modifiant (ce qui est mal), linux n'a en réalité qu'une seule copie en mémoire. Ca commence mal pour mesurer l'occupation mémoire.

        Les programmes utilisent des librairies dynamiques, qui ont le même avantage, on ne charge pas la libc pour chaque nouveau processus, seule une ou quelques pages sont propre à chaque processus. Est-ce qu'il faut compter les librairies dans la taille mémoire occupée ?

        Lorsque l'OS a besoin de place en mémoire, il envoi les données dans le SWAP, faut-il compter cette mémoire ? S'il s'agit de mémoire correspondant à l'image d'un fichier (exécutable par exemple) et que la page est intacte, on n'a même pas besoin de la mettre dans le swap puisqu'on pourra la relire directement sur le disque.

        Lorsqu'un processus réclame de la mémoire, elle n'est pas forcément allouée à ce moment là, mais plutot au premier accès qui sera fait, on ne sait donc pas trop s'il faut compter cette mémoire ou non.

        Ca continue, on peut mapper des fichiers en mémoire, est-ce que c'est réellement de la mémoire occupée ? On peut partager de la mémoire entre plusieurs processus, même problème.

        Enfin un processus qui va faire des I/O disque va occuper de nombreuses pages mémoire dans le cache disque, ces pages peuvent être occupées uniquement pour ce processus, pourtant elles sont dans le noyau et on aura toutes les peines du monde à retrouver le processus correspondant.

        L'occupation mémoire est donc une notion très très vague qu'il n'est pas réellement possible de définir. Le fichier maps donne l'espace mémoire d'un processus, sans dire s'il y a réellement de la mémoire occupée derrière.
      • [^] # Re: Récupérer la charge processeur d'une application

        Posté par  (site web personnel) . Évalué à 1.

        En faisant man proc on a de plus amples informations sur ce que contiennent comme valeurs les fichiers dans /proc/id, en particulier pour le fichier stat. Donc la mémoire utilisée se trouve dans ce fichier, que se soit la memoire totale nécessaire au programme et à ses fils où la mémoire spécifique... Une autre documentation détaillée est donnée dans le répertoire des sources du noyau dans Documentation/filesystem/proc.txt. Alors bien sûr pour avoir le pourcentage de mémoire il va te falloir récupérer la mémoire totale (aussi dans /proc) et faire une petite division, mais ça c'est la partie facile ;)

        Pour la charge processeur, je n'ai pas de réponse simple, voir pas de réponse du tout, je ne comprends pas ce que contient le fichier /proc/id/cpu et la documentation dont je t'ai parlé n'est pas très détaillée à ce sujet.
        • [^] # Re: Récupérer la charge processeur d'une application

          Posté par  . Évalué à 1.

          Merci à tous pour vos réponses. J'ai lu la doc de proc qui est assez détaillée. Je laisse tombé la charge processeur car, comme le dit Pierre Tramo, c'est finalement trés subjectif comme information.

          Par contre, pour la mémoire, même si effectivement les binaires sous format ELF partagent leurs librairies et codes communs, il m'est quand même intéressant de la calculer. Il suffit comme le dit justement Damien Caliste, de faire un petit calcul. Toutes les infos sont dans /proc/id/stats et proc/meminfo.

          Lorsque je développe une application, je m'assure constament de ne pas laisser des allocations mémoires se perdrent et ainsi grossirent l'occupation du soft en mémoire, voir assurer un bon plantage. Alors, même si la valeur calculée ne reflète pas forcement la juste vérité, elle est quand même un bon indicateur pour le développement ( enfin je pense ).

          Encore merci...
  • # Une idée ...

    Posté par  (site web personnel) . Évalué à 2.

    Et en faisant le rapport entre la valeur retournée par 'clock()' et le temps réellement écoulé ?

    Pour nous émanciper des géants du numérique : Zelbinium !

    • [^] # Re: Une idée ...

      Posté par  . Évalué à 2.

      Une autre idée dans le même style : voir getrusage(2)
      Cette fonction est censée renvoyer des infos sur les resources consommées par un/des processus (temps système/utilisateur, ...)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.