So timen Sie ein Linux-Programm

0
185

Möchten Sie analysieren, wie viel Wanduhrzeit, Kernelzeit usw. ein Linux-Programm braucht, um zu laufen? Ob für Performance-Tests, Code-Optimierung oder einfach nur für allgemeine Neugier, diese Kurzanleitung hilft Ihnen beim Einstieg!

Timing Linux-Programme

Das Timing eines Linux-Programms hilft einem zu verstehen, wie viel Zeit aufgewendet wurde. Dazu kann der vielseitige Linux-Befehl time verwendet werden. Der Befehl time misst die reale (d. h. die Wanduhrzeit), die Benutzer- und die Systemzeit. Benutzerzeit ist die Zeit, in der das Programm im Benutzermodus läuft, also außerhalb des Kernels. Die sys-Zeit ist die Zeit, die das Programm im Kernel läuft.

Es ist wichtig zu beachten, dass sowohl die Benutzerzeit als auch die sys-Zeit die tatsächliche CPU-Zeit sind, die im Benutzermodus bzw. im Kernel verbracht wird. Mit anderen Worten, wenn ein Programm für eine Weile blockiert ist und die CPU nicht verwendet, wird diese Zeit nicht für den Benutzer angerechnetoder sys mal. Wenn wir dies wissen, können wir genau messen, wie viel effektive CPU-Zeit verwendet wurde (indem wir sie kombinieren).

Das Linux time-Tool

Angesichts der Tatsache, dass Benutzer und Systemzeiten nur die CPU-Zeit angeben, während Echtzeit die tatsächliche Wanduhrzeit anzeigt, ist es (also) sehr üblich, dass die Ausgabe des Zeittools, bei der eine Kombination von Benutzer + sys nicht der Echtzeit entspricht. Ein Beispiel ist beim Timing des Schlafs zu sehen:

Zeit Schlaf 1

Hier haben wir den Schlafbefehl mit dem Zeitwerkzeug zeitlich festgelegt. Wie wir sehen können, stimmt unsere echte Zeit (1,001 Sekunden) mit unserer Wanduhrzeit und der angeforderten Zeit (Schlaf 1 erfordert eine Sekunde Schlaf) sehr gut überein. Wir sehen auch, dass für den Befehl als Ganzes extrem wenig CPU-Zeit aufgewendet werden musste: Wenn wir Benutzer + sys-Zeit kombinieren, sehen wir, dass nur 0,001 Sekunden aufgewendet wurden.

Werbung

Wir können auch wahrscheinlich fälschlicherweise ableiten, dass der Kernel nicht an diesem Befehl beteiligt war, da das sysZeit ist effektiv 0. Im Zeithandbuch heißt es jedoch: “Wenn die Ausführungszeit eines Befehls fast Null ist, können einige Werte (z. B. der Prozentsatz der verwendeten CPU) als Null gemeldet werden (was falsch ist). ) oder ein Fragezeichen.”

Verwenden von Zeit zur Leistungsmessung

Wir können die Zeit verwenden, um zu bewerten, wie lange bestimmte Aktionen dauern (d. h. Wanduhrzeit) und wie viel CPU-Zeit sie dabei verbraucht haben. Als einfaches Beispiel könnten wir auswerten, ob ein Dateisystemcache auf unserem System läuft. Um dies zu tun, könnten wir in das Verzeichnis /usr springen, das bei einer gewöhnlichen Linux-Installation leicht 200.000 bis 500.000 Dateien enthalten könnte.

Wenn wir dort angekommen sind, können wir das Find-Tool verwenden, das zeitlich zeitgesteuert ist, um zu bewerten, wie es geht Es würde lange dauern, alle Ordner zu durchsuchen und alle Dateien im Verzeichnis /usr aufzulisten:

cd /usr time find . >/dev/null 2>&1

Wie wir sehen, dauert es 12.484 Sekunden, um alle Dateien im Verzeichnis /usr (und darunter) aufzulisten. Wir haben die stdout-Ausgabe (Standardausgabe) des Befehls nach >/dev/null umgeleitet und auch alle stderr-Fehler (Standardfehler) nach /dev/null umgeleitet, indem wir eine Umleitung von stderr nach stdout verwenden, dh 2>&1.

Wir sehen auch, dass unsere CPU-Zeit 1,043 Sekunden (Benutzer) + 2,908 Sekunden (sys) beträgt, was insgesamt 3,951 Sekunden CPU-Zeit ergibt.

Lassen Sie es testen ein anderes Mal, indem wir unseren Inode (und andere) Cache(s) löschen:

synchronisieren; Echo 3 | sudo tee /proc/sys/vm/drop_caches cd /usr time find . >/dev/null 2>&1

Werbung

