Schreib- und Lesevorgänge anzeigen: Welcher Prozess verursacht I/O?

Schreib- und Lesevorgänge anzeigen: Welcher Prozess verursacht I/O?

Werkzeuge wie iotop liefern einem eine Momentanaufnahme der Laufwerkslast. Mit iotop –only kann auf aktive Prozesse gefiltert werden, die etwas schreiben oder lesen. Das mag für einen ersten Eindruck nützlich sein. Doch es fehlen zwei Informationen:

  1. Man sieht nicht, auf welches Laufwerk geschrieben wird
  2. Es ist nur eine Momentanaufnahme – Gerade bei der Fehlersuche möchte man jedoch oft wissen, ob zu einem bestimmten Zeitpunkt I/O Operationen stattfanden

Ein konkretes Beispiel ist der Standby-Modus von Festplatten. Wird die Platte auffällig häufig aufgeweckt, erhöht dies die Parkvorgänge (Load_Cycle_Count). Dadurch sinkt die zu erwartende Lebensdauer. Hier möchte man wissen, welcher Prozess auf ein bestimmtes Laufwerk zugreift.

Momentanaufnahme nach Laufwerk mit iostat

Das erste Problem des fehlenden Laufwerkes kann mit iostat gelöst werden. Es zeigt detaillierte Informationen zu allen Platten an. Möchte man lediglich wissen welches Laufwerk ausgelastet ist, kann iostat möglicherweise auch bereits ausreichen.

Es lässt sich unter Ubuntu/Debian wie folgt nachinstallieren:

sudo apt-get install sysstat

I/O Zugriffe im Kernel-Log anzeigen

Die einfachste Möglichkeit ist, das Logging im Kernel zu aktivieren. Mit Rootzugriff (z.B. durch sudo) in die Datei block_dump eine 1 schreiben:

echo 1 > /proc/sys/vm/block_dump

Anschließend sieht man die Zugriffe im Kernel-Log. Dies kann bequem mit dmesg aufgerufen werden:

# dmesg --follow --ctime
[Sun May 31 15:49:33 2020] mysqld(3846): WRITE block 236486656 on sdb1 (8 sectors)
[Sun May 31 15:49:33 2020] jbd2/sdb1-8(669): WRITE block 487179208 on sdb1 (8 sectors)
[Sun May 31 15:49:33 2020] jbd2/sdb1-8(669): WRITE block 487179216 on sdb1 (8 sectors)
[Sun May 31 15:49:33 2020] jbd2/sdb1-8(669): WRITE block 487179224 on sdb1 (8 sectors)
[...]

Mit grep auf die Datei /var/log/kern.log kann man nach Zugriffen auf einzelne Platten suchen.

egrep "sd(a|d)" /var/log/kern.log

Dies zeigt beispielweise alle I/O Vorgänge auf sda und sdd an. Nach dem Zeitstempel sieht man den Prozess und dessen Id.

Wichtig: Da jeder Schreibvorgang protokolliert wird, entsteht ein hohes Aufkommen an Logs. Das Kernellog wird daher in kurzer Zeit recht groß. Man sollte keinesfalls vergessen, dies nach der Analyse wieder zu deaktivieren:

echo 0 > /proc/sys/vm/block_dump

Leave a Reply