2014-06-27 11 views
11

Ich arbeite an einem Simulationsmodell, bei dem ich feststellen möchte, wann die Speicher-IOPS-Kapazität zu einem Engpass wird (z. B. und HDD hat ~ 150 IOPS, während eine SSD 150.000 haben kann). Also versuche ich, einen Weg zu finden, IOPS in einem Befehl (git) für einige seiner verschiedenen Operationen (push, pull, merge, clone) zu benchmarken.Wie IOPS für einen Befehl in Linux zu messen?

Bisher habe ich Werkzeuge wie Iostat gefunden, aber ich bin mir nicht sicher, wie man den Bericht darauf beschränkt, was ein einzelner Befehl tut. mein IOPS

Die beste Idee, die ich mit ist aufwarten kann meine HDD IOPS Kapazität, um zu bestimmen, Zeit auf dem tatsächlichen Befehl verwenden, sehen, wie lange dauert es, multiplizieren Sie diese mit IOPS und die sind:

HDD ->150 IOPS 
time df -h 

real 0m0.032s 

150 * .032 = 4.8 IOPS 

Aber das ist natürlich sehr dumm, weil die Dauer der Ausführung möglicherweise mit der CPU-Nutzung und nicht mit der Festplattennutzung zusammenhängt. Wenn also die Festplatte nicht zu 100% für diese Zeit verwendet wurde, macht es keinen Sinn, solche Dinge zu messen.

Also, wie kann ich die IOPS für einen Befehl messen?

+1

Mögliches Duplikat von [dieser SO Frage] (http://stackoverflow.com/questions/249570/how-can-i-record-what-process-orkernel-activity-is-using-the-disk- in-gnu-linux) oder [diese Serverfehlerfrage] (http://serverfault.com/questions/586774/getting-iops-of-the-processes-on-linux) Kann aufgrund von Bounty nicht als Duplikat markieren – Appleman1234

+0

Was ist dein Betriebssystem? Haben Sie [DTrace] (http://www.brendangregg.com/dtrace.html) überprüft, was für Unix/MacOS X/Solaris oder [SystemTap] (https://sourceware.org/systemtap/examples/keyword-index) gilt .html) welches kann für Linux verwendet werden? – VolenD

Antwort

11

Es gibt mehrere time (1) -Befehle auf einem typischen Linux-System; Der Standard ist ein bash (1) Built-in, der etwas grundlegend ist. Es gibt auch /usr/bin/time, die Sie ausführen können, indem Sie es entweder genau so aufrufen oder bash (1) anweisen, keine Aliase und Built-Ins zu verwenden, indem Sie ihm einen Backslash voranstellen: \time. Debian hat es im "time" -Paket, das standardmäßig installiert wird, Ubuntu ist wahrscheinlich identisch und andere Distributionen werden sich sehr ähneln.

es in ähnlicher Weise an der Schale builtin Aufrufe ist bereits ausführliche und informativ, wenn auch vielleicht undurchsichtige, wenn Sie bereits vertraut sind mit dem, was die Zahlen bedeuten wirklich:

$ \time df 
[output elided] 
0.00user 0.00system 0:00.01elapsed 66%CPU (0avgtext+0avgdata 864maxresident)k 
0inputs+0outputs (0major+261minor)pagefaults 0swaps 

Allerdings würde ich Ihre Aufmerksamkeit auf die man-Seite zu ziehen, die die -f Option listet das Ausgabeformat, und insbesondere das %w Format, das zählt die Anzahl, wie oft der Prozess gab seine CPU-Zeitscheibe für I/O anpassen:

$ \time -f 'ios=%w' du Maildir >/dev/null 
ios=184 
$ \time -f 'ios=%w' du Maildir >/dev/null 
ios=1 

Beachten Sie, dass der erste Lauf 184 Mal für E/A gestoppt wurde, der zweite jedoch nur einmal gestoppt wurde.Die erste Zahl ist glaubwürdig, da es 124 Verzeichnisse in meinem ~/Maildir gibt: das Lesen des Verzeichnisses und der Inode ergeben ungefähr zwei IOPS pro Verzeichnis, weniger ein bisschen, weil einige Inodes wahrscheinlich nebeneinander lagen und in einer Operation gelesen wurden, plus einige extra noch einmal für das Mapping in du (1) binär, gemeinsam genutzte Bibliotheken und so weiter.

Die zweite Zahl ist natürlich niedriger aufgrund des Festplatten-Cache von Linux. Das letzte Stück ist also, den Cache zu leeren. sync (1) ist ein bekannter Befehl, der schmutzige Schreibvorgänge auf die Festplatte löscht, den Lese-Cache jedoch nicht löscht. Sie können diese löschen, indem Sie 3 an /proc/sys/vm/drop_caches schreiben. (. Andere Werte sind auch gelegentlich nützlich, aber Sie wollen 3 hier) als Nicht-Root-Benutzer, der einfachste Weg, dies zu tun ist:

echo 3 | sudo tee /proc/sys/vm/drop_caches 

Die Kombination, dass mit /usr/bin/time sollten Sie die Skripte, die Sie bauen lassen müssen die Befehle zur Benchmark sind Sie interessiert in

Als kleineren beiseite, T-stück (1) verwendet wird, da dies nicht funktionieren.

sudo echo 3 >/proc/sys/vm/drop_caches 

der Grund? Obwohl das Echo (1) als root ausgeführt wird, entspricht die Umleitung Ihrem normalen Benutzerkonto, das keine Schreibberechtigungen für drop_caches hat. tee (1) führt die Umleitung effektiv als root aus.

+0

TIL ''\ time'' und Cache-Clearing. Vielen Dank – xtreak

4

können Sie pidstat verwenden:
pidstat -d 2
Insbesondere pidstat -d 2 | grep COMMAND oder pidstat -C COMMANDNAME -d 2

Der pidstat Befehl zur Überwachung einzelner Aufgaben verwendet wird zur Zeit vom Linux-Kernel verwaltet wird. Es schreibt in Standardausgabeaktivitäten für jede mit der Option -p ausgewählte Aufgabe oder für jede Aufgabe, die vom Linux-Kernel verwaltet wird, wenn die Option -p ALL verwendet wurde. Wenn Sie keine Tasks auswählen, entspricht dies der Angabe von -p ALL. Es werden jedoch nur aktive Tasks (Tasks mit von Null verschiedenen Statistikwerten) im Bericht angezeigt. Der Befehl pidstat kann auch zum Überwachen der untergeordneten Prozesse ausgewählter Aufgaben verwendet werden.

-C CommDisplay nur Aufgaben, deren Befehlsname den Stringcomm enthält. Diese Zeichenfolge kann ein regulärer Ausdruck sein.

+0

Das klang interessant, also habe ich es auf meiner Ubuntu 13.04-Box ausprobiert und 'command not found: pidstat' bekommen. Stellt sich heraus, es ist nicht standardmäßig enthalten, also musste ich "sudo apt-get install sysstat". (Erwähnen Sie nur, um anderen Passanten ein wenig Googeln und/oder "apt-Dateisuche" zu ersparen ...) – evadeflow

8

Der Befehl iotop sammelt E/A-Verwendungsinformationen zu Prozessen unter Linux. Standardmäßig handelt es sich um einen interaktiven Befehl, aber Sie können ihn im Stapelmodus mit -b/--batch ausführen. Sie können auch eine Liste von Prozessen mit -p/--pid. So können Sie die Aktivität eines git Befehl mit Monitor:

$ sudo iotop -p $(pidof git) -b 

Sie können die Verzögerung mit -d/--delay ändern.

Verwandte Themen