[OK]connaitre la charge cpu


#1

bonjour tout le monde :slightly_smiling:

voila, je dois faire un script qui enregistre la charge cpu / ram / accès disque / … à intervalle régulier. je pensais utilisé la commande :

mais cette commande ne se termine pas car top reste “actif” et je ne passe pas a la commande suivante :-/

pour la charge mémoire, je vais utiliser “free”.
pour les disques, surement un “cat /proc/diskstats” (bienque j’ai du mal a déchiffrer ce fichier, si vous vous y connaissez, n’hésitez pas à m’en dire + :wink:).

voyez vous comment terminer la commande “top” de manière automatique ? ou connaissez vous un autre moyen d’obtenir la charge cpu ?

merci de votre aide.


#2

uptime te donne la charge de la machine.


#3

[quote]> uptime
2:13pm up 12 days 2:40, 4 users, charge moyenne: 1,00, 1,00, 1,00[/quote]

génial !! comme quoi, on cherche souvent à se compliquer la vie…

dans mon cas, je comprend :
il est 14h13
en route depuis 12 jrs , 2h 40
il y a 4 users connectés
charge moyenne:
il y a 1 min > 1%
il y a 5 min > 1%
il y a 15 min > 1%

c’est bon comme lecture ?
charge a 1% ?


#4

Un petit man uptime confirme…

Sinon, tu trouveras en vrac toutes ces infos dans /proc


#5

j’ai cherché dans /proc , mais j’ai pas trouvé de fichier donnant la charge…

sinon, une idée pour le déchiffrement de /proc/diskstats ?

j’obitens ceci :

[quote]$ cat /proc/diskstats
1 0 ram0 0 0 0 0 0 0 0 0 0 0 0
1 1 ram1 0 0 0 0 0 0 0 0 0 0 0
1 2 ram2 0 0 0 0 0 0 0 0 0 0 0
1 3 ram3 0 0 0 0 0 0 0 0 0 0 0
1 4 ram4 0 0 0 0 0 0 0 0 0 0 0
1 5 ram5 0 0 0 0 0 0 0 0 0 0 0
1 6 ram6 0 0 0 0 0 0 0 0 0 0 0
1 7 ram7 0 0 0 0 0 0 0 0 0 0 0
1 8 ram8 0 0 0 0 0 0 0 0 0 0 0
1 9 ram9 0 0 0 0 0 0 0 0 0 0 0
1 10 ram10 0 0 0 0 0 0 0 0 0 0 0
1 11 ram11 0 0 0 0 0 0 0 0 0 0 0
1 12 ram12 0 0 0 0 0 0 0 0 0 0 0
1 13 ram13 0 0 0 0 0 0 0 0 0 0 0
1 14 ram14 0 0 0 0 0 0 0 0 0 0 0
1 15 ram15 0 0 0 0 0 0 0 0 0 0 0
8 0 sda 15700 2510 679143 88099 40111 87435 1020528 465239 0 75739 553338
8 1 sda1 350 350 0 0
8 2 sda2 743 743 0 0
8 3 sda3 38 304 0 0
8 4 sda4 2 4 0 0
8 5 sda5 223 391 0 0
8 6 sda6 12957 530194 47476 379808
8 7 sda7 2798 120259 52573 420528
8 8 sda8 1061 26578 27524 220192
3 0 hda 0 0 0 0 0 0 0 0 0 0 0[/quote]

et je n’ai pas de “man diskqtats” …


#6

Le uptime te donne la charge dans l’ordre sur 1, 5 et 15 minutes.
Par exemple:

top - 14:32:51 up 38 min, 3 users, load average: 0.03, 0.21, 0.30
Tasks: 62 total, 3 running, 59 sleeping, 0 stopped, 0 zombie
Cpu(s): 24.7% user, 1.0% system, 0.0% nice, 74.3% idle
Mem: 515132k total, 500572k used, 14560k free, 1168k buffers
Swap: 971892k total, 112k used, 971780k free, 430568k cached

Le loadaverage sur le moment est sur 1, ci dessus, cela te donne 0,3 soit 0,3 tache dans la file d’attente. Un loadaverage à 1 signifie que le CPU est constamment sollicité. C’est le nombre moyen de taches attendant dans la file d’attente du CPU sur la période donnée. Le load average peut être donc de 5 ou 6.

La charge CPU est une notion délicate à définir.
Sinon, les renseignements utilisés par top sont dans /proc/stats

Chaque CPU est suivi de 7 champs nommés u,n,s,i,w,x,y (je lis au fur et à mesure dans le code de top.c)

En gros ces champs augmentent à chaque fois, si tu appelles
u’,n’,s’,i’,w’,x’ et y’ les nouvelles valeurs lues un instant plus tard, tu auras la somme Ds= (u’-u)+(n’-n)+…+(y’-y) qui représente les «ticks» totaux passés. top calcule le %CPU en regardant le % de chacune des augmentations:
%utilisateurs = (u’-u)/Ds
%idle = (i’-i)/Ds

Ce qui t’intéresserait serait donc 1-((i’-i)/Ds)

A vue de nez:
u = utilisaateur
i = idle
s = sytème
n bnice j’imagine (?), quant 'à w,x et y, le code source de top n’explique pas ce que c’est…

Je ne m’étais jamais plongé dans le code de top, c’est plutôt intéressant.


#7

Arf, entre temps, tu as parlé de diskstats, je regarderais mais là, il faut que j’aille bosser, dsl…


#8

C’est en anglais mais c’est complet

redhat.com/archives/fedora- … 01010.html

