260 votes

Comment obtenir l'utilisation globale du CPU (par exemple 57%) sous Linux

Je me demande comment on peut obtenir l'utilisation du CPU du système et la présenter en pourcentage en utilisant bash, par exemple.

Exemple de sortie :

57%

Dans le cas où il y a plus d'un noyau, il serait bien qu'un pourcentage moyen puisse être calculé.

1 votes

@julesanchez la valeur doit être canalisée ailleurs, donc ce doit être un int.

0 votes

Doing top > monfichier.txt Et l'application de votre filtre en post-traitement, n'est-elle pas correcte ?

0 votes

S'il doit s'agir d'un int, cela signifie-t-il que vous ne voulez pas vraiment le % comme indiqué dans la question ?

235voto

vimdude Points 988

Jetez un coup d'œil à cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

EDITAR veuillez lire les commentaires avant de copier-coller ce texte ou de l'utiliser pour tout travail sérieux. Ceci n'a pas été testé ni utilisé, c'est une idée pour les personnes qui ne veulent pas installer un utilitaire ou pour quelque chose qui fonctionne dans n'importe quelle distribution. Certaines personnes pensent que vous pouvez "apt-get installer" n'importe quoi.

NOTE : ce n'est pas le actuel l'utilisation du CPU, mais l'utilisation globale du CPU dans tous les cœurs depuis le démarrage du système. Cela peut être très différent de l'utilisation actuelle du CPU. Pour obtenir la valeur actuelle, il faut utiliser top (ou un outil similaire).

L'utilisation actuelle du CPU peut être potentiellement calculée avec :

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)

0 votes

Je ne recommanderais pas d'analyser cela dans bash alors qu'il existe un certain nombre d'utilitaires qui le font déjà.

12 votes

Mais vous devez installer mpstat comme vous le recommandez ci-dessus. Beaucoup de gens n'ont pas cette flexibilité. cat /proc/stat puis pipe est beaucoup plus facile que mpstat que vous recommandez.

12 votes

+1 Je ne comprends pas pourquoi l'analyse d'un autre utilitaire est meilleure que l'analyse /proc/stat

126voto

netcoder Points 31874

Vous pouvez essayer :

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

19 votes

Chaque fois que j'exécute cette commande, j'obtiens exactement le même résultat ( 32.7% ).

16 votes

Un résultat plus précis est donné lorsque j'utilise top -bn2 mais cela prend beaucoup de temps. D'après ce que j'ai lu, cela semble être la seule façon d'obtenir un résultat précis.

7 votes

top -bn1 semble très imprécis sur mon système FC20. top -bn2 semble bien fonctionner.

42voto

Peter Liljenberg Points 3588

Essayez mpstat de la sysstat paquet

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

Ensuite, certains cut ou grep pour analyser les informations dont vous avez besoin :

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

2 votes

Je ne pense pas que cela montre le total du CPU.

0 votes

Je dirais qu'il s'agit de l'utilisation totale du CPU (en %).

0 votes

C'est le pourcentage "pas" utilisé. Cette réponse était bonne, jusqu'à la partie grep | tail | awk...

36voto

Dan Fego Points 6658

Autant donner une réponse réelle avec ma solution, qui a été inspirée par celle de Peter Liljenberg :

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

Cela utilisera awk pour imprimer 100 moins le 12ème champ (idle), avec un signe de pourcentage après. awk ne le fera que pour une ligne où le 12ème champ ne comporte que des chiffres et des points ( $12 ~ /[0-9]+/ ).

Vous pouvez également calculer la moyenne de cinq échantillons, espacés d'une seconde :

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

Testez-le comme ceci :

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'

19 votes

Il est préférable d'exécuter "mpstat 2 1 |..." pour qu'il affiche les statistiques des 1 dernières secondes. Sinon, par défaut, mpstat affiche les statistiques depuis le début et cela ne change pas beaucoup au fil du temps.

2 votes

"mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $11 "%" }'" cela fonctionne pour moi.

0 votes

@Sarang Merci beaucoup ! !! Enfin, je peux obtenir les résultats que conky s'affiche également. Malheureusement, cette ligne est TRÈS lente, prenant presque une seconde entière pour s'exécuter.

16voto

jordanm Points 6490

EDITION : J'ai remarqué que dans la réponse d'un autre utilisateur, %idle était le champ 12 au lieu du champ 11. L'awk a été mis à jour pour tenir compte du fait que le champ %idle est variable.

Cela devrait vous permettre d'obtenir le résultat souhaité :

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

Si vous voulez un simple arrondi des nombres entiers, vous pouvez utiliser printf :

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'

3 votes

mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }' cela fonctionne très bien pour moi, merci. notez le mpstat 1 1 pour s'assurer que l'utilisation du cpu est échantillonnée sur une seconde

2 votes

Si vous avez jq : mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X