Gibt es einen zuverlässigen Weg, um festzustellen, wie viel Zeit I / O ist

403
Lembik

Ich bin mit dem Timing von Code beschäftigt und würde gerne sagen, wie viel Zeit durch das Einlesen der Daten von der Festplatte benötigt wird. Ich glaube nicht an das Ergebnis, timedas mich gibt. Zum Beispiel habe ich eine 1,3 GB-Datei und wenn ich renne, wcbekomme ich

time wc largefile.file  50000000 150000000 1316665179 largefile.file  real 0m26.835s user 0m18.363s sys 0m0.495s 

Es kann unmöglich <0,5 Sekunden gewesen sein, um die Datei von meiner alten Festplatte einzulesen.

Gibt es einen zuverlässigen Weg, um zu ermitteln, wie viel Zeit auf E / A zurückzuführen ist?


Weitere Details, warum ich nicht sehe, wie ich interpretieren soll time. Wenn ich mache

time cat largefile.file > /dev/null  real 0m24.230s user 0m0.060s sys 0m1.473s 

dann ist es verführerisch zu sagen, dass etwa 22,5 Sekunden für E / A aufgewendet werden. Die wcAbbildung von oben bedeutet jedoch, dass es 8 Sekunden sind. Diese beiden Zahlen sind nicht konsistent.

2
Wiederholen Sie die beiden Messungen vor dem Neustart. Wenn sich die Datei auch nur teilweise im Speicher befindet, ist die Messung falsch. harrymc vor 9 Jahren 1
@ harrymc Ich habe gerade `sync && sudo bash -c 'echo 3> / proc / sys / vm / drop_caches'` gemacht und bekomme dasselbe Ergebnis. Es ist kein Caching-Effekt, da die Gesamtzeit gleich ist. Lembik vor 9 Jahren 0
Bei der Synchronisierung wird der Speichercache nicht gelöscht, sondern es wird nur sichergestellt, dass als fehlerhaft gekennzeichnete Blöcke auf die Festplatte geschrieben werden. harrymc vor 9 Jahren 0
@harrymc OK, aber wenn Sie die Synchronisierung nicht durchführen, beträgt das Timing etwa 0 Sekunden. Lembik vor 9 Jahren 0
Da Linux den Speichercache sehr effektiv nutzt, muss beim Messen sehr vorsichtig vorgegangen werden. harrymc vor 9 Jahren 0

1 Antwort auf die Frage

2
sourcejedi

sys bedeutet, dass die CPU-Zeit im Kernel verbracht wird, aber Sie möchten die Wartezeit.

Beim Googeln wurde eine weitere Stapelaustausch-Antwort angezeigt, die auf " Pro-Prozess-Iowait aus / proc / $ pid / stat " zeigt. (Und vielleicht müssen Sie den Programmierer unter einem Debugger ausführen und einen Haltepunkt auf exit()/ setzen _exit(), damit Sie das iowait auslesen können, bevor der Prozess wegfällt?).

Oft berechne ich es einfach, indem ich die CPU-Zeit (Benutzer + Sys) von der Echtzeit abziehe. Dies setzt voraus, dass der Prozess nicht auf Dinge wartet, die Sie nicht als "IO" zählen.

Vielen Dank. Ich habe der Frage ein paar hinzugefügt, um zu zeigen, wo meine Verwirrung liegt. Wenn Sie die CPU-Zeit (Benutzer + Sys) von der Echtzeit abziehen, erhalten Sie keine konsistenten Antworten. Lembik vor 10 Jahren 0
Guter Punkt. Ich kann sagen, warum dies nicht der Fall ist: IO kann "im Hintergrund" geschehen, während der Prozess noch CPU verwendet. Diese Zeit wird als CPU-Zeit gezählt und nicht als Warten. Hoffentlich verstehen die meisten Programmierer Hintergrundschreibvorgänge (siehe fsync), auch Rückschreiben genannt. Hintergrundlesevorgänge erfolgen aufgrund von [Vorauslesen] (https://lwn.net/Articles/155510/). Vielleicht können wir das bekommen, was wir wollen, indem wir die Task auf einem inaktiven System (hah) ausführen und die Millisekunden-Lese- / Schreibfelder in `vmstat -d 'betrachten. sourcejedi vor 9 Jahren 0