Top und ps zeigen nicht dasselbe CPU-Ergebnis

54

Dies ist mit dieser Frage verbunden.

Wenn ich renne, toperhalte ich folgendes Ergebnis:

Bildbeschreibung hier eingeben

pid 3038verwendet 18% CPU, jedoch beim Laufen

Bildbeschreibung hier eingeben

das Ergebnis ist 5,5%. Und diese Zahl scheint sich nicht mit der Zeit zu ändern (dh wenn derselbe Befehl etwas später ausgeführt wird) ...

Berechnet der psBefehl den Durchschnitt der CPU-Auslastung?

Theodor
quelle

Antworten:

87

man psim NOTESabschnitt.

   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%.

Und, schätze, du weißt, aber du kannst auch:

top -p <PID>

Bearbeiten : in Bezug auf Ihren Kommentar zu einer anderen Antwort;

" Hmm ja, ich frage mich, wie man das (den momentanen CPU-Prozentsatz) von ps bekommt. "

Kurze Antwort: Das kannst du nicht.

Wieso ist es so?

Es ist, als würde man jemanden bitten, die Geschwindigkeit eines Autos aus einem Bild zu berechnen.

While topist ein Überwachungstool, es psist ein Snapshot-Tool. Stellen Sie sich das so vor: Zu jedem Zeitpunkt verwendet ein Prozess entweder die CPU oder nicht. Somit haben Sie entweder 0% oder 100% Last in genau diesem Moment.

Geben: Wenn pseine sofortige CPU-Auslastung erzielt werden soll, ist dies entweder 0% oder 100%.

top auf der anderen Seite halten Sie die Abrufnummern und berechnen Sie die Last über die Zeit.

pshätte die aktuelle Nutzung angeben können - aber dafür müsste es die Daten mehrmals lesen und zwischen den einzelnen Lesevorgängen in den Ruhezustand wechseln. Das tut es nicht.

Berechnung für ps% CPU

ps berechnet die CPU-Auslastung folgendermaßen:

Betriebszeit = Gesamtzeit, in der das System ausgeführt wurde.
ps_time = Prozessstartzeit, gemessen in Sekunden nach dem Start.
pu_time = Gesamtzeit, in der der Prozess die CPU verwendet hat.

;; Sekunden Prozess wurde ausgeführt:
Sekunden = Betriebszeit - ps_time
;; Verwendungszweck:
cpu_usage = pu_time * 1000 / seconds

print: cpu_usage / 10 "." cpu_usage% 10


Beispiel: Betriebszeit = 344.545 ps_time = 322.462 pu_time = 3.383 Sekunden = 344,545 - 322,462 = 22,083 cpu_usage = 3.383 * 1.000 / 22.083 = 153 Druck: 153/10 "." 153% 10 => 15,3

Die aufgedruckte Zahl lautet also: Zeitpunkt, zu dem der Prozess die CPU während seiner Lebensdauer verwendet hat. Wie im obigen Beispiel. Es hat dies in 15,3% seiner Lebensdauer getan. In 84,7% der Fälle wurde kein Fehler in der CPU festgestellt.

Datenabruf

psSowie topnutzt Daten aus Dateien unter gespeichert /proc/- oder den Prozessinformationen Pseudo-Dateisystem .

Sie haben einige Dateien im Stammverzeichnis /proc/, die verschiedene Informationen über den Gesamtzustand des Systems enthalten. Darüber hinaus verfügt jeder Prozess über einen eigenen Unterordner, /proc/<PID>/in dem prozessspezifische Daten gespeichert werden. So hatte zum Beispiel der Prozess Ihrer Frage einen Ordner unter /proc/3038/.

Bei der psBerechnung der CPU-Auslastung werden zwei Dateien verwendet:

/ proc / uptime Die Betriebszeit des Systems (Sekunden) und die im Leerlauf verbrachte Zeit (Sekunden).
/ proc / [PID] / stat Statusinformationen zum Prozess.
  • Daraus uptimewird der erste Wert ( Uptime ) verwendet.
  • Daraus [PID]/statergibt sich folgendes:
 # Name Beschreibung
