Block I/O Layer-Tracing mit blktrace
Was weckt eine Festplatte wieder auf?! Welche Operationen werden auf dem Medium durchgeführt? Und wie oft greift der Kernel auf die Festplatte zu? Diese und noch mehr Fragen lassen sich mit dem Tool blktrace mühelos beantworten.
Unwissenheit ist das Grauen jedes Administrators, Programmierers oder Anwenders. Nicht zu wissen, welcher Prozess beispielsweise auf eine Festplatte zugreift, und warum sie nach Stunden aus ihrem Schlaf (spin down) erwacht, kann nicht nur frustrierend, sondern mitunter auch teuer werden. Das selbe gilt für Festplattenzugriffe, die durch unerklärliche Geschehnisse im System extrem verlangsamt werden. Den Grund hierfür zu finden, kann durchaus lange Zeit in Anspruch nehmen.
Abhilfe aus dem Dilemma versprechen zahlreiche Tools, die allerdings in der Regel im Userspace angesiedelt sind und dementsprechend auch nur Prozesse anzeigen können. Betrachtet man die Struktur des Block-Layers, so stellt man deshalb schnell fest, dass sie nur bedingt zur Überwachung geeignet sind. Weit ergiebiger erweist sich deshalb das Tool iostat
, das allerdings den Nachteil hat, keine detaillierte Informationen auf I/O-Basis auszugeben. Kaum verwunderlich deshalb, dass direkt vom Maintainer des Block I/O Layers, Jens Axboe, mit blktrace
ein Tool erstellt wurde, das die Unzulänglichkeiten der anderen Lösungen eliminiert und ein detailliertes Tracing direkt auf dem Block-Layer ermöglicht.
Genau betrachtet setzt sich blktrace aus drei Komponenten zusammen. Zum einen setzt es auf Erweiterungen des Block-I/O-Layers, zum anderen auf die Userland-Anwendungen blktrace
und blkparse
auf. Während blktrace
der Ermittlung und der Extraktion von Events des Layers eingesetzt wird, kann blkparse
zur Anzeige und der Formatierung der gesammelten Daten dienen. Zudem setzt das Tool auf debugfs auf, das zwingend eingebunden werden muss:
# mount -t debugfs debugfs /sys/kernel/debug
Die Auswertung der Zugriffe auf ein Device kann auf zweierlei Arten erfolgen. So können Daten mittels blktrace
zuerst gespeichert und zu einem späteren Zeitpunkt mit blkparse
dekodiert werden. Will man dagegen die Ausgabe sofort untersuchen, kann die Lösung in einem »Live«-Modus betrieben werden, in dem die Ausgabe des Tracers direkt an den Parser geschickt wird:
# blktrace -d /dev/sda -o - | blkparse -i -
Eine typische Ausgabe des Tools sieht dabei wie folgt aus:
8,16 0 0 0.000000000 0 m N cfq2593S / alloced 8,16 0 1 0.000001575 2593 G N [hdparm] 8,16 0 2 0.000004018 2593 P N [hdparm] 8,16 0 3 0.000004698 2593 I N 0 (85 06 20 00 00 00 00 00 00 00 00 00 00 40 e5 00 ..) [hdparm] 8,16 0 4 0.000007418 2593 D N 0 (85 06 20 00 00 00 00 00 00 00 00 00 00 40 e5 00 ..) [hdparm] 8,16 0 0 0.001642502 0 m N cfq2593S / put_queue CPU0 (8,16): Reads Queued: 0, 0KiB Writes Queued: 0, 0KiB Read Dispatches: 0, 0KiB Write Dispatches: 0, 0KiB Reads Requeued: 0 Writes Requeued: 0 Reads Completed: 0, 0KiB Writes Completed: 0, 0KiB Read Merges: 0, 0KiB Write Merges: 0, 0KiB Read depth: 1 Write depth: 0 PC Reads Queued: 0, 0KiB PC Writes Queued: 0, 0KiB PC Read Disp.: 1, 0KiB PC Write Disp.: 0, 0KiB PC Reads Req.: 0 PC Writes Req.: 0 PC Reads Compl.: 0 PC Writes Compl.: 0 IO unplugs: 0 Timer unplugs: 0 Throughput (R/W): 0KiB/s / 0KiB/s Events (8,16): 6 entries Skips: 0 forward (0 - 0.0%)
Die Ausgabe gliedert sich dabei in zwei Gruppen. Während der obere Abschnitt detaillierte Tracing-Informationen liefert, stellt der untere Bereich statistisch die verschiedenen Aktionen dar. Die Traces als solches sind ebenfalls in verschiedene Bereiche unterteilt. Die folgende Ausgabe:
8,16 0 2 0.000002695 2351 Q WS 973340791 + 8 [jbd2/sdb1-8]
bedeutet im Klartext:
Dev<mjr,min> CPU SeqNr Timestamp PID Event Aktion StartBlock + AnzahlderBlocks [Prozess]
Wie dem Listing also unschwer zu entnehmen ist, listet blktrace nicht nur die eigentlichen Aktionen, sondern auch den Prozess samt seiner PID. Damit eignet sich das Tool nicht nur dazu, Systeminformationen abzufragen, sondern auch die Aktionen von Anwendungen. Dabei spielt es keine Rolle, ob es sich um eine Festplatte, ein Laufwerk oder einen Verbund von Geräten handelt.