Messung der Festplatten-E / A-Nutzung eines Programms

12

time ist ein brillanter Befehl, wenn Sie herausfinden möchten, wie viel CPU-Zeit ein bestimmter Befehl benötigt.

Ich suche nach etwas ähnlichem, das die Scheibe I / O des Programms und irgendwelcher Kinder messen kann. Vorzugsweise sollte unterschieden werden zwischen zwischengespeicherten E / A-Vorgängen (und die Festplatte wurde nicht gedreht) und nicht zwischengespeicherten E / A-Vorgängen.

Also würde ich gerne machen:

iomeassure my_program my_args

und erhalte eine Ausgabe ähnlich der folgenden:

Cached read: 10233303 Bytes
Cached write: 33303 Bytes  # This was probably a tmp file that was erased before making it to the disk
Non-cached read: 200002020 Bytes
Non-cached write: 202020 Bytes

Ich habe betrachtet vmstat, iostatund sar, aber keiner von ihnen in einem einzigen Prozess suchen. Stattdessen betrachten sie das gesamte System.

Ich habe angeschaut iotop, aber das gibt mir nur einen Blick in diesem Moment.

--- edit ---

Die Antwort von snap scheint nahe zu sein.

"Dateisystemeingaben:" sind die nicht zwischengespeicherten Lesevorgänge in 512-Byte-Blöcken.

"Dateisystemausgaben:" sind die zwischengespeicherten Schreibvorgänge in 512-Byte-Blöcken.

Sie können das Leeren des Caches erzwingen mit:

sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null

Ich habe getestet mit:

 seq 10000000 > seq
 /usr/bin/time -v bash -c 'perl -e "open(G,\">f\"); print G <>;close G; unlink \"f\";" seq'
Ole Tange
quelle

Antworten:

9

Sie haben nicht angegeben, welches Betriebssystem Sie verwenden.

Linux

Anstatt time foo(normalerweise) eine integrierte Shell zu verwenden, können Sie auch den externen Befehl verwenden /usr/bin/time foo. Es enthält einige zusätzliche Informationen wie die Anzahl der Ein- und Ausgaben des Dateisystems (jedoch keine Informationen zu Cache-Treffern oder Byte-Mengen). Siehe man timeund man getrusagefür weitere Anweisungen.

Beachten Sie, dass für diese Funktion der Linux-Kernel ab Version 2.6.22 erforderlich ist.

FreeBSD

Verwenden Sie /usr/bin/time -l foo. Es gibt die Anzahl der Ein- und Ausgänge an. Siehe man timeund man getrusagefür weitere Anweisungen.

schnappen
quelle