Frage Was bedeuten 'real', 'user' und 'sys' in der Ausgabe von time (1)?


$ time foo
real        0m0.003s
user        0m0.000s
sys         0m0.004s
$

Was bedeuten "real", "user" und "sys" in der Ausgabe von Zeit?

Welche ist beim Benchmarking meiner App sinnvoll?


1341
2018-02-17 11:33


Ursprung


Antworten:


Echtzeitstatistiken für Real, User und Sys

Eines dieser Dinge ist nicht wie das andere. Real bezieht sich auf die tatsächliche verstrichene Zeit; User und Sys beziehen sich auf die verwendete CPU-Zeit nur durch den Prozess.

  • Echt ist Wanduhrzeit - Zeit vom Anfang bis zum Ende des Anrufs. Dies ist die gesamte verstrichene Zeit einschließlich der Zeitscheiben, die von anderen Prozessen verwendet werden, und der Zeit, die der Prozess blockiert ist (z. B. wenn er darauf wartet, dass die E / A abgeschlossen wird).

  • Benutzer ist die Menge an CPU-Zeit, die im Benutzermodus-Code verbracht wurde (außerhalb des Kernels) innerhalb der Prozess. Dies ist nur die tatsächliche CPU-Zeit, die zur Ausführung des Prozesses verwendet wird. Andere Prozesse und Zeiten, in denen der Prozess blockiert ist, zählen nicht zu dieser Zahl.

  • Sys ist die Menge an CPU-Zeit, die innerhalb des Prozesses im Kernel verbracht wird. Dies bedeutet, dass die in Systemaufrufen verbrachte CPU-Zeit ausgeführt wird innerhalb des Kernels, im Gegensatz zum Bibliothekscode, der immer noch im User-Space läuft. Wie 'Benutzer' wird nur die CPU-Zeit vom Prozess verwendet. Im Folgenden finden Sie eine kurze Beschreibung des Kernel-Modus (auch "Supervisor" -Modus genannt) und des Systemaufrufmechanismus.

User+Sys wird Ihnen sagen, wie viel CPU-Zeit Ihr Prozess tatsächlich verbraucht hat. Beachten Sie, dass dies für alle CPUs gilt. Wenn der Prozess also mehrere Threads umfasst (und dieser Prozess auf einem Computer mit mehr als einem Prozessor ausgeführt wird), könnte er möglicherweise die von ihm angegebene Uhrzeit überschreiten Real (was normalerweise vorkommt). Beachten Sie, dass in der Ausgabe diese Zahlen enthalten sind User und Sys Zeit aller Kindprozesse (und ihrer Nachkommen) sowie wann sie gesammelt worden sein könnten, z. durch wait(2) oder waitpid(2), obwohl die zugrunde liegenden Systemaufrufe die Statistiken für den Prozess und seine untergeordneten Elemente separat zurückgeben.

Ursprünge der von time (1)

Die Statistiken von time werden aus verschiedenen Systemaufrufen gesammelt. 'User' und 'Sys' kommen von wait (2) oder times (2), abhängig vom jeweiligen System. 'Real' wird aus einer Anfangs- und Endzeit berechnet, die von der gettimeofday (2) Anruf. Abhängig von der Version des Systems können verschiedene andere Statistiken, wie beispielsweise die Anzahl von Kontextumschaltungen, ebenfalls gesammelt werden time.

Auf einem Multiprozessor-Computer kann ein Prozess mit mehreren Threads oder ein Prozess, der Forking unterordnet, eine geringere Zeit haben als die gesamte CPU-Zeit - da verschiedene Threads oder Prozesse möglicherweise parallel ausgeführt werden. Außerdem stammen die gemeldeten Zeitstatistiken aus unterschiedlichen Quellen, so dass Zeiten, die für sehr kurz laufende Aufgaben aufgezeichnet wurden, Rundungsfehlern unterliegen können, wie das Beispiel des ursprünglichen Posters zeigt.

Eine kurze Einführung in den Kernel vs. User-Modus 

Unter Unix oder jedem Betriebssystem mit geschütztem Speicher "Kernel" oder "Supervisor" Modus bezieht sich auf a privilegierter Modus in der die CPU arbeiten kann. Bestimmte privilegierte Aktionen, die die Sicherheit oder Stabilität beeinträchtigen könnten, können nur durchgeführt werden, wenn die CPU in diesem Modus arbeitet. Diese Aktionen sind für den Anwendungscode nicht verfügbar. Ein Beispiel für eine solche Aktion könnte die Manipulation der MMU um Zugriff auf den Adressraum eines anderen Prozesses zu erhalten. Normalerweise, Benutzermodus Code kann das nicht (aus gutem Grund), obwohl es anfordern kann geteilte Erinnerung aus dem Kernel, der könnte von mehr als einem Prozess gelesen oder geschrieben werden. In diesem Fall wird der Shared Memory explizit vom Kernel über einen sicheren Mechanismus angefordert und beide Prozesse müssen explizit an ihn angehängt werden, um ihn zu benutzen.

