Monitorowanie I/O dysku za pomocą iostat i dstat
Wprowadzenie
Monitorowanie operacji wejścia-wyjścia dysku (disk I/O) jest jednym z kluczowych zadań podczas eksploatacji serwerów w infrastrukturze hostingowej. Podsystem dyskowy bezpośrednio wpływa na wydajność usług internetowych, baz danych, maszyn wirtualnych, kontenerów i zadań w tle. Nawet przy wystarczającej ilości pamięci RAM i wolnych zasobach procesora przeciążony lub wolny dysk może stać się wąskim gardłem całego systemu.
Niniejszy podręcznik jest przeznaczony dla administratorów systemów, inżynierów DevOps i właścicieli serwerów. Omawia narzędzia iostat i dstat, zasady ich działania, interpretację metryk oraz praktyczne podejście do wyszukiwania wąskich gardeł I/O dysku w środowisku hostingowym.
Informacje ogólne i zasady działania
I/O dysku w infrastrukturze serwerowej
Operacje wejścia-wyjścia dysku obejmują odczyt i zapis danych na urządzeniach blokowych. W rzeczywistych scenariuszach hostingowych obciążenie podsystemu dyskowego najczęściej generują:
- bazy danych (MySQL, MariaDB, PostgreSQL);
- aplikacje internetowe z treścią dynamiczną;
- usługi pocztowe;
- tworzenie kopii zapasowych i synchronizacja danych;
- logowanie;
- swap i pliki tymczasowe;
- skrypty użytkowników i zadania cron.
Wąskie gardła mogą wynikać z wolnych urządzeń pamięci masowej, silnej rywalizacji między procesami, nieoptymalnych planistów I/O, nieprawidłowego działania pamięci podręcznej lub specyfiki wirtualizacji.
Przeznaczenie iostat i dstat
iostat to narzędzie z pakietu sysstat przeznaczone do zbierania szczegółowych statystyk obciążenia procesora i urządzeń dyskowych. Głównym zadaniem iostat jest pokazanie, jak intensywnie wykorzystywany jest dany dysk, czy istnieje kolejka żądań oraz jaki jest średni czas oczekiwania operacji.
dstat to wszechstronne narzędzie monitorujące, które wyświetla statystyki w czasie rzeczywistym dla kilku podsystemów jednocześnie: procesora, pamięci, dysku, sieci, procesów. Pozwala skorelować aktywność dysku z ogólnym obciążeniem serwera i jest wygodne do szybkiej diagnostyki.
Narzędzia te się uzupełniają: iostat daje dokładny obraz na poziomie urządzenia, a dstat zapewnia kontekst całego systemu.
Wymagania wstępne
Przed rozpoczęciem analizy muszą być spełnione następujące warunki:
- System operacyjny Linux (Debian, Ubuntu, AlmaLinux, Rocky Linux, CentOS).
- Dostęp do serwera przez SSH.
- Uprawnienia roota lub możliwość wykonywania poleceń przez sudo.
Sprawdzenie wersji systemu operacyjnego:
cat /etc/os-release
Instalacja niezbędnych pakietów:
Debian / Ubuntu:
sudo apt update sudo apt install sysstat dstat
CentOS / RHEL / AlmaLinux / Rocky Linux:
sudo yum install sysstat dstat # or sudo dnf install sysstat dstat
Sprawdzenie działania sysstat:
systemctl status sysstat
Jeśli usługa jest aktywna, zostaną wyświetlone odpowiednie informacje:
root@server:~# systemctl status sysstat ● sysstat.service - Resets System Activity Logs Loaded: loaded (/usr/lib/systemd/system/sysstat.service; enabled; preset: enabled) Active: active (exited) since Tue 2025-12-23 10:35:35 UTC; 16min ago Docs: man:sa1(8) man:sadc(8) man:sar(1) Main PID: 731 (code=exited, status=0/SUCCESS) CPU: 7ms
Przegląd i analiza krok po kroku
Podstawowa analiza dysku za pomocą iostat
Narzędzie iostat służy do oceny obciążenia procesora i podsystemu dyskowego oraz do wykrywania opóźnień i kolejek I/O.
Składnia:
sudo iostat [options] [interval] [count]
Najczęściej używane parametry:
- -x - statystyki rozszerzone;
- -d - wyłącznie dane dotyczące dysków;
- -k - wyjście w kilobajtach;
- -p - statystyki dla partycji lub konkretnego urządzenia.
Przykład podstawowy:
sudo iostat -x
Analiza dynamiczna:
sudo iostat -xk 5 3
Interwał i liczba próbek pozwalają śledzić zmiany obciążenia w czasie, zamiast średniego stanu od uruchomienia systemu.
Przykładowe wyjście iostat

