Top et ps ne montrant pas le même résultat cpu

54

Ceci est lié à cette question.

Quand je cours, topj'obtiens le résultat suivant:

entrez la description de l'image ici

pid 3038utilise 18% de cpu, cependant lors de l'exécution

entrez la description de l'image ici

le résultat est 5,5%. Et ce nombre ne semble pas changer avec le temps (c'est-à-dire lorsque vous exécutez la même commande un peu plus tard) ...

La pscommande effectue-t-elle une moyenne sur l'utilisation de l'unité centrale?

Theodor
la source

Réponses:

87

man psen NOTESsection.

   CPU usage is currently expressed as the percentage of time spent running
   during the entire lifetime of a process.  This is not ideal, and it does not
   conform to the standards that ps otherwise conforms to.  CPU usage is
   unlikely to add up to exactly 100%.

Et, suppose que vous savez, mais vous pouvez aussi faire:

top -p <PID>

Edit : quant à votre commentaire sur une autre réponse;

" Hmm ouais je me demande comment obtenir ça (le pourcentage de CPU instantané) de ps "

Réponse courte: vous ne pouvez pas.

Pourquoi est-ce?

C'est comme demander à quelqu'un de calculer la vitesse d'une voiture à partir d'une image.

While topest un outil de surveillance, psun outil d’instantané. Pensez-y comme ceci: à un moment donné, un processus utilise ou non le processeur. Ainsi, vous avez 0% ou 100% de charge à ce moment précis.

Donner: Si psdevrait donner une utilisation instantanée du processeur, ce serait 0% ou 100%.

top Par contre, conservez les numéros d'interrogation et calculez la charge dans le temps.

psaurait pu donner l'utilisation actuelle - mais cela nécessiterait de lire les données plusieurs fois et de dormir entre chaque lecture. Ce n'est pas.

Calcul pour ps% cpu

ps calcule l'utilisation du processeur de la manière suivante:

temps de disponibilité = durée totale d'activité du système.
ps_time = heure de début du processus mesurée en secondes à partir du démarrage.
pu_time = le temps total utilisé par la CPU.

;; Le processus Seconds a été lancé:
secondes = disponibilité - ps_time
;; Usage:
cpu_usage = pu_time * 1000 / seconds

print: cpu_usage / 10 "." cpu_usage% 10


Exemple: disponibilité = 344,545 ps_time = 322,462 pu_time = 3 383 secondes = 344 545 - 322 462 = 22 083 cpu_usage = 3 383 * 1 000/22 083 = 153 impression: 153/10 "." 153% 10 => 15,3

Le nombre imprimé est le suivant: heure à laquelle le processus a utilisé le processeur pendant sa durée de vie. Comme dans l'exemple ci-dessus. Il l'a fait dans 15,3% de sa vie. Dans 84,7% des cas, il n’a pas eu de bogue sur le processeur.

Récupération de données

ps, ainsi que top, utilise les données des fichiers stockés sous /proc/- ou le pseudo système de fichiers d’informations de processus .

Vous avez à la racine des fichiers /proc/qui contiennent diverses informations sur l’état général du système. De plus, chaque processus a son propre sous-dossier dans /proc/<PID>/lequel des données spécifiques au processus sont stockées. Ainsi, par exemple, le processus de votre question comportait un dossier dans /proc/3038/.

Lorsqu'il pscalcule l'utilisation du processeur, il utilise deux fichiers:

/ proc / uptime Durée de fonctionnement du système (secondes) et temps passé en processus d’inactivité (secondes).
/ proc / [PID] / stat Informations d'état sur le processus.
  • Depuis, uptimeil utilise la première valeur ( temps de disponibilité ).
  • De [PID]/statil utilise les éléments suivants:
 # Nom Description
14 heures de temps CPU consacrées au code utilisateur, mesurées en un tournemain
15 fois le temps CPU passé dans le code du noyau, mesuré en un tournemain
16 temps CPU en code utilisateur, y compris ceux des enfants
17 cstime Temps CPU passé dans le code du noyau, y compris le temps des enfants 
22 heure de début Heure à laquelle le processus a commencé, mesurée en deux minutes

Un jiffie est le tic-tac de l'horloge. Donc, en outre, il utilise diverses méthodes, à savoir sysconf(_SC_CLK_TCK),, pour obtenir le système Hertz (nombre de ticks par seconde) - en utilisant finalement 100 comme solution de secours après avoir épuisé les autres options.

Donc, si utimeest 1234 et Hertz est 100 alors:

seconds = utime / Hertz = 1234 / 100 = 12.34

Le calcul réel est fait par:

total_time = utime + stime

IF include_dead_children
    total_time = total_time + cutime + cstime
ENDIF

seconds = uptime - starttime / Hertz

pcpu = (total_time * 1000 / Hertz) / seconds

print: "%CPU" pcpu / 10 "." pcpu % 10

Exemple (sortie d'un script Bash personnalisé):

$ ./psw2 30894
System information
           uptime : 353,512 seconds
             idle : 0
Process information
              PID : 30894
         filename : plugin-containe
            utime : 421,951 jiffies 4,219 seconds
            stime : 63,334 jiffies 633 seconds
           cutime : 0 jiffies 0 seconds
           cstime : 1 jiffies 0 seconds
        starttime : 32,246,240 jiffies 322,462 seconds

Process run time  : 31,050
Process CPU time  : 485,286 jiffies 4,852 seconds
CPU usage since birth: 15.6%

Calcul de la charge "actuelle" avec ps

C'est un (peu?) Effort louche mais OK. Essayons.

On pourrait utiliser les temps fournis par pset calculer l’utilisation du processeur à partir de cela. En y réfléchissant, cela pourrait être plutôt utile, avec quelques limitations.

Cela peut être utile pour calculer l'utilisation du processeur sur une période plus longue. C'est-à-dire que vous souhaitez surveiller la charge de processeur moyenne de plugin-containerFirefox tout en effectuant certaines tâches liées à Firefox.

En utilisant les résultats de:

$ ps -p -o cputime, etimes

CODE    HEADER   DESCRIPTION
cputime TIME     cumulative CPU time, "[DD-]hh:mm:ss" format.  (alias time).
etime   ELAPSED  elapsed time since the process was started, [DD-]hh:]mm:ss.
etimes  ELAPSED  elapsed time since the process was started, in seconds.

J'utilise etimeplus etimesdans cet exemple, sur des calculs, pour être un peu plus clair. Aussi, j'ajoute% cpu pour "fun". En c’est-à-dire un script bash, on pourrait évidemment utiliser etimes- ou mieux lire à partir de /proc/<PID>/etc.

Start:
$ ps -p 30894 -o %cpu,cputime,etime,etimes
%CPU     TIME     ELAPSED ELAPSED
 5.9 00:13:55    03:53:56   14036

End:
%CPU     TIME     ELAPSED ELAPSED
 6.2 00:14:45    03:56:07   14167

Calculate times:
            13 * 60 + 55 =    835   (cputime this far)
3 * 3,600 + 53 * 60 + 56 = 14,036   (time running this far)

            14 * 60 + 45 =    885   (cputime at end)
3 * 3,600 + 56 * 60 +  7 = 14,167   (time running at end)

Calculate percent load:
((885 - 835) / (14,167 - 14,036)) * 100 = 38

Le processus utilisait le processeur 38% du temps pendant cette période.

Regarde le code

Si vous voulez savoir comment pset si vous connaissez un peu le C, faites (on dirait que vous exécutez Gnome Debain deriavnt) - bonne attitude dans le code en ce qui concerne les commentaires, etc.:

apt-get source procps
cd procps*/ps
vim HACKING
Runium
la source
Je pourrais mettre à jour avec plus d’informations sur topla surveillance continue - ou une capture instantanée appelée " ps" avec la charge actuelle du processeur.
Runium
2
Vraiment super réponse!
Theodor
Qu'en est-il du calcul de l'utilisation totale du processeur sur l'ensemble du système? Les outils essaient-ils d'obtenir l'utilisation du processeur via un instantané ou de le calculer en moyenne dans le temps?
CMCDragonkai
4
man top

%CPU  --  CPU usage
The  task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time.  In a true SMP environment, if 'Irix
mode' is Off, top will operate in 'Solaris mode' where a task's cpu usage will be divided by the total number of CPUs.  You toggle  'Irix/Solaris'  modes
with the 'I' interactive command.


man ps 
%cpu       %CPU    cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running                       (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky. (alias pcpu).
Rahul Patil
la source
Hmm ouais je me demande comment obtenir cela (le pourcentage du processeur instantané) deps
Theodor
2
vous pouvez extraire du top exempletop -p 3343 -n1 | awk '/ R /{print $10}'
Rahul Patil
1
Impressionnant. J'ai trouvé que awk: ing pour le pidmieux travaillé, comme danstop -p 3343 -n1 | awk '/ 3343 /{print $10}'
Theodor
1
Merci "top -p" c'est bien, je n'ai jamais remarqué cette option! Cependant, je n'aime pas chercher le PID, que se passe-t-il si par hasard les mêmes chiffres apparaissent dans la section de mémoire libre ou quelque chose du genre? Sur mon système, les informations se top -p $PID -n1 | awk '{if (NR ==8) print $9 }'
trouvent