it-swarm.com.de

Top und ps zeigen nicht das gleiche CPU-Ergebnis

Dies ist verbunden mit this Frage.

Wenn ich top ausführe, erhalte ich das folgende Ergebnis:

enter image description here

pid 3038 verwendet jedoch 18% CPU, wenn es ausgeführt wird

enter image description here

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

Durchschnittet der Befehl ps irgendwie die CPU-Auslastung?

54
Theodor

man ps Im Abschnitt NOTES.

   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 Sie wissen, aber Sie können auch:

top -p <PID>

Bearbeiten : zu Ihrem Kommentar zu einer anderen Antwort;

" Hmm ja, ich frage mich, wie ich das (den sofortigen CPU-Prozentsatz) von ps bekomme"

Kurze Antwort: Sie können nicht.

Wieso ist es so?

Es ist, als würde man jemanden bitten, die Geschwindigkeit eines Autos anhand eines Bildes zu berechnen.

Während top ein Überwachungstool ist, ist ps ein Snapshot-Tool. Stellen Sie sich das so vor: Zu jedem Zeitpunkt verwendet ein Prozess entweder die CPU oder nicht. Sie haben also genau in diesem Moment entweder 0% oder 100% Last.

Geben: Wenn ps sofortige CPU-Auslastung geben sollte, wäre dies entweder 0% oder 100%.

top hingegen fragt weiter nach Zahlen und berechnet die Last über die Zeit.

ps hätte die aktuelle Verwendung angeben können - dies würde jedoch erfordern, dass Daten mehrmals gelesen und zwischen jedem Lesevorgang in den Ruhezustand versetzt werden. 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. 
 
 ;; Der Sekundenprozess wurde ausgeführt: 
 Sekunden = Betriebszeit - ps_time 
 ;; Verwendung: 
 CPU_usage = pu_time * 1000/Sekunden 
 
 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 
 
 print: 153/10 "." 153% 10 => 15,3 
 

Die gedruckte Zahl lautet also: Zeit, in der der Prozess die CPU während ihrer Lebensdauer verwendet hat. Wie im obigen Beispiel. Es hat dies in 15,3% seiner Lebensdauer getan. In 84,7% der Fälle wurde die CPU nicht abgehört.

Datenabruf

ps sowie top verwenden Daten aus Dateien, die unter /proc/ - oder dem Prozessinformations-Pseudodateisystem gespeichert sind.

Sie haben einige Dateien im Stammverzeichnis von /proc/, Die verschiedene Informationen zum Gesamtstatus des Systems enthalten. Zusätzlich hat jeder Prozess einen eigenen Unterordner /proc/<PID>/, In dem prozessspezifische Daten gespeichert werden. So hatte beispielsweise der Prozess aus Ihrer Frage einen Ordner unter /proc/3038/.

Wenn ps die CPU-Auslastung berechnet, werden zwei Dateien verwendet:

/ proc/uptime Die Betriebszeit des Systems (Sekunden) und die im Leerlauf verbrachte Zeit (Sekunden). 
/proc/[PID]/stat Statusinformationen zum Prozess. 
  • Ab uptime wird der erste Wert verwendet ( Betriebszeit).
  • Ab [PID]/stat Wird Folgendes verwendet:
 # Name Beschreibung 
 14 Utime-CPU-Zeit im Benutzercode, gemessen in Sekundenschnelle 
 15 Stime-CPU-Zeit im Kernel-Code, gemessen in Jiffies 
 16 Cutime-CPU-Zeit im Benutzercode , einschließlich der Zeit von Kindern 
 17 cstime CPU-Zeit im Kernel-Code, einschließlich der Zeit von Kindern 
 22 Startzeit Zeit, zu der der Prozess gestartet wurde, gemessen in Sekundenschnelle 

A jiffie ist ein Uhrentick. Daher werden zusätzlich verschiedene Methoden verwendet, z. B. sysconf(_SC_CLK_TCK), um den Hertz-Wert des Systems (Anzahl der Ticks pro Sekunde) zu ermitteln. Letztendlich werden 100 als Ersatz verwendet, nachdem andere Optionen ausgeschöpft wurden.

Wenn also utime 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 eines benutzerdefinierten Bash-Skripts):

$ ./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 "aktuell" Last mit ps

Dies ist ein (etwas?) Schattiges Unterfangen, aber OK. Lass uns versuchen.

Man könnte die von ps bereitgestellten Zeiten verwenden und daraus die CPU-Auslastung berechnen. Wenn man darüber nachdenkt, könnte es mit einigen Einschränkungen tatsächlich ziemlich nützlich sein.

Dies kann nützlich sein, um die CPU-Auslastung über einen längeren Zeitraum zu berechnen. Das heißt, Angenommen, Sie möchten die durchschnittliche CPU-Auslastung von plugin-container in 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 verwende etime über etimes in diesem Beispiel bei Berechnungen, nur um ein bisschen klarer zu sein. Außerdem füge ich% cpu für "Spaß" hinzu. In d. H. Einem Bash-Skript würde man offensichtlich etimes verwenden - oder besser aus /proc/<PID>/ Usw. 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 verwendete in diesem Zeitraum 38% der Zeit die CPU.

Schauen Sie sich den Code an

Wenn Sie wissen möchten, wie ps es macht, und ein wenig C wissen möchten, tun Sie dies (es sieht so aus, als würden Sie Gnome Debain deriavnt ausführen) - Gute Einstellung im Code in Bezug auf Kommentare usw.:

apt-get source procps
cd procps*/ps
vim HACKING
89
Runium
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).
4
Rahul Patil