Pour une expérience, il me faut collecter les informations de charge CPU et mémoire d'un ordinateur pendant qu'un·e utilisatrice réalise des tâches dessus. En gros: ressortir les histogrammes des moniteurs systèmes.
C'est le même objectif que dans ce post askubuntu.
Les outils et implémentations disponibles
- un script avec
top
etgnuplot
C'est la solution qui me paraît la meilleure, car la plus simple. Elle vient de là.
#!/bin/sh
# Source: https://dzone.com/articles/monitoring-process-memorycpu-usage-with-top-and-pl
# Date: 2013
# Usage: ./monitor-usage.sh <PID of the process>
# Output: top.dat with lines such as `1539689171 305m 2.0`, i.e. unix time - memory with m/g suffix - CPU load in %
# To plot the output, see https://gist.github.com/jakubholynet/931a3441982c833f5f8fcdcf54d05c91
export PID=$1
rm top.dat
while true
do
top -bp $PID -bn 1 | egrep '^[0-9]+' | awk -v now=$(date +%s) '{print now,$6,$9}' >> top.dat
done
Je fais pourtant face à deux difficultés:
* Le fichier output.dat reste vide :-/
* Le script permet de suivre un PID précis, mais pas l'ensemble des processus.
atop
Me semble déjà "overkill" avec sa longue page de manuel.
La commande
atop -M 5 15 > atop.mem
me sort un fichier déjà bien conséquent avec beaucoup trop d'informations.
-
mpstat
du paquet sysstat La commande
(mpstat -P ALL; echo; free) > sysinfo.txt
me sort un fichier plus lisible, mais je ne sais pas comment automatiser la commande chaque 5 seconde.
Je suis convaincu qu'un petit script activant les outils basiques de GNU/Linux fera l'affaire, mais possède des connaissances limitées de ces outils et de bash. Les solutions comme Glances, Collectl ou nmon sont trop développées pour mon besoin.
Une bonne âme peut-elle m'orienter?
# Toutes les 5 secondes
Posté par Dareg . Évalué à 6.
Si tu veux exécuter la commande toutes les cinq secondes, tu peux la lancer dans une boucle et y ajouter un sleep:
[^] # Re: Toutes les 5 secondes
Posté par leyouki (site web personnel, Mastodon) . Évalué à 1.
Merci!
J'ai modifié la commande comme suit:
et obtiens ce résultat:
…qui m'offre les données nécessaires. Pour le CPU je compte prendre le %idle et l'inverser (sur 100) pour déterminer la charge. Pour la mémoire je veux prendre la colonne "utilisé".
Comment sélectionner ces données choisies pour les visualiser grâce à gnuplot, c'est la prochaine étape.
# sar ou atop
Posté par cg . Évalué à 6.
Les commandes
sar
(danssysstat
) etatop
font la collecte de plein de métriques.atop
etsar
peuvent tourner en démon et permettent de rejouer les fichiers.sadf
permet de convertir les données collectées parsar
en graphes, entre autres.[^] # Re: sar ou atop
Posté par leyouki (site web personnel, Mastodon) . Évalué à 1.
Merci!
sar
etsadf
au lieu detop
etgnuplot
. Ok, je lis la doc.[^] # Re: sar ou atop
Posté par Pol' uX (site web personnel) . Évalué à 3. Dernière modification le 15 février 2022 à 19:13.
Voire
atopsar
:)Adhérer à l'April, ça vous tente ?
[^] # Re: sar ou atop
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 2.
Tout à fait ; il m'a fait penser à
sar
en lisant. Par contre, je ne connaissais pas ce côté deatop
(jamais pris le temps de l'utiliser à fond) donc merci pour la découverte.“It is seldom that liberty of any kind is lost all at once.” ― David Hume
# Perso…
Posté par PR . Évalué à 6. Dernière modification le 14 février 2022 à 18:56.
… j’utiliserai l’outil standard.
Un simple
ps
devrait déjà faire le taf.Attention le
%cpu
n’est pas un “instantané” (au besoin il faudra faire un peu d’arithmétique autour).PS : tu peux sélectionner tous les process de la machine (
-e
), les trier, et tout et tout.Mort aux cons !
[^] # Re: Perso…
Posté par leyouki (site web personnel, Mastodon) . Évalué à 1.
Merci!
Elle va droit au but ta commande
ps
! :-)avec
j'obtiens:
Après lecture du manuel, il n'est pas possible avec
ps
d'obtenir un résultat global pour l'ensemble des processus. Une piste pour faire un total de chacune des deux colonnes?[^] # Re: Perso…
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 2. Dernière modification le 16 février 2022 à 00:37.
Je ne sais pas quel sens tu veux donner aux sommes, mais bon
Au fait… Pourquoi un sous-processus ? Et pourquoi cet écho ?
“It is seldom that liberty of any kind is lost all at once.” ― David Hume
[^] # Re: Perso…
Posté par leyouki (site web personnel, Mastodon) . Évalué à 1.
yes!
Par somme j'entends la somme des charges de tous les PID. Je comprends pas ta question sur le sous-processus. L'echo me sert à vérifier le résultat. Mon objectif est de collecter des données simples de charge CPU et mémoire pendant l'usage du système par un utilisateur, puis de les visualiser dans un graphique.
D'ailleurs j'suis pas certain d'obtenir ça avec les keywords %cpu et %mem…
[^] # Re: Perso…
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 2. Dernière modification le 11 mars 2022 à 18:13.
Le/la code/commande que je donne fait les sommes deux colonnes
%cpu
et%mem
; mais je ne sais si tu comprends bien toutes les implications… (En terme de mémoire, y a pas que la RAM par exemple, y a aussi l'usage de la swap et toutes sortes de mémoires disponibles. De même pour la CPU va prendre en compte le nombre de processeurs de la machine et leur nombre de cœurs, etc.)Pour voir la charge, ou load average, tu as trois valeurs qui te sont retournées par la commande
uptime
et répondent exactement à cela.Pour voir la mémoire utilisée et libre, il faut se tourner vers la commande
mem
qui répond simplement à ce point.Tu crées un sous-processus avec la parenthèse : ça veut dire que ton interpréteur (
bash
par exemple mais ça marche pour les autres shell aussi) va lancer une autre instance de lui-même qui va exécuter la(s) commande(s) de façon séparée. C'est presque comme si tu faisaisbash -c "commande"
dans le cas présent.Pour grouper des commandes (i.e. faire l'équivalent d'un bloc de commandes, afin de rediriger le contenu de toutes dans un fichier dans le cas présent), ce sont les accolades et non les parenthèses. Mais avec une petite subtilité dans son usage…
“It is seldom that liberty of any kind is lost all at once.” ― David Hume
[^] # Re: Perso…
Posté par PR . Évalué à 2.
Pour des agrégats, si tu tiens à scripter toi-même et, mettre les mains dans le cambouis, tu peux directement taper dans les stat. exposées par le noyau : /proc/meminfo, /proc/loadavg, /proc/stat, classiquement données fournies via les outils plus user-friendly et plus portables
free
,uptime
,top
,ps
, etc.https://www.kernel.org/doc/html/latest/filesystems/proc.html
Mort aux cons !
[^] # Re: Perso…
Posté par leyouki (site web personnel, Mastodon) . Évalué à 1.
Hyper intéressant, mais overkill. Tous ces types de mémoire me perdent 😬
# reinventer la roue ?
Posté par NeoX . Évalué à 8.
ton output.dat reste vide car tu remplis top.dat ;)
sinon plutot que de reinventer la roue (mais c'est peut-etre pour un exercice)
tu as SNMP :
c'est d'ailleurs comme cela qu'on collecte les métriques dans beaucoup de solution de monitoring
[^] # Re: reinventer la roue ?
Posté par leyouki (site web personnel, Mastodon) . Évalué à 1.
Merci!
Tu m'orientes vers les bonnes pratiques de monitoring. Pour moi (mon objectif et mes connaissances) c'est cependant trop complexe: un protocole nouveau, un démon à mettre en place, un client, …
Bien vu entre output.dat et top.dat! J'ai corrigé et le fichier .dat reste cependant vide.
[^] # Re: reinventer la roue ?
Posté par NeoX . Évalué à 4.
parce que top est un programme interactif, il ne rendra la main que quand tu le quitte
donc ton '|' (pipe) ne fonctionnera qu'a la fin de ce dernier.
il faut donc utiliser des programmes non interactifs ou des options à top pour qu'il ne tourne qu'une seule fois
[^] # Re: reinventer la roue ?
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 2.
par exemple
“It is seldom that liberty of any kind is lost all at once.” ― David Hume
[^] # Re: reinventer la roue ?
Posté par gUI (Mastodon) . Évalué à 3.
sauf si tu lui demandes poliment :
top -b | head
-b
c'est le batch mode, mais il n'a l'air de marcher que si tu|
derrière.Quelques exemples ici
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: reinventer la roue ?
Posté par leyouki (site web personnel, Mastodon) . Évalué à 1.
Merci. Malgré la présence de l'option
-b
, le script ne tourne pas. De plus il ne sert l'usage que d'un PID alors que je veux l'usage général du système.[^] # Re: reinventer la roue ?
Posté par NeoX . Évalué à 3.
mais plus haut, tu n'es pas contre installé/utilisé SAR (qui contient un daemon, un client…) ???
note que SNMP est certes un protocole, mais tu n'as besoin que de connaitre les OIDs de ce que tu recherches, et pour apprendre tu affiches l'arbre complet, et tu regardes les OIDs.
en plus, contrairement à SAR qui ne sera surement dispo que sous linux et bsd, SNMP est utilisé par plein d'appareil (windows, linux, BSD, routeur, imprimante, switch, AP wifi, box opérateur, parefeu, NAS)
donc ce que tu veux faire en TOP/SAR sur ton linux, tu pourrais faire la meme chose en SNMP sur tous les appareils de ton reseau par exemple
[^] # Re: reinventer la roue ?
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 4.
Tu seras surpris par le nombre de projets qui réinventent la roue… collectd a le vent en poupe pour faire sa métrologie avec influxdb et graphana
“It is seldom that liberty of any kind is lost all at once.” ― David Hume
# Netdata
Posté par n.rigaud . Évalué à 4.
Hello,
C'est peut être une solution surdimensionnée par rapport à ton besoin, mais elle peut y répondre. Netdata est un logiciel open source qui permet de collecter et visualiser de très nombreux indicateurs système. C'est une solution simple à installer en particulier si on se contente des paramétrages par défaut.
C'est par ici: https://github.com/netdata/netdata
# ça avance :-)
Posté par leyouki (site web personnel, Mastodon) . Évalué à 1.
Voici où j'en suis, grâce à vos contributions :
Mémoire
J'ai suivi le conseil de Gil Cot d'utiliser
mem
, mais c'est pas vraiment une commande alorsfree
fait l'affaire.Je prends la variable Disponible/Available. Selon le manuel, elle correspond à mon besoin d'information. Cependant le swap est laissé de côté.
CPU
Ici
uptime
donne une valeur utilisable de la charge CPU. Comme elle n'est pas générique à tous les systèmes, je dois faire attention au multi-coeur et multi-thread: une valeur de 1.00 sur un quadcore équivaut à une valeur de 0.25 sur singlecore.Visualisation
Avec ces données je vais pouvoir faire un bel histogramme avec la mem et le cpu en y, et le temps en x.
Par contre j'ai des difficultés à importer cela dans LibreOffice Calc. Il semble reconnaître le caractère de tabulation (
/t
), mais ne le prend pas en compte pour place les données dans de nouvelles colonnes.Alors que je veux une structure de csv comme ça:
date | mem | cpu
date2 | mem | cpu
…
daten | mem | cpu
Comment créer un fichier
csv
qui ordonne les données par ligne?[^] # Re: ça avance :-)
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 2.
Oui, pardon, me suis un peu mélange avec la fatigue puis ne suis pas revenu quand je me suis rendu compte une bonne heure après que j'avais écrit mem au lieu de
free
! Comme tu cherches la quantité libre, prendre en compte la swap n'a pas de sens …parce-que idéalement il ne faut pas en avoir besoin et ne pas se dire que c'est de la mémoire qui est disponible normalement pour les programmes : quand ça swape c'est pas bon. Par ailleurs, tu peux régler le système pour ne pas utiliser la mémoire swap ou contrôler à quel seuil de saturation de la RAM il faut commencer à basculer. Mais en mode rapport, tu ne comptes pas sa présence sinon tu risques de croire que t'as assez de mémoire vive dispo au lieu de voir que ça sature, et sinon tu auras aussi du mal à expliquer aux hiérarchies qui sont de moins en moins technique quand on monte.Oui, pour le processeur il faut tenir compte du nombre de cœur, et même parfois si tu fais de l'hyperthreading ! Lire par exemple les échanges sur https://unix.stackexchange.com/questions/218074/how-to-know-number-of-cores-of-a-system-in-linux
Je te propose ceci, à faire avant d'entrer dans la boucle :
Si tu regardes ton fichier dans un éditeur de texte, tu verras que la faute n'est pas du côté de LibreOffice (ou n'importe quel autre tableur.) En effet, chaque commande se termine par un saut de ligne…
Dans la boucle, j'utiliserai plutôt quelque chose comme :
J'ai un petit doute sur la 7ème colonne (compressed) : tu devrais utiliser la 3ème (used) ou la 4ème (free) non ?
Sinon, j'ai supprimé le
grep
pour l'intégrer directement dans leawk
De l'autre côté, j'ai passé la valeur du nombre total de cœurs pour adapter le résultat comme tu le souhaitais. Mais j'ai un petit doute sur le dixième champ :
J'en profite pour reparler de
top
; faut que t'essaye, juste pour la/le curiosité/fun…Maintenant, il parait que je n'est pas la manière propre/canonique d'écrire les scripts : j'ai trop de vieux réflexes. Voici la correction pour que ce soit plus lisible et facile à maintenir :
Maintenant, j'ai une réserve sur
echo -e
: ce n'est pas portable (ton programme ne marchera pas comme espéré si tu utilises un autre interpréteur que bash ou peut-être sur une autre distribution dont l'implémentation de la commande ne supporte pas cette option…) Voici la bonne façon de faire :J'espère n'avoir rien oublié et te laisse recoller les morceaux. :-)
“It is seldom that liberty of any kind is lost all at once.” ― David Hume
[^] # Re: ça avance :-)
Posté par leyouki (site web personnel, Mastodon) . Évalué à 1.
trop beau! Merci! Et ne t'excuse pas: j'ai appris plein de choses en lisant et relisant tes commentaires et bouts de code!
Dans mon système la 7ème colonne de la ligne Mem: résultant de la commande
free
correspond à la mémoire disponible, pas à la la mémoire compressed.Tout me semble bien, si ce n'est que les données ne sont pas enregistrées 🥲 J'ai essayé plein de bidouilles mais n'y parvient pas:
[^] # Re: ça avance :-)
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 2. Dernière modification le 17 mars 2022 à 15:01.
Essaye en ligne de commande directement pour voir si ça affiche quelque chose ; peut-être qu'une erreur de syntaxe fait que la commande ne va pas au bout ?
Comme ça semble se gâter au second, peut-être qu'il y a un truc juste avant qu'il n'aime pas ; essaye ceci :
Pendant que j'écris cette réponse je me rend compte qu'il y a une petite erreur que j'avais pas vu en lisant : ton premier appel à AWK n'a pas de fichier sur lequel travailler …et n'est pas branché sur l'entrée standard par le pipe sur une autre commande. (c'est probablement à partir de là que ça part en vrille…)
edit : je viens de relire, et j'avais laissé une erreur dans ma réponse. la comparaison avec la version
echo
donne la réponse :“It is seldom that liberty of any kind is lost all at once.” ― David Hume
[^] # Re: ça avance :-)
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 2.
Arf, quand je disais que j'ai une écriture cryptique de dinosaure du shell
Faut vraiment que je fasse gaffe quand je réponds sur les fora, pour ne pas embrouiller inutilement comme ici.
Ce n'est pas exactement ça, enfin ce n'est pas le sens du double pipe… Je m'explique par des exemple
Ma syntaxe n'est pas conseillée en général parce-que si on ne la comprend pas on aura des effets de bord… Pour la partie en question, la syntaxe claire (pas besoin d'être gourou du shell pour comprendre) et sans effet de bord est
Quand la commande existe, son chemin dans le PATH est renvoyé sur la sortie standard, raison pour laquelle je rajoute la redirection vers
/dev/null
pour ne pas polluer la version finale. En phase d'élaboration c'est utile pour s'assurer qu'on passe bien par là.En relisant, je vois que j'avais pris soin de faire la transition
C'est juste les définition de variables juste avant qui ne collaient plus. Voici la correction que tu aurais du faire :
Mais bon, ça t'aurais permis de voir une des façon de déboguer du script shell :
set -x
va afficher tout ce qu'il fait avant de le faire, sorte de mode trace… Et aussi, souvent, pendant la phase de conception, on met desecho
de vérification. Pour la version finale, quand c'est critique, on peut utiliserset -e
qui fait planter (arrêter le script) quand une ligne est en erreur, au lieu de poursuivre en propageant des trucs incorrects. Tu peux aussi l'utiliser pour déboguer, par exemple dans le cas ci :(me semble que les affectations ne sont malheureusement pas en erreur, et puis les échos permettent aussi de savoir où on plante …sauf si on a cumulé avec
set -xe
par exemple. c'est à toi de voir et d'adapter au cas par cas.)Attention que
echo
termine par un retour à la ligne, et qu'il faut explicitement rajouter celui-ci pourprintf
qui te laisse gérer ton affichage.Mais c'est une bonne idée d'avoir les (noms des) champs sur la première ligne, histoire de savoir rapidement quoi est où sans devoir aller voir dans le code. Accessoirement, on note cette ligne comme un commentaire shell car beaucoup d'outils reconnaissent cela et sauteront la ligne (c'est le cas avec
gnuplot
) sinon on peut utiliser aussi des chaînes entrecôte (si le fichier est destiné uniquement aux tableurs)Comme c'est la première action sur le fichier, tu peux utiliser
>
au lieu de>>
et te passer durm
avant. (ou le remplacer partouch
si tu tiens à changer la date de création.) :-)“It is seldom that liberty of any kind is lost all at once.” ― David Hume
[^] # Re: ça avance :-)
Posté par leyouki (site web personnel, Mastodon) . Évalué à 1.
Merci merci pour le temps, les conseils et snippets. J'ai la joie: grâce à tes conseils (et les autres aussi!) je suis parvenu à une version de script bash satisfaisante. Il y aurait plein de trucs à ajouter et optimiser, comme l'ajout du nom de la personne testeuse, le formatage du fichier de sortie selon la date et ce nom et même la création d'un histogramme directement avec
gnuplot
. Mais bon j'ai d'autres choses à préparer pour cette expérience; il faut savoir s'arrêter, même si je commence à ressentir pas mal de plaisir à bidouiller ce script.Parce que j'ai appris plein de choses, des commandes de base de linux certes, mais ausi des méthodes et une certaine logique. Le
set -x
est magique pour comprendre la logique du programme notamment![^] # Re: ça avance :-)
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 2.
Attention aux lignes mal placées :-)
TotMem
qui n'est pas utilisé…TheTime
qui est défini en dehors ne changera pas…Il est bien de précéder les lignes de début (Informations système & Inscription des entêtes du fichier de sortie) par dièse :
gnuplot
les reconnaîtra, par défaut comme des commentaires et tu n'auras pas à te prendre la tête quand tu lui donneras le fichier directement.À noter que le
set -x
tu le retrouveras sous cette forme vu que tu l'appelles d'entrée de jeu :En effet, le
set
active (-
) ou désactive (+
) des options du shell, comme on peut le faire aussi directement au moment de lancer l'interpréteur de commande.“It is seldom that liberty of any kind is lost all at once.” ― David Hume
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.