Der privilegierte Modus wird üblicherweise als "Kernel" -Modus bezeichnet, da der Kernel von der CPU ausgeführt wird, die in diesem Modus läuft. Um in den Kernelmodus zu wechseln, müssen Sie eine bestimmte Anweisung (oft als a Falle), die die CPU in den Kernel-Modus versetzt und führt Code von einem bestimmten Ort aus, der in einer Sprungtabelle enthalten ist.  Aus Sicherheitsgründen können Sie nicht in den Kernel-Modus wechseln und beliebigen Code ausführen - die Traps werden über eine Adressentabelle verwaltet, in die nur geschrieben werden kann, wenn die CPU im Supervisormodus ausgeführt wird. Sie fangen mit einer expliziten Trap-Nummer und die Adresse wird in der Sprungtabelle nachgeschlagen; Der Kernel hat eine endliche Anzahl von kontrollierten Eintrittspunkten.

Die Systemaufrufe in der C-Bibliothek (insbesondere die in Abschnitt 2 der Handbuchseiten beschriebenen) haben eine Benutzermoduskomponente, die Sie tatsächlich von Ihrem C-Programm aus aufrufen. Hinter den Kulissen können sie einen oder mehrere Systemaufrufe an den Kernel senden, um bestimmte Dienste wie E / A auszuführen, aber sie haben weiterhin Code, der im Benutzermodus ausgeführt wird. Es ist auch möglich, einen Trap direkt aus jedem beliebigen Benutzer-Space-Code in den Kernel-Modus auszugeben, obwohl Sie möglicherweise ein Snippet der Assembler-Sprache schreiben müssen, um die Register für den Aufruf korrekt einzurichten. Eine Seite mit den Systemaufrufen des Linux-Kernels und den Konventionen zum Einrichten von Registern finden Sie Hier.

Mehr über 'sys' 

Es gibt Dinge, die Ihr Code im Benutzermodus nicht tun kann - Dinge wie die Zuweisung von Speicher oder den Zugriff auf Hardware (Festplatte, Netzwerk usw.). Diese stehen unter der Aufsicht des Kernels und können sie alleine machen. Einige Operationen, die Sie ausführen (wie malloc oderfread/fwrite) ruft diese Kernel-Funktionen auf und zählt dann als 'sys' time. Leider ist es nicht so einfach wie "jeder Anruf zu malloc wird in 'sys' Zeit gezählt werden." Der Anruf zu malloc macht eine eigene Verarbeitung (die immer noch in 'Benutzerzeit' gezählt wird) und kann dann irgendwo auf dem Weg die Funktion im Kernel aufrufen (gezählt in 'sys' Zeit). Nach der Rückkehr vom Kernel-Aufruf, wird es noch einige Zeit in 'Benutzer' und dann malloc wird zu deinem Code zurückkehren. Was wann passiert und wie viel davon im Kernel-Modus verbraucht wird ... kann man nicht sagen. Es hängt von der Implementierung der Bibliothek ab. Auch andere scheinbar unschuldige Funktionen könnten ebenfalls Verwendung finden malloc und dergleichen im Hintergrund, die dann wieder etwas Zeit in 'sys' haben werden.


1608
2018-04-29 05:29



Um auf dem erweitern akzeptierte AntwortIch wollte nur einen weiteren Grund dafür nennen real ≠ user + sys.

Denk daran, dass real repräsentiert die tatsächlich abgelaufene Zeit, während user und sys Werte repräsentieren die CPU-Ausführungszeit. Als Ergebnis wird in einem Multicore-System die user und / oder sys Zeit (wie auch ihre Summe) kann tatsächlich überschreiten die Echtzeit. Bei einer Java-Anwendung, die ich für die Klasse verwende, erhalte ich beispielsweise folgende Werte:

real    1m47.363s
user    2m41.318s
sys     0m4.013s

213
2017-11-05 04:34



Real zeigt die Gesamtdurchlaufzeit für einen Prozess an; während Benutzer die Ausführungszeit für benutzerdefinierte Anweisungen anzeigt und Sys ist Zeit für die Ausführung von Systemaufrufen!

Echtzeit beinhaltet auch die Wartezeit (die Wartezeit für I / O etc.)


14
2017-11-24 19:05



echt: Die tatsächliche Zeit, in der der Prozess von Anfang bis Ende ausgeführt wurde, als ob er von einem Menschen mit einer Stoppuhr gemessen wurde

Benutzer: Die kumulative Zeit, die von allen CPUs während der Berechnung verbracht wurde

sys: Die kumulative Zeit, die von allen CPUs während systembezogener Aufgaben wie der Speicherzuweisung verbracht wurde.

Beachten Sie, dass manchmal Benutzer + sys größer als real sein kann   mehrere Prozessoren können parallel arbeiten.


6