Obtenir le même processeur à chaque fois.


13

Lorsque j'exécute la commande suivante pour obtenir l'utilisation du processeur, j'obtiens une utilisation agréable du processeur + utilisateur.

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

Production:

14.5

Ici, je reçois un problème, c'est que la sortie dépend de la commande supérieure, elle ne change donc pas instantanément en tant que commande supérieure. Donc, je ne reçois pas instantanément le bon processeur. Il donne la même sortie et ne change pas.

Je veux obtenir un cpuusage en temps réel en sortie. Veuillez m'aider à améliorer ma commande.


1
Et la question est?
Dennis Kaarsemaker

Essayez d'exécuter la commande précédée de time. Sur mon système, cela ne prend que 0,165 s.
depquid

Veuillez me donner une commande modifiée.
Ketan Patel

Essayez:time (top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' )
depquid

aucune différence de sortie, après avoir testé dans différents systèmes
Ketan Patel

Réponses:


13

Vous avez raison, topsemble donner une utilisation incorrecte du processeur lors de la première itération. Vous pouvez contourner ce problème comme ceci:

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

Bien sûr, cela prendra deux fois plus de temps, mais cela fonctionnera quand même.

Si vous voulez toujours que cela fonctionne plus rapidement, vous pouvez utiliser l' -doption, par exemple pour une période totale de mesure de 1 seconde, utilisez la moitié:

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

serverfault.com/a/436499/134517 cela prendra également beaucoup plus de deux fois car cela prendra environ une seconde au lieu de presque aucune.
altendky

En plus du commentaire d'altendky, voir également la réponse de terdon pour expliquer pourquoi le problème existe en premier lieu.
Ruslan

6

Techniquement, le premier topne produit pas toujours la même valeur; il affiche simplement la charge CPU moyenne depuis le dernier démarrage. Étant donné que tople delta de /proc/statstatistiques est utilisé pour calculer la charge du processeur, la première valeur est calculée lors de la comparaison avec zéro, ce qui donne un résultat incorrect (mais WAD).

Si vous ne voulez pas utiliser top, vous pouvez directement analyser /proc/stat:

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) "%"}'

C'est aussi plus rapide et plus précis de cette façon.

Vous pouvez le tester avec stress:

stress -c 1 -q &

Et fait

killall stress

après.


Agréable. Et si votre commande est placée dans un fichier appelé 'cpu', alors vous watchpouvez l'exécuter:watch -n1 "bash ./cpu"
Brent Faust

Votre script awk à analyser /proc/statest assez cool mais il semble avoir le même inconvénient que la première itération de top: il génère la charge CPU moyenne depuis le dernier démarrage, pas celle actuelle.
pieroxy

5

Juste pour développer la réponse de @ Ruslan, topdivise l'utilisation du processeur entre l'utilisateur, les processus système et les niceprocessus, nous voulons la somme des trois. Ainsi, nous pouvons exécuter topen bmode atch qui nous permet d'analyser sa sortie. Cependant, comme expliqué ici , la 1ère itération de top -bretourne les pourcentages depuis le démarrage, nous avons donc besoin d'au moins deux itérations ( -n 2) pour obtenir le pourcentage actuel. Pour accélérer les choses, vous pouvez définir le ddélai entre les itérations sur 0.01:

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'

4

Peut-être utiliser celui-ci en fonction de la pssortie:

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }

0

Utilisez la commande watch ou for loop in shell,

c'est à dire watch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"


La même chose se produit avec la montre
Ketan Patel

0

Pourquoi vous souciez-vous de l'utilisation du processeur? La moyenne de charge est un bien meilleur indicateur:

cat /proc/loadavg

Si vous avez vraiment besoin de l'utilisation du processeur, l'analyse /proc/statest probablement la voie à suivre.


1
La charge moyenne est fondamentalement une intégrale temporelle de l'utilisation du processeur (divisée par le temps). Pourquoi diriez-vous qu'une caractéristique intégrale est un bien meilleur indicateur [de tout] qu'une différence si elles ont des cas d'utilisation complètement différents? De plus, /proc/statne donne pas l'utilisation du processeur tel qu'il est, il faut le lire deux fois avec un certain temps entre les lectures et faire des calculs pour obtenir l'utilisation du processeur. C'est exactement ce qui topfait.
Ruslan

Je ne peux pas faire de maths, donc je dois admettre que je ne comprends pas vraiment la différence entre intégrale et différentielle: / "La moyenne de charge est fondamentalement une intégrale temporelle de l'utilisation du CPU" - est-ce vraiment? AFAIK un processus qui se bloque dans l'état D provoque une augmentation de la charge, mais pas d'utilisation du processeur. "Pourquoi diriez-vous ..." - OP ne dit pas ce qu'il veut vraiment accomplir, donc pour être honnête, je suppose simplement qu'il veut mesurer la charge de son système et pensait que l'utilisation du CPU serait le meilleur indicateur pour cela , je lui ai donc demandé de charger la moyenne.
Martin von Wittich

À partir de votre lien: "Les systèmes calculent la moyenne de charge comme la moyenne mobile exponentiellement amortie / pondérée du nombre de charge." et "la charge du système est une mesure de la quantité de travail de calcul". L'état D ne prend aucun travail de calcul. Ce qui prend, ce sont les processus qui utilisent le temps CPU. La charge moyenne est donc essentiellement le pourcentage de temps pendant lequel le processeur n'a pas été inactif pendant une certaine période de temps (par exemple, des minutes à des dizaines de minutes). Et l'utilisation du CPU est le pourcentage de temps pendant lequel le CPU n'est pas inactif à l'échelle de temps des millisecondes - c'est-à-dire mis à jour chaque fois que vous le lisez et reflétant l' état actuel .
Ruslan

-2

Utilisation de la sarcommande

sar 1 10

Cela signifie: obtenir 10 fois le résultat à chaque seconde

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.