Tout est dans le titre. Je désire afficher dans mon application son pourcentage d'occupation processeur comme peut le faire le logiciel "top". Le tout en C bien sûr.
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.
/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.
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 )
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 ?
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.
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.
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 ).
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, ...)
# Un indice...
Posté par calandoa . Évalué à 1.
...
[^] # Re: Un indice...
Posté par gerald dumas . Évalué à 1.
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 calandoa . Évalué à 2.
[^] # Re: Un indice...
Posté par Krunch (site web personnel) . Évalué à 3.
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 gc (site web personnel) . Évalué à 4.
[^] # Re: Un indice...
Posté par calandoa . Évalué à 4.
# /proc
Posté par LaBienPensanceMaTuer . Évalué à 1.
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 djamil . Évalué à 1.
cdlt
[^] # Re: Récupérer la charge processeur d'une application
Posté par gerald dumas . Évalué à 2.
Quelqu'un aurait-il une idée ?
[^] # Re: Récupérer la charge processeur d'une application
Posté par Sébastien Koechlin . Évalué à 4.
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 Damien Caliste (site web personnel) . Évalué à 1.
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 gerald dumas . Évalué à 1.
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 Claude SIMON (site web personnel) . Évalué à 2.
Pour nous émanciper des géants du numérique : Zelbinium !
[^] # Re: Une idée ...
Posté par Bastien Mourgues . Évalué à 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.