Der erste Befehl löscht den Inodes-Cache, die Dentries (Verzeichniseinträge) und den Seitencache. Diesmal kam das Ergebnis etwas schneller zurück, mit 1,255 Sekunden auf dem Befehl gespeichert. Vermutlich hat hier ein physischer, festplattenbasierter Cache geholfen.

Um zu demonstrieren, wie gut Linux-Caching im Allgemeinen funktioniert, führen wir den Befehl erneut aus, aber diesmal ohne die Linux-Caches zu löschen:

Ein ziemlicher Unterschied! Wir sehen in allen drei zeitgesteuerten Bereichen eine starke Reduzierung der benötigten Zeit und unser Befehl wird in weniger als einer halben Sekunde ausgeführt!

Verwendung von Zeit Zur Code-Optimierung

Sobald wir uns mit dem Befehl time in der Befehlszeile wohl fühlen, können wir seine Verwendung erweitern, um unsere Bash-Skripte und unseren Code zu optimieren. Ein von einigen Fachleuten häufig verwendeter Ansatz besteht beispielsweise darin, einen bestimmten Befehl viele Male auszuführen, z. B. 1000 Läufe, und die Gesamt- (oder durchschnittliche) Zeit dieser Läufe zu berechnen.

Dann kann ein alternativer Befehl verwendet werden. Dieser alternative Befehl (oder Lösung/Implementierung – d. h. mehrere Befehle zusammengenommen als ein einzelner Codeabschnitt, der zeitlich festgelegt werden muss) kann dann erneut zeitlich festgelegt werden. Unter Linux (oder genauer gesagt in der Bash-Codierung usw.) gibt es oft viele Möglichkeiten, ein bestimmtes Problem anzugehen; Normalerweise stehen mehrere Tools zur Verfügung, um das gleiche Ergebnis zu erzielen.

Das Testen, welche Methode am besten abschneidet, optimiert die Programmlaufzeit und möglicherweise andere Faktoren wie Datenträger-E/A (Verringerung des Datenträgerverschleißes) oder Speicherauslastung (damit mehr Programme auf derselben Instanz ausgeführt werden können). Zur Optimierung der Wanduhrzeit, die ein bestimmtes Tool im Durchschnitt nutzt, kann auch die vom Tool verbrauchte CPU-Zeit (ein weiterer wichtiger Optimierungsfaktor/Betrachtung) durch das Zeittool gemessen werden.

Werbung
< p>Untersuchen wir ein praktisches Beispiel für die Verwendung der Befehlszeile, um einen Befehl auszuführen, den wir in einem unserer Skripte verwenden möchten. Der Befehl ruft eine Prozessliste ab und zeigt die zweite Spalte an. Wir verwenden dazu sowohl awk als auch sed und führen jeden Befehl 1000 Mal aus, um den Unterschied in der Gesamtleistung zu sehen.

Zeit für ((i=1;i<=1000;i++)); do ps -ef | awk '{print $2}' >/dev/null 2>&1; fertige Zeit für ((i=1;i<=1000;i++)); do ps -ef | sed 's|^[^ ]+[ t]+||;s|[ t].*||' >/dev/null 2>&1; done

Obwohl es komplexer aussieht (es verwendet einen doppelten regulären Ausdruck zum Analysieren in der zweiten Spalte), ist unser zweiter Befehl etwas schneller als unser erster Befehl, wenn es um die Uhrzeit der Wanduhr geht.

Verwenden eines sehr ähnlichen Setups (dh Zeit für ((i=1;i<=1000;i++)); do command_to_be_timed >/dev/null 2>&1; done wobei command_to_be_timed der Befehl ist, der für die Wanduhr getestet werden soll oder CPU-Zeit), kann man jeden Befehl oder jede Reihe von Befehlen zeitlich testen (wie hier; wir haben sowohl die Befehle ps als auch awk/sed verwendet).

Diese Schritte mehrere Zeit lang ausführen- verbrauchende Befehle (in jedem Linux-Skript) helfen uns, die Gesamtlaufzeit und/oder (wenn Sie auf reduzierte CPU-Zeit optimieren) die Systemlast unserer Skripte zu reduzieren.

Wenn Sie mehr darüber erfahren möchten Reguläre Ausdrücke, Wie man Text mit regulären Ausdrücken mit dem sed Stream Editor ändert, ist wahrscheinlich von Interesse.

Zusammenfassung

In diesem Artikel haben wir uns mit dem Linux-Befehl time beschäftigt. Wir haben geklärt, was real, user und sys-Zeiten bedeuten und wie sich die beiden letzteren auf die CPU-Auslastung beziehen. Wir haben uns auch mehrere Beispiele für die praktische Verwendung von Zeit angesehen.

Werbung

Wenn Ihnen das Lesen dieses Artikels gefallen hat, sehen Sie sich die Asserts, Errors and Crashes an: Was ist der Unterschied? und was ist Stack-Smashing? Kann es behoben werden?.