Ce lien devrait également t’aider
aide.sivit.fr/index.php?2006/02/ … -o-disques

Bien à toi

François


#9

fran.b : tu n’as pas à être désolé :wink: c’est déjà bien sympa de te pencher sur mon pb :smiley:

fsoumil : merci pour tes liens je vais regarder ca


#10

j’ai encore une question a propos de ce p’ti script :

il faudrait lancer une série de commande à intervalle régulier pendant une durée disons de 2h, pour cela j’avais pensé utilisé la fonction until :

[quote]until [ date +%T < $1 ] # $1 est de la forme HH:MM:SS
do utpime >> $fic ; free >> $fic ; sleep 10 ;
done[/quote]

mais… bien sur ca ne fonctionne pas…

[quote]$ sudo syschargetmp.sh 15:42:00
syschargetmp.sh: line 13: 15:42:00: Aucun fichier ou répertoire de ce type [/quote]
si je comprend bien, les [ ] ne savent comparer que des fichiers ? y’a un moyen de lui indiquer la durée de répétition autrement ?


#11

LEs crochets [] remplacent en fait la commande test, ceci afin de simplifier l’écriture.
Dans les expressions que test peut manipuler, je ne pense pas qu’il puisse gérer les dates. test gère les strings, mais de manière limitée (il sait tester leur longeur, et le fait qu’elle soit égale (d’un point de vue lexicographique)).

Donc en gros, tu peux faire un until (= jusqu’à ce que ta variable soit égale à la borne). Fais juste gaffe de ne pas utiliser des unités trop petites…

J’espère avoir été clair (j’en doute) et t’avoir aidé.
A+

François


#12

Ci dessous un petit script qui t’affiche le % de la charge CPU comme top, je l’ai testé, ça marche très bien

#!/bin/sh
CPU_U=cat /proc/stat | head -n 1 | cut --delimiter=' ' -f 3
CPU_N=cat /proc/stat | head -n 1 | cut --delimiter=' ' -f 4
CPU_S=cat /proc/stat | head -n 1 | cut --delimiter=' ' -f 5
CPU_I=cat /proc/stat | head -n 1 | cut --delimiter=' ' -f 6
sleep 5
NCPU_U=cat /proc/stat | head -n 1 | cut --delimiter=' ' -f 3
NCPU_N=cat /proc/stat | head -n 1 | cut --delimiter=' ' -f 4
NCPU_S=cat /proc/stat | head -n 1 | cut --delimiter=' ' -f 5
NCPU_I=cat /proc/stat | head -n 1 | cut --delimiter=' ' -f 6
DELTAU=$[$NCPU_U-$CPU_U]
DELTAN=$[$NCPU_N-$CPU_N]
DELTAS=$[$NCPU_S-$CPU_S]
DELTAI=$[$NCPU_I-$CPU_I]
echo $[100-$[100*$DELTAI/$[$DELTAU+$DELTAN+$DELTAS+$DELTAI]]] "% CPU"
CPU_U=$NCPU_U
CPU_N=$NCPU_N
CPU_S=$NCPU_S
CPU_I=$NCPU_I


#13

tu as été relativement clair ^^

mais d’après ce que j’ai compris, test permet entre autre de comparer des chaines de caractères. mais la fonction “date +%T” renvois une chaines de caractère, non ?

donc si “date +%T” = 16:09:53 et “$1” = 16:20:12, test devrait etre capable de dire si date +%T est inférieur à $1 ?? c’est ce que je pensais avoir fais…


#14

merci bcp fran.b :slightly_smiling:

[quote]$ sudo chargecpu.sh
Password:
3 % CPU[/quote]

ca doit donner ca ?


#15

fais date +"%s", cela te donne un entier qui peut être directement comparé avec une autre sur les entiers qui coïncide avec l’ordre lexicographique. Donc tu n’auras plus ce type de pbms


#16

Si tu veux plus de détails,

echo $[100*$DELTAU/$[$DELTAU+$DELTAN+$DELTAS+$DELTAI]]]

te donne le % utilisateur

echo $[100*$DELTAS/$[$DELTAU+$DELTAN+$DELTAS+$DELTAI]]]

te donne le % système.


#17

euu tu es certain ?

[quote]$ date +"%s"
1142349431[/quote]


#18

Oui test permet de manipuler des strings mais juste tester si elles sont égales ou non, pas si elles sont inférieures ou supérieurs.
Donc tu dois faire un truc until date = ta borne. Le problème est le suivant.
Si tu dis que ça doit tourner jusque 15:32:00
Imagine que ton script tourne à 15:31:59, ok il continue. Pour une raison ou une autre ton cpu est à 100% et ton script ne retourne qu’à 15:32:01. Tu l’as dans l’os. Tu comprends ?
Je te conseille donc d’utiliser cette technique mais en limitant aux heures et minutes.

A+

François

Ah oui, pour tester si 2 strings sont égales tu fais : [String1 = String2]


#19

Sinon, tu as une autre solution, plus simple à mon avis, consistant à créer un cron qui executera à intervalle de temps régulier ton script (ce qui allège ton script).
Exemple :

crontab -e
[puis sous vi]
0 0  * * 6  /home/user/script

Ce qui execute le script tout les samedi à minuit.
crontab -l pour lister les jobs

adminschoice.com/docs/crontab.htm


#20

merci damss, mais en fait ce script est sensé indiquer que le serveur n’est pas limite en pleine charge. j’avais pensé a cron, que je vais d’ailleur surement utiliser pour lancer mon script à heure fixe, mais il ne permet pas, à ma connaissance, de lancer un script plusieur fois pendant une plage horraire prédéfini.