Monitorowanie I/O w Linux'ie

Sun 27 December 2009 by admin

Na wzrost parametru load average w systemie Linux wpływ nie tylko ma obciążenie procesora lecz również procesy oczekujące operacje dyskowe I/O. Na pytanie co generuje duże obciążenie I/O i w jakim stopniu postaram się odpowiedzieć na łamach tego wpisu...

Wcześniej wspomniany parametr load average możemy określić chociażby korzystając z popularnego top'a, jednak sam top nie dostarcza nam wiele informacji z zakresu I/O. Jedynie pole wa przedstawia w sposób procentowy czas oczekiwania na operację I/O.
Więcej informacji dostarcza nam równie popularne narzędzie vmstat, prócz ww. parametru wa mamy dostępne parametry bi oraz bo odpowiednio ilość bloków otrzymanych oraz ilość bloków wysłanych z urządzenia. Wielkość bloku możemy określić poleceniem:

# blockdev --getbsz <nazwa_urzadzenia>

Dodatkowo, aby podsumować operacje I/O korzystamy z polecenia: vmstat -D.
Kolejne narzędzie dostarczające statystyk I/O to iostat z pakietu sysstat. Dzięku temu narzędziu otrzymujemy bardziej szczegółowe statystyki (zwłaszcza po włączeniu przełącznika -x) z podziałem już na poszczególne partycje.  Do szczegółowych statystyk zaliczyć można wielkości danych odczytanych/zapisanych wyrażone w MB, czas oczekiwania na operację I/O, czas danego żądania I/O spędzony w kolejce etc. Więcej informacji dostępne w man iostat.

Niestety przedstawiony vmstat oraz iostat, nie dostarcza nam informacji o operacjach I/O per proces. Dopiero w kernelu 2.6.20 po włączniu opcji TASK_DELAY_ACCT oraz TASK_IO_ACCOUNTING otrzymujemy w /proc/\<numer_pid_procesu>/io informacje o dokonaniach konkretnego procesu w zakresie I/O:

rchar   - odczytana liczba znaków
wchar   - zapisana liczba znaków
syscr   - liczba syscall'i związanych z odczytem
syscw   - liczba syscall'i związanych z zapisem
read_bytes  - odczytana liczba bajtów
write_bytes - zapisana liczba bajtów

Iotop (http://guichaz.free.fr/iotop/) to wygodne narzędzie do odczytywania tych parametrów i szeregowania procesów w-g ich wpływu na obciążenie systemu. System CentOS serii 5 mimo korzystania z kerneli 2.6.18 również od wersji 5.3 posiada możliwość monitorowania operacji I/O per proces niestety skompilowanie iotop'a nie powiedzie się z racji starszej wersji python 2.4 (iotop wymaga >=2.5). Możemy jednak skorzystać z uniwersalnego narzędzia dstat, które na liście plugin'ów posiada topio oraz topbio.

W celu logowania operacji na przestrzeni adresowej (strony) oraz operacji na  inode'ach możemy skorzystać z przełącznika block_dump, aby włączyć narzędzie należy:

# echo 1 > /proc/sys/vm/block_dump

Aktywność całego systemu możemy podejrzeć przy pomocy dmesg'a, operacjom na inode'ach towarzyszą nazwy plików, natomiast operacjom na samych plikach towarzyszą jedynie informacje o procesie, który go wywołał oraz numery bloków związanych z danym plikiem. Block_dump powoduje duży narzut, gromadzenie i ich analiza może nastręczać wiele kłopotów, dobrze nadaje sie do podejrzenie co aktualnie dzieje sie w systemie.

Do śledzenia operacji zapisu/odczytu oraz w szczególności tego co dzieje sie w samym schedulerze wykorzystujemy narzędzie blktrace. Więcej informacji na temat tego narzędzia znaleźć można pod adresem: http://www.gelato.org/pdf/apr2006/gelato_ICE06apr_blktrace_brunelle_hp.pdf

Popularne narzędzie strace możemy wykorzystać do monitorowania aktywności danego procesu filtrując syscall'e związane z aktywnością na plikach:

# strace -e trace=file -p <numer_pid_procesu>

Podobnie narzędzie lsof może nam posłużyć do identyfikacji procesów zbyt obciążających system I/O przedstawiając pliki związane z danym procesem:

# lsof -p <numer_pid_procesu>

Jako przykład wykonywanie archiwum przy pomocy tar'a, może być bardzo obciążające dla podsystemu I/O aby zidentyfikować co akurat jest pakowane możemy użyć powyższego narzędzia.

Aby obniżyć priorytet dostępu do I/O konkretnemu procesowi skorzystać należy z narzędzia ionice w przypadku, gdy korzystamy z scheduler'a CFQ. Więcej informacji pod: man ionice.

Ostatnim zestawem narzędzi jest zestaw skryptów SystemTap'a. SystemTap w przybliżeniu jest to odpowiednik DTrace'a dla systemu Linux, narzędzie służące do analizy działającego kernel'a. Na stronie http://sourceware.org/systemtap/examples/ dostępny jest zestaw gotowych skryptów część z nich to skrypty monitorujące I/O do ciekawszych z nich zaliczyć można:

io/iotime.stp - monitoruje czas potrzebny do wykonania operacji I/O dla konkretnego pliku.

Mnogość narzędzi monitorujących operacje I/O w Linux'ie nagół dostępnych standardowo w większości dystrybucji sprawia, że odnalezienie ,,wąskiego gardła'' nie jest wielkim problemem.


Comments