unix - usr - man time




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

real : Die tatsächliche Zeit, die für die Ausführung des Prozesses von Anfang bis Ende aufgewendet wurde, als ob er von einem Menschen mit einer Stoppuhr gemessen wurde

user : Die kumulative Zeit, die alle CPUs während der Berechnung benötigen

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

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

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


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

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


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 CPU-Zeit, die nur vom Prozess verwendet wird.

  • Real ist die 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 innerhalb des Prozesses im Benutzermodus-Code (außerhalb des Kernels) verbracht wurde. 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 CPU-Zeit, die für Systemaufrufe innerhalb des Kernels benötigt wird, im Gegensatz zum Bibliothekscode, der noch im Benutzerbereich ausgeführt wird, ausgeführt wird. 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 sagt Ihnen, 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 Real Wanduhrzeit überschreiten (was normalerweise auftritt). Beachten Sie, dass diese Zahlen in der Ausgabe die User und Sys Zeit aller untergeordneten Prozesse (und ihrer Nachkommen) sowie die Zeitpunkte enthalten, zu denen sie gesammelt werden konnten, z. B. durch wait(2) oder waitpid(2) , obwohl die zugrunde liegenden Systemaufrufe zurückgeben Statistiken für den Prozess und seine Kinder getrennt.

Ursprünge der Statistiken nach time (1)

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

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 einem anderen Betriebssystem mit geschütztem Speicher bezieht sich der Modus "Kernel" oder "Supervisor" auf einen privilegierten Modus , in dem die CPU arbeiten kann. Bestimmte privilegierte Aktionen, die die Sicherheit oder Stabilität beeinträchtigen könnten, können nur ausgeführt werden, wenn die CPU in Betrieb ist dieser Modus; Diese Aktionen sind für den Anwendungscode nicht verfügbar. Ein Beispiel für eine solche Aktion könnte eine Manipulation der MMU , um auf den Adressraum eines anderen Prozesses zuzugreifen. Normalerweise kann der user-mode dies nicht (aus gutem Grund) tun, obwohl er gemeinsam genutzten Speicher vom Kernel anfordern kann, der von mehr als einem Prozess gelesen oder geschrieben werden kann. 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 Kernel-Modus zu wechseln, müssen Sie eine bestimmte Anweisung (oft als trap ) ausgeben, die die CPU in den Kernel-Modus versetzt und Code von einem bestimmten Speicherort in einer Sprungtabelle ausführt. 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 aufrufen. Hinter den Kulissen können sie einen oder mehrere Systemaufrufe an den Kernel ausgeben, 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 here.

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 fread (wie malloc oder fread / fwrite ), rufen diese Kernel-Funktionen auf und zählen dann als 'sys' time. Leider ist es nicht so einfach wie "jeder Anruf zu malloc wird in 'sys' Zeit gezählt werden." Der Aufruf von malloc führt eine eigene Verarbeitung aus (die immer noch in Benutzerzeit gezählt wird) und dann kann sie die Funktion im Kernel aufrufen (in sys-Zeit gezählt). Nach der Rückkehr von dem Kernel-Aufruf wird es noch etwas mehr Zeit in 'Benutzer' geben und dann wird malloc zu Ihrem 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 harmlose Funktionen könnten malloc und dergleichen im Hintergrund verwenden, die dann wieder etwas Zeit in 'sys' haben.







benchmarking