Comment puis-je recevoir des statistiques CPU de premier ordre à partir du shell?

12

J'essaie d'obtenir une lecture précise de mon processeur utilisé (en pourcentage) top. Voici la commande que j'utilise pour tester:

top -n1 | awk '/Cpu\(s\):/ {print $2}'

Cela renvoie:

10.7%us,

Quelle est la bonne donnée que je veux. Cependant, chaque fois que j'exécute la commande, j'obtiens la même sortie, même si j'applique des charges différentes sur mon système (et pour ne pas mentionner htopme dit que mon utilisation est différente). Il semble que chaque fois que je démarre top, mon utilisation du processeur est la même. Ce n'est qu'après quelques images qu'il me donne des valeurs appropriées.

Il ne semble pas que je puisse analyser la sortie de top de cette façon, donc je cherche d'autres applications fiables qui me donneront une lecture précise du shell. J'aime vraiment comment htoppeut me donner une lecture par cœur.

J'ai essayé iostatet mpstatils semblent donner des valeurs inexactes et "lentes à changer".

n0pe
la source
2
Non. La bonne question à poser est la suivante: comment puis-je obtenir des statistiques d'utilisation du processeur de type supérieur à partir du shell?
Stéphane Gimenez
@ StéphaneGimenez merci j'ai modifié ma question
n0pe

Réponses:

12

J'utilise ce script (à partir de ce fil sur les planches Arch ):

#!/bin/bash
read cpu a b c previdle rest < /proc/stat
prevtotal=$((a+b+c+previdle))
sleep 0.5
read cpu a b c idle rest < /proc/stat
total=$((a+b+c+idle))
CPU=$((100*( (total-prevtotal) - (idle-previdle) ) / (total-prevtotal) ))
jasonwryan
la source
Linux a quelques bonnes informations dans / proc / - voir linux.die.net/man/5/proc pour tous les goodies. Attention, ce ne sont que Linux. Il n'y a vraiment aucun moyen multiplateforme d'obtenir ces informations à moins d'utiliser une bibliothèque comme Sigar .
Pat Notz
L'idée est bonne, mais certains détails sont incorrects. La valeur inactive est la 5e colonne, et vous devez également ajouter la colonne iowait (6e colonne) pour obtenir un pourcentage raisonnable. Pour être tout à fait correct, vous devez également ajouter toutes les valeurs de "repos", mais elles sont souvent très petites.
Peter Eisentraut
La valeur inactive est la cinquième colonne, si vous comptez la colonne "cpu". Sinon, c'est le quatrième.
SunSparc
6

Découvrez également sar . Les implémentations peuvent varier considérablement de nix à nix, mais elles devraient vous fournir des statistiques système de base, à des instantanés donnés. Je ne sais pas comment précise les valeurs sont au point où la commande est d' abord initialisé, mais vous pourriez jouer pour voir comment il se compare à top, iostatetc.

La sortie est basée sur des colonnes, comme top, vous devez donc être en mesure de diriger la sortie vers awkou cutde manipuler les résultats.

tcdyl
la source
J'ai déjà essayé saravec des résultats mitigés. Je vais aller avec la réponse de @ jasonwryan ici parce que je peux facilement la modifier pour représenter l'utilisation avec mes deux cœurs de processeur.
n0pe
0

Ce que j'ai trouvé est similaire à la personne qui a posé la question ci-dessus, au moins sur CentOS 6. Si je lance top en mode batch pour une seule itération, il semble collecter le même chiffre, presque comme si sa tendance était de commencer par ce il se souvient de l'affichage en dernier. Top semble avoir besoin d'accumuler au moins quelques chiffres afin d'obtenir des deltas pour vous donner des pourcentages corrects. Après avoir testé plus de 10 itérations, j'ai trouvé que le deuxième chiffre qui apparaissait montrait une différenciation suffisante à chaque exécution. Donc, c'est assez facile d'obtenir cette ligne via

top -b -n 2 | grep Cpu | tail -1

J'aime l'incorporer avec une disponibilité pour la charge et un filtre grep de certains processus de ps, tels que les requêtes postgres. Un moniteur très simple peut être exprimé avec l'alias:

alias postgresmon="watch -d 'uptime;top -b -n 2 | grep Cpu | tail -1;ps -ef | grep postgres\: | grep -v idle'"
Robert Casey
la source