Kluczowe metryki procesora:
- %iowait - odsetek czasu, w którym procesor pozostaje bezczynny, oczekując na zakończenie operacji I/O. Wzrost tej metryki wskazuje na wpływ dysku na ogólną wydajność.
- %steal - istotne dla serwerów wirtualnych; pokazuje „skradziony” czas procesora.
Kluczowe metryki dysku:
- %util - odsetek czasu, w którym dysk był zajęty. Wartości stale przekraczające 80-90% wskazują na nasycenie urządzenia.
- r_await - średni czas (ms) zakończenia operacji odczytu (wraz z czasem oczekiwania w kolejce).
- w_await - średni czas (ms) zakończenia operacji zapisu (wraz z czasem oczekiwania w kolejce).
- aqu-sz - (avg queue size) średnia długość kolejki żądań do dysku. Wartość > 1 oznacza już tworzenie się kolejki. Wartość > 2-4 dla HDD / > 1-2 dla SSD jest oznaką, że dysk nie nadąża za obciążeniem.
Różnica między await a svctm pokazuje, czy opóźnienie jest powodowane przez kolejkę, a nie przez fizyczną szybkość dysku.
Jeśli await tylko nieznacznie przewyższa svctm (różnica < 20-30%), opóźnienia wynikają głównie z samego dysku (wolny fizyczny odczyt/zapis).
Jeśli await jest znacznie większy niż svctm (różnica > 50-100%), główne opóźnienie powoduje kolejka żądań (aqu-sz będzie wysoki), co wskazuje na przeciążenie dysku wieloma równoległymi żądaniami.
W nowoczesnych wersjach iostat (jak w przykładzie) svctm nie jest wyświetlany, ponieważ jego obliczanie jest niewiarygodne. Do analizy stosuje się kombinację await + aqu-sz: wysoki await przy niskim aqu-sz (~0) wskazuje na wolny dysk; wysoki await przy wysokim aqu-sz (>1) wskazuje na przeciążenie dysku żądaniami.
Analiza całościowego obrazu za pomocą dstat
dstat służy do obserwacji systemu w czasie rzeczywistym i korelowania obciążenia dysku z innymi zasobami.
Przykłady poleceń:
dstat -d dstat --disk-util dstat -rd --disk-util dstat -D vda,sda
Przykład uruchomienia z interwałem:
dstat -rd --disk-util 1 5
Podczas analizy należy zwrócić uwagę na:
- wzrost iowait procesora;
- szczyty odczytu lub zapisu;
- jednoczesną aktywność sieciową i dyskową (kopie zapasowe, synchronizacja).
Example dstat output: dstat -rd --disk-util 1 5 --io/total- -dsk/total- vda- read write| read write|util 0 4.00 | 0 76k|0.50 0 29.5 | 0 240k|0.20 0 1.00 | 0 4096B| 0 0 0 | 0 0 | 0 0 1.00 | 0 32k| 0
Porównanie dstat i iostat:
| Kryterium | iostat | dstat |
|---|---|---|
| Dokładność danych | Wysoka | Wysoka |
| Tryb czasu rzeczywistego | Ograniczony | Doskonały |
| Dane historyczne | Tak (sar) | Nie |
| Kolorowe wyjście | Nie | Tak |
| Rozszerzalność | Nie | Wtyczki |
| Eksport do CSV | Nie | Tak |
| Obciążenie procesora | Niskie | Średnie |
dstat jest szczególnie przydatny przy krótkotrwałych skokach obciążenia, które nie zawsze są widoczne w iostat.
Wykrywanie wąskich gardeł I/O dysku
Do szybkiej diagnostyki służą następujące polecenia:
sudo iostat -mx 2 sudo iostat -p /dev/vda 2 5 sar -d 1 5
Typowe oznaki problemu:
- %util powyżej 80% przez dłuższy czas;
- await powyżej 20-30 ms dla SSD lub powyżej 50-100 ms dla HDD;
- aqu-sz większe niż 2-3, co wskazuje na narastanie kolejki.
W przykładzie użyto dysku /dev/vda – jest to dysk wirtualny (VirtIO) na serwerze wirtualnym.
Na serwerach fizycznych i w innych środowiskach dyski mogą mieć inne nazwy:
- /dev/sdX (np. /dev/sda) - zwykłe dyski SATA/SAS/USB
- /dev/nvmeXnY (np. /dev/nvme0n1) - dyski NVMe
- /dev/vdX - dyski wirtualne
Identyfikacja procesów powodujących duże obciążenie I/O dysku
Po stwierdzeniu za pomocą iostat i dstat przeciążenia podsystemu dyskowego kolejnym krokiem jest zidentyfikowanie konkretnych procesów inicjujących intensywne operacje odczytu lub zapisu. Analiza na poziomie urządzenia bez ustalenia źródła obciążenia nie pozwala na podjęcie właściwych działań naprawczych.
Użycie iotop
Podstawowym narzędziem do wyszukiwania procesów aktywnie korzystających z dysku jest iotop.
sudo iotop -ao
Parametry polecenia:
-a - wyświetla statystyki skumulowane od momentu uruchomienia procesu, co pomaga wykryć zadania w tle z długotrwałymi operacjami I/O;
-o - pokazuje tylko te procesy, które w danej chwili wykonują operacje I/O.
Przykładowe wyjście:
TID 41PRIO USER41DISK READ41DISK WRITE41SWAPIN41IO>4141COMMAND 1105641be/441mysql410.00 B 413.44 M410.00 %410.76 %41mysqld 258041be/441rsync410.00 B4123.48 M410.00 %411.17 %41rsync
W wyjściu iotop szczególną uwagę należy zwrócić na pola DISK READ i DISK WRITE oraz na procentowy udział czasu I/O. Zazwyczaj źródłem obciążenia są procesy baz danych, procesy kopii zapasowych, procesy synchronizacji plików lub skrypty użytkowników.
Użycie pidstat do analizy I/O w podziale na procesy
Do bardziej sformalizowanej i powtarzalnej analizy można użyć pidstat, który jest częścią pakietu sysstat.
pidstat -d 1
To polecenie wyświetla statystyki I/O dysku dla każdego procesu w odstępach jednosekundowych. Jest to wygodne do wykrywania krótkotrwałych skoków aktywności i korelowania ich z innymi metrykami systemu.
pidstat jest szczególnie przydatny w sytuacjach, gdy obciążenie pojawia się okresowo i nie zawsze jest rejestrowane przez iotop.
Użycie lsof do analizy aktywności plików
W przypadkach, gdy trzeba ustalić, z jakimi konkretnymi plikami lub katalogami pracuje proces, używa się narzędzia lsof.
lsof +D /path
Gdzie /path to konkretny katalog, w którym należy zidentyfikować aktywne pliki i procesy. Może to być na przykład katalog bazy danych, katalog kopii zapasowych lub obszar plików tymczasowych.
Polecenie pozwala ustalić, które procesy aktualnie przetrzymują deskryptory plików i wykonują operacje w podanej ścieżce, co jest szczególnie przydatne przy analizie obciążenia generowanego przez aplikacje.
Analiza kontekstu obciążenia
Zidentyfikowanie procesu o dużej aktywności dyskowej nie jest celem ostatecznym. Administrator musi ocenić kontekst jego działania:
- czy obciążenie jest oczekiwane dla danej usługi;
- czy proces jest uruchamiany w odpowiednim czasie (np. kopie zapasowe w godzinach szczytu);
- czy można zmienić harmonogram lub parametry pracy;
- czy dopuszczalne jest obniżenie priorytetu I/O.
Takie podejście pozwala odróżnić obciążenie normalne od problematycznego i wybrać właściwą metodę optymalizacji.
Weryfikacja poprawności analizy
Poprawność przeprowadzonej analizy potwierdza się, jeśli:
- szczyty %util, await lub aqu-sz w iostat pokrywają się w czasie z aktywnością procesów w iotop lub pidstat;
- wzrost iowait w dstat pokrywa się z operacjami dyskowymi, a nie z obciążeniem procesora;
- powtórne pomiary wykazują powtarzalny wzorzec obciążenia.
W celu gromadzenia danych i późniejszej analizy zaleca się stosowanie logowania:
sar -d 1 100 > io.log
Pozwala to zarejestrować zachowanie podsystemu dyskowego w określonym okresie i wykorzystać dane podczas badania incydentów.
Typowe błędy i cechy eksploatacji
W praktyce eksploatacji serwerów hostingowych najczęściej występują następujące problemy:
- uruchamianie kopii zapasowych i synchronizacji danych w godzinach szczytu;
- intensywne użycie swapu przy niewystarczającej ilości pamięci RAM;
- planista I/O nieodpowiedni dla typu dysku;
- brak priorytetyzacji zadań w tle.
Aby ograniczyć wpływ procesów w tle na wydajność, zaleca się użycie narzędzia ionice do zarządzania priorytetem I/O procesu, co pozwala zmniejszyć wpływ zadań w tle na responsywność systemu.
Przykład użycia:
ionice -c3 rsync /source /destination
Główne priorytety:
- -c1 (realtime) - najwyższy priorytet. Stosowany do zadań krytycznych pod względem opóźnień. Może całkowicie zablokować inne procesy.
- -c2 (best-effort) - domyślny dla większości procesów. Pozwala dostosować poziom priorytetu (od 0 (wysoki) do 7 (niski)).
- -c3 (idle) - tło. Proces uzyskuje dostęp do dysku tylko wtedy, gdy nie korzystają z niego żadne inne procesy. Bezpieczny i zalecany dla operacji w tle (kopie zapasowe, synchronizacja danych).
W tym przykładzie proces rsync działa z najniższym priorytetem I/O, co minimalizuje jego wpływ na podstawowe operacje systemu. Użycie ionice pozwala zminimalizować wpływ procesów w tle bez konieczności ich całkowitego wyłączania.
Podsumowanie
Monitorowanie I/O dysku jest integralną częścią utrzymania wydajności i stabilności infrastruktury serwerowej. Narzędzia iostat i dstat pozwalają wykrywać sytuacje przeciążenia i oceniać stan podsystemu dyskowego, natomiast narzędzia takie jak iotop, pidstat i lsof pomagają zidentyfikować konkretne procesy i charakter ich obciążenia.
Regularne stosowanie opisanego podejścia, prawidłowa interpretacja metryk i zarządzanie priorytetami I/O pomagają skrócić czasy odpowiedzi usług, zwiększyć przewidywalność obciążenia i zapewnić zgodność z wymaganiami SLA. W dalszej perspektywie metodykę tę można rozszerzyć o scentralizowany monitoring i automatyzację analizy obciążenia I/O.