14-malige CPU-Zeit, die im Benutzercode verbracht wurde, gemessen in Sekundenschnelle
15 Stunden CPU-Zeit im Kernel-Code, gemessen in Sekundenschnelle
16 Stunden CPU-Zeit, die im Benutzercode verbracht wurde, einschließlich der Zeit von Kindern
17 cstime CPU-Zeit im Kernel-Code, einschließlich der Zeit von Kindern 
22 starttime Zeitpunkt, zu dem der Prozess gestartet wurde, gemessen in Sekundenschnelle

Ein Jiffie ist ein Uhrzeiger. Außerdem werden verschiedene Methoden verwendet, sysconf(_SC_CLK_TCK)um die Hertz (Anzahl der Ticks pro Sekunde) des Systems zu ermitteln. Letztendlich wird 100 als Ersatz verwendet, nachdem andere Optionen ausgeschöpft wurden.

Wenn utimealso 1234 und Hertz 100 ist, dann:

seconds = utime / Hertz = 1234 / 100 = 12.34

Die eigentliche Berechnung erfolgt durch:

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

Beispiel (Ausgabe von einem benutzerdefinierten Bash-Skript):

$ ./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%

Berechnung der "aktuellen" Last mit ps

Dies ist ein (bisschen?) Zwielichtiges Unterfangen, aber in Ordnung. Lass uns gehen.

Man könnte die von zur Verfügung gestellten Zeiten nutzen psund daraus die CPU-Auslastung berechnen. Wenn man darüber nachdenkt, könnte es tatsächlich mit einigen Einschränkungen ziemlich nützlich sein.

Dies kann nützlich sein, um die CPU-Auslastung über einen längeren Zeitraum zu berechnen. Das heißt, Sie möchten die durchschnittliche CPU-Auslastung plugin-containerin Firefox überwachen, während Sie eine Firefox-bezogene Aufgabe ausführen.

Durch Verwendung der Ausgabe von:

$ 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.

Ich benutze etimees etimesin diesem Beispiel für Berechnungen, nur um es ein bisschen klarer zu machen. Außerdem füge ich% cpu zum "Spaß" hinzu. In zB einem Bash-Skript würde man offensichtlich verwenden etimes- oder besser aus /proc/<PID>/etc. lesen .

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

Der Prozess hat in dieser Zeit 38% der Zeit die CPU ausgelastet.

Schauen Sie sich den Code an

Wenn du wissen willst wie pses geht und ein wenig C kennst, mach (sieht aus als ob du Gnome Debain deriavnt ausführst) - nette Einstellung im Code bezüglich Kommentaren etc .:

apt-get source procps
cd procps*/ps
vim HACKING
Runium
quelle
Ich könnte ein Update mit mehr Informationen zu topund kontinuierlicher Überwachung durchführen - oder " ps" mit der aktuellen CPU-Auslastung " " durch Verzögerung einrasten .
Runium
2
Wirklich tolle Antwort!
Theodor
Was ist mit der Berechnung der gesamten CPU-Auslastung im gesamten System? Versuchen Tools, die CPU-Auslastung über einen Snapshot zu ermitteln oder über einen Zeitraum zu berechnen?
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
quelle
Hmm ja, ich frage mich, wie ich das bekommen kann (der momentane CPU-Prozentsatz) vonps
Theodor
2
Sie können von Top-Beispiel extrahierentop -p 3343 -n1 | awk '/ R /{print $10}'
Rahul Patil
1
Genial. Ich fand das awk: ing für das pidhat besser top -p 3343 -n1 | awk '/ 3343 /{print $10}'
Theodor
1
Danke "top -p" ist nett, ich habe diese Option nie bemerkt! Wie auch immer, ich suche nicht gerne nach der PID. Was ist, wenn zufällig die gleichen Ziffern im freien Speicherbereich erscheinen oder so. Auf meinem System befinden sich die Informationen in der 8. Zeile und in der 9. Spalte, daher mache ich:top -p $PID -n1 | awk '{if (NR ==8) print $9 }'
phil_w