Warum variieren die Benutzer- und Systemzeiten bei mehreren Ausführungen?

Warum variieren die Benutzer- und Systemzeiten bei mehreren Ausführungen?

Es gibt eine schöneFrage und AntwortErläuterung der Beziehungen zwischen „real“, „user“ und „sys“.

Es erläutert die Gründe, warum „real“ variieren kann, und definiert „user“ und „sys“ als die Zeit, die der Prozess tatsächlich auf dem Prozessor ausgeführt hat.

Lassen Sie uns jetzt „real“ komplett ignorieren. Mir ist aufgefallen, dass beim mehrmaligen Ausführen derselben Anwendung unterschiedliche „Sys“ und „Benutzer“ ausgegeben werden.

$time dummy_app
user    0m0.032s
sys     0m0.064s

$time dummy_app
user    0m0.020s
sys     0m0.084s

Die dummy_app ist nur eine For-Schleife, die von 0-100000 zählt.

Was ist der Grund dafür, dass die Ausführung derselben Binärdatei auf dem Prozessor unterschiedlich lange dauert? Mit anderen Worten, warum sind „Benutzer“ und „System“ für dieselbe App nicht immer gleich?

Antwort1

Warum die Ausführungszeiten derselben Binärdatei bei mehreren Ausführungen unterschiedlich sind

Das Hauptproblem hierbei ist das nichtdeterministische Verhalten aufgrund der Funktionsweise der CPU. Moderne superskalare CPUs können mehrere Anweisungen gleichzeitig ausführen oder die Reihenfolge der auszuführenden Befehle ändern (Ausführung außerhalb der Reihenfolge). In Bezug auf Ihr Beispiel ist es auch möglich, dass eine Optimierung der Cache-Nutzung zum Tragen kommt. RAM ist um mehrere Größenordnungen langsamer als die CPU selbst, deshalb wird intensives Caching verwendet. Der zweite Durchlauf Ihrer Binärdatei wird möglicherweise im Cache ausgeführt und verbraucht somit weniger CPU-Zyklen (Zyklen, die die CPU gewartet hätte, bis die Daten aus dem Speicher abgerufen wurden).

Über den Unterschied zwischen realen, Benutzer- und Systemprozesszeitstatistiken

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

  • Realist die Echtzeit – die Zeit vom Beginn bis zum Ende des Anrufs. Dies ist die gesamte verstrichene Zeit, einschließlich der von anderen Prozessen genutzten Zeitscheiben und der Zeit, die der Prozess blockiert verbringt (z. B. wenn er auf den Abschluss der E/A wartet).

  • Benutzerist die Menge an CPU-Zeit, die aufgewendet wirdim BenutzermodusCode (außerhalb des Kernels)innerhalbder Prozess. Dies ist nur die tatsächliche CPU-Zeit, die bei der Ausführung des Prozesses verwendet wird. Andere Prozesse und die Zeit, die der Prozess blockiert verbringt, werden bei dieser Zahl nicht berücksichtigt.

  • Systemist die Menge an CPU-Zeit, die aufgewendet wirdim Kernelinnerhalb des Prozesses. Dies bedeutet, dass die CPU-Zeit, die für Systemaufrufe aufgewendet wird, ausgeführt wirdinnerhalb des Kernels,im Gegensatz zu Bibliothekscode, der immer noch im Benutzerbereich ausgeführt wird. Wie bei „user“ ist dies nur die vom Prozess verwendete CPU-Zeit. Unten finden Sie eine kurze Beschreibung des Kernelmodus (auch als „Supervisor“-Modus bekannt) und des Systemaufrufmechanismus.

User+Sysgibt an, wie viel tatsächliche CPU-Zeit Ihr Prozess verbraucht hat. Beachten Sie, dass dies für alle CPUs gilt. Wenn der Prozess also mehrere Threads hat, kann er möglicherweise die von gemeldete Echtzeit überschreiten Real. Beachten Sie, dass diese Zahlen in der Ausgabe auch die Userund Sysdie Zeit aller Kindprozesse (und ihrer Nachkommen) enthalten, wenn sie z. B. von wait(2)oder hätten erfasst werden können waitpid(2), obwohl die zugrunde liegenden Systemaufrufe die Statistiken für den Prozess und seine Kinder separat zurückgeben.

Quelle

verwandte Informationen