Was genau sind Wanduhrzeit, Benutzer-CPU-Zeit und System-CPU-Zeit unter UNIX?


144

Ich kann anhand der Namen raten, aber was genau sind Wanduhrzeit, Benutzer-CPU-Zeit und System-CPU-Zeit unter UNIX?

Ist die Benutzer-CPU-Zeit die Zeit, die für die Ausführung des Benutzercodes aufgewendet wird, während die Kernel-CPU-Zeit die Zeit ist, die im Kernel verbracht wird, weil privilegierte Vorgänge (wie E / A auf der Festplatte) erforderlich sind?

In welcher Zeiteinheit ist diese Messung?

Und ist die Wanduhrzeit wirklich die Anzahl der Sekunden, die der Prozess für die CPU aufgewendet hat, oder ist der Name nur irreführend?


Antworten:


142

Die Wanduhrzeit ist die Zeit, die eine Uhr an der Wand (oder eine Stoppuhr in der Hand) als zwischen dem Beginn des Prozesses und "jetzt" verstrichen messen würde.

Die Benutzer-CPU-Zeit und die System-CPU-Zeit sind so ziemlich wie Sie sagten - die Zeit, die im Benutzercode verbracht wird, und die Zeit, die im Kernel-Code verbracht wird.

Die Einheiten sind Sekunden (und Subsekunden, die Mikrosekunden oder Nanosekunden sein können).

Die Wanduhrzeit ist nicht die Anzahl der Sekunden, die der Prozess für die CPU aufgewendet hat. Dies ist die verstrichene Zeit, einschließlich der Wartezeit auf das Einschalten der CPU (während andere Prozesse ausgeführt werden).


16
Bedeutet dies also, dass die Wanduhrzeit immer größer als die CPU-Zeit ist?
Pacerier

35
@Pacerier: Auf einem Single-Core-Computer, ja, aber Multi-Core-Computer und Multithread-Programme können mehr als 1 CPU-Sekunde pro verstrichene Sekunde verwenden.
Jonathan Leffler

@ JonathanLeffler, danke für die Antwort. Ich wollte die Anzahl der verstrichenen Nanosekunden ermitteln, aber die Berechnung der CPU-Zeit mithilfe der Formel CPUtime = #clock_cycles / clock_ratekann nicht mit der Berechnung der verstrichenen Zeit identisch sein. Wissen Sie, ob ich die verstrichene Zeit aus der CPU-Zeit abrufen kann?
Bionix1441

2
@ Bionix1441: Sie können aus mehreren Gründen die verstrichene Zeit nicht aus der CPU-Zeit ableiten. Erstens kann ein Prozess für beliebige Zeiträume inaktiv sein und keine CPU-Zeit beanspruchen (z. B. ein Dämonprozess, der darauf wartet, dass ein Client über das Netzwerk eine Verbindung zu ihm herstellt), sodass er möglicherweise tagelang nichts unternimmt . Zweitens, wenn es ausgeführt wird, kann es mehrere Threads haben, und wenn es beispielsweise 4 Threads hat und 4 oder mehr Kerne auf dem System vorhanden sind, kann es 4 CPU-Sekunden pro Sekunde der verstrichenen Zeit verbrauchen. Diese zeigen, dass es keine einfache (oder sogar komplexe) Formel gibt, die Sie verwenden könnten.
Jonathan Leffler

1
@Catbuilts: Ist Ihnen bekannt, dass der Unix-Kernel getrennt von Benutzerprogrammen ausgeführt wird? Wenn Ihr Programm einen Systemaufruf ausführt (z. B. read()oder getpid()), führt der Kernel Code für Ihr Programm aus. Der Kernel übernimmt auch vorbeugendes Multitasking, damit andere Programme an die Reihe kommen, und führt einige allgemeine Verwaltungsarbeiten durch, um den reibungslosen Betrieb des Systems zu gewährleisten. Dieser Code wird im 'Kernel-Code' ausgeführt (auch im 'Kernel-Modus'). Dies unterscheidet sich von dem von Ihnen geschriebenen Code und den von Ihnen ausgeführten Benutzerbibliotheken (einschließlich der System-C-Bibliothek).
Jonathan Leffler

36

Wanduhrzeit: Die verstrichene Zeit richtet sich nach der internen Uhr des Computers, die mit der Zeit in der Außenwelt übereinstimmen sollte. Dies hat nichts mit der CPU-Auslastung zu tun. es wird als Referenz gegeben.

Benutzer-CPU-Zeit und Systemzeit: genau das, was Sie denken. Systemaufrufe, die Folgendes umfassen I / O - Aufrufe wie read, writeusw. durch einen Sprung in Kernel - Code ausgeführt werden , und dass die Ausführung.

Wenn die Wanduhrzeit <CPU-Zeit ist, führen Sie ein Programm parallel aus. Wenn Wanduhrzeit> CPU-Zeit, warten Sie auf Festplatte, Netzwerk oder andere Geräte.

Alle werden in Sekunden pro SI gemessen .


7

Die Wanduhrzeit ist genau das, was sie sagt. Die verstrichene Zeit wird gemessen an der Uhr an Ihrer Wand (oder Armbanduhr).

Die Benutzer-CPU-Zeit ist die Zeit, die im "Benutzerland" verbracht wird, dh die Zeit, die für Nicht-Kernel-Prozesse aufgewendet wird

Die System-CPU-Zeit ist die im Kernel verbrachte Zeit, normalerweise die Zeit, die für die Bearbeitung von Systemaufrufen aufgewendet wird.


7
time [WHAT-EVER-COMMAND]

real    7m2.444s
user    76m14.607s
sys 2m29.432s

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                24

echte oder Wanduhr

echte 7m2.444s

Auf einem System mit 24-Kern-Prozessor dauerte dieser cmd / Prozess mehr als 7 Minuten. Dies durch Nutzung der größtmöglichen Parallelität mit allen gegebenen Kernen.

Benutzer

Benutzer 76m14.607s

Der cmd / Prozess hat so viel CPU-Zeit verbraucht. Mit anderen Worten, auf einem Computer mit Single-Core-CPU sind Real und Benutzer nahezu gleich, sodass der gleiche Befehl ca. 76 Minuten dauert.

sys

sys 2m29.432s

Dies ist die Zeit, die der Kernel benötigt, um alle Operationen auf Basis- / Systemebene auszuführen, um dieses Cmd auszuführen, einschließlich Kontextwechsel, Ressourcenzuweisung usw.

Hinweis: In diesem Beispiel wird davon ausgegangen, dass Ihr Befehl Parallelität / Threads verwendet.

Detaillierte Manpage: https://linux.die.net/man/1/time


Ist es angesichts der von Ihnen geposteten Zeiten nicht ungefähr die Hälfte der Parallelität? ( (user + sys) / real
Ich
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.