Existe-t-il un moyen de calculer le pourcentage d'utilisation du processeur en lisant / proc / stat à la fois?


12

Je suppose que la question est, pourrais-je en quelque sorte calculer le pourcentage d'utilisation du processeur simplement en lisant une fois / proc / stat?

# head -1 /proc/stat
cpu  67891300 39035 6949171 2849641614 118251644 365498 2341854 0

Je pense à résumer les colonnes à l'exception de l'IOWait (je lisais quelque part qu'il est compté dans le ralenti) et cela me donnerait le 100% et chaque colonne individuelle pourrait être transformée en pourcentage par (colonne / 100_percent) * 100.

  • utilisateur: processus normaux s'exécutant en mode utilisateur
  • nice: niced processus s'exécutant en mode utilisateur
  • système: processus s'exécutant en mode noyau
  • inactif: les pouces se tortillent
  • iowait: attente de fin des E / S
  • irq: maintenance des interruptions
  • softirq: entretien des softirqs
  • voler: attente involontaire
  • invité: exécuter un invité normal
  • guest_nice: exécuter un invité niced

Est-ce une approche viable ou je suis totalement hors piste?

Réponses:


11

Vous êtes sur la bonne voie, toputilisez ce fichier à cet effet. Mais vous devez le lire plus d'une fois.

L'utilisation est une mesure de l'utilisation dans le temps. Vous pouvez le lire une fois à condition de connaître le temps de disponibilité en secondes de l'hôte, puis le diviser par cela, mais cela vous donnerait un taux d'utilité de l'hôte depuis le démarrage de la machine.

Si vous voulez un taux supérieur à 5 secondes, vous devez lire le fichier une fois, dormir pendant 5 secondes, le relire, obtenir la différence des calculs et diviser par 5.


6

Votre approche est correcte. Vous pouvez utiliser / proc / stat comme données brutes et alimenter par exemple rrdtool avec. Je me suis fait quelque chose comme ça, donc je sais à 100% que c'est possible. Vous pouvez alors bien représenter graphiquement la charge entière du système ou chaque cœur individuellement.

Voici un exemple pratique de mon choix: entrez la description de l'image ici

Réassumer -> Vous pouvez le faire, ce n'est pas difficile seulement les mathématiques de base et mes graphiques en sont un exemple vivant. Pour collecter des données, je fais un instantané de / proc / stat dans un fichier temporaire localisé sur le disque virtuel, puis j'analyse ce fichier pour collecter des données toutes les 1 minute.

comment j'analyse les données (fragment de script bash):

cat=/bin/cat # others defined the same way
......

$cat /proc/stat > /ramdisk/tmp/stat

ssCpuRawUser=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $2}'`
ssCpuRawNice=`$cat /ramdisk/tmp/stat|$grep "cpu " | $awk '{print $3}'`
    #other columns follow ....... 

#the most important there is that it is an incrementing COUNTER.
if [ ! -f ${data_dir}/sys.cpu.rrd ];then
        $rrdtool create ${data_dir}/sys.cpu.rrd -s 60 \
        DS:ssCpuRawUser:COUNTER:300:0:1250000 \
        DS:ssCpuRawNice:COUNTER:300:0:1250000 \
        DS:ssCpuRawSystem:COUNTER:300:0:1250000 \
        DS:ssCpuRawIdle:COUNTER:300:0:1250000 \
        DS:ssCpuRawIOwait:COUNTER:300:0:1250000 \
        DS:ssCpuRawIRQ:COUNTER:300:0:1250000 \
        DS:ssCpuRawSoftIRQ:COUNTER:300:0:1250000 \
            RRA:AVERAGE:0.5:1:532800

fi

$rrdtool update ${data_dir}/sys.cpu.rrd N:$ssCpuRawUser:$ssCpuRawNice:$ssCpuRawSystem:$ssCpuRawIdle:$ssCpuRawIOwait:$ssCpuRawIRQ:$ssCpuRawSoftIRQ

# then in a loop each core the same way until all are parsed.

après avoir obtenu des données dans la base de données rrd, vous pouvez représenter graphiquement et le ciel est la limite :) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.fr.html


Comment analysez-vous les données?
ewwhite

@ewwhite -> J'ai modifié ma réponse pour montrer comment j'analyse les données.
Bartłomiej Zarzecki

Beaux graphiques! Concernant votre annotation de colonne manquante: askubuntu.com/a/120961/451886 . S'il fonctionne dans une machine virtuelle, c'est peut-être le compteur "voler".
rkagerer

+1 pour rrdtool et ramdisk!
shadi

4

Si vous voulez un liner, il peut ressembler à ceci:

echo $(echo '100'; echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100') | bc -l) | bc -l

Le résultat: 97.17000000000000000000

Comment ça fonctionne:

echo $(echo '(';head -1 /proc/stat | awk '{print $5}'; sleep 1; echo '-';head -1 /proc/stat |  awk '{print $5}';echo ')/100')

produit ( 1055057784 - 1055058055 )/100ensuite ce saut de ligne vers bc. Aura quelque chose comme -7.84000000000000000000, puis il suffit de l'envelopper 100-$(value)et de le nourrir à nouveau bc

Là: sleep #- Délai de 1 seconde, si vous modifiez cette valeur, le résultat intermédiaire doit être divisé en nombre de secondes. $5- 5ème champ, selon man procet http://www.linuxhowtos.org/System/procstat.htm

Veuillez me faire savoir si cela ne fonctionne pas pour vous.


0

Ou si vous êtes satisfait avec seulement deux chiffres après le point awk peut tout faire beaucoup plus simple et plus lisible:

 awk -v oldidle=$(awk '/cpu / {print $5}' /proc/stat; sleep 1) '/cpu / {perc=100-($5-oldidle)/100 ; printf "%s", perc}' /proc/stat
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.