Monitorowanie operacji wejścia/wyjścia na dysku za pomocą narzędzi iostat i dstat: wykrywanie wąskich gardeł
Wprowadzenie
Monitorowanie operacji wejścia-wyjścia dysku jest jednym z kluczowych zadań podczas obsługi serwerów w infrastrukturze hostingowej. Podsystem dyskowy ma bezpośredni wpływ na wydajność usług internetowych, baz danych, maszyn wirtualnych, kontenerów i zadań działających w tle. Nawet przy wystarczającej ilości pamięci RAM i wolnych zasobach procesora przeciążony lub wolno działający 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 oraz właścicieli serwerów. Obejmuje on narzędzia iostat i dstat, zasady ich działania, interpretację wskaźników oraz praktyczne podejście do wykrywania wąskich gardeł operacji wejścia/wyjścia na dysku w środowisku hostingowym.
Informacje ogólne i zasady działania
Operacje wejścia/wyjścia na dysku w infrastrukturze serwerowej
Operacje wejścia-wyjścia na dysku obejmują operacje odczytu i zapisu danych na urządzeniach blokowych. W rzeczywistych scenariuszach hostingowych obciążenie podsystemu dyskowego jest najczęściej generowane przez:
- bazy danych (MySQL, MariaDB, PostgreSQL);
- aplikacji internetowych z dynamiczną treścią;
- usługi pocztowe;
- tworzenie kopii zapasowych i synchronizacja danych;
- rejestrowanie;
- pliki wymiany i pliki tymczasowe;
- skrypty użytkowników i zadania cron.
Wąskie gardła mogą wynikać z powolnych urządzeń pamięci masowej, dużej rywalizacji między procesami, nieoptymalnych harmonogramów operacji wejścia/wyjścia, nieprawidłowego działania pamięci podręcznej lub funkcji wirtualizacji.
Cel narzędzi iostat i dstat
iostat to narzędzie z pakietu sysstat przeznaczone do gromadzenia szczegółowych statystyk dotyczących 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 na operacje.
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 i procesów. Pozwala ono skorelować aktywność dysku z ogólnym obciążeniem serwera i jest przydatne do szybkiej diagnostyki.
Narzędzia te wzajemnie się uzupełniają: iostat zapewnia dokładny obraz na poziomie urządzenia, natomiast dstat przedstawia kontekst całego systemu.
Warunki wstępne i wymagania
Przed rozpoczęciem analizy muszą być spełnione następujące warunki:
- System operacyjny Linux (Debian, Ubuntu, AlmaLinux, Rocky Linux, CentOS).
- Dostęp SSH do serwera.
- Uprawnienia administratora lub możliwość wykonywania poleceń za pomocą sudo.
Sprawdzanie 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
Sprawdzanie działania sysstat:
systemctl status sysstat
Jeśli usługa jest aktywna, wyświetlą się 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, a także do identyfikacji opóźnień i kolejek operacji wejścia/wyjścia.
Składnia:
sudo iostat [options] [interval] [count]
Najczęściej używane parametry:
- -x — rozszerzone statystyki;
- -d — dane dotyczące wyłącznie dysku;
- -k — wyniki w kilobajtach;
- -p — statystyki dla partycji lub konkretnego urządzenia.
Podstawowy przykład:
sudo iostat -x
Analiza dynamiczna:
sudo iostat -xk 5 3
Interwał i liczba próbek pozwalają śledzić zmiany obciążenia w czasie, a nie tylko średni stan od momentu uruchomienia systemu.
Przykładowy wynik polecenia iostat

Kluczowe wskaźniki dotyczące procesora:
- %iowait – procent czasu, w którym procesor pozostaje bezczynny, oczekując na operacje wejścia/wyjścia. Wzrost tej wartości wskazuje na wpływ dysku na ogólną wydajność.
- %steal – istotny w przypadku serwerów wirtualnych, pokazuje czas procesora przejęty przez inne procesy.
Kluczowe wskaźniki dysku:
- %util – procent czasu, w którym dysk był zajęty. Wartości stale przekraczające 80–90% wskazują na nasycenie urządzenia.
- r_await – średni czas (w milisekundach) potrzebny do zakończenia operacji odczytu (w tym czas oczekiwania w kolejce).
- w_await – średni czas (ms) potrzebny do zakończenia operacji zapisu (w tym czas oczekiwania w kolejce).
- aqu-sz – (średni rozmiar kolejki) średnia długość kolejki żądań dla dysku. Wartość > 1 już wskazuje na tworzenie się kolejki. Wartość > 2–4 dla dysków HDD / > 1–2 dla dysków SSD oznacza, że dysk nie nadąża za obciążeniem.
Różnica między wartościami await a svctm wskazuje, czy opóźnienie wynika z kolejki, a nie z fizycznej prędkości dysku.
Jeśli wartość await tylko nieznacznie przekracza wartość svctm (różnica < 20–30%), opóźnienia są spowodowane głównie przez sam dysk (powolny fizyczny odczyt/zapis).
Jeśli wartość `await` jest znacznie większa od `svctm` (różnica > 50–100%), głównym źródłem opóźnienia jest kolejka żądań (wartość `aqu-sz` będzie wysoka), co wskazuje na przeciążenie dysku spowodowane dużą liczbą równoległych żądań.
W nowoczesnych wersjach programu iostat (jak w przykładzie) wartość svctm nie jest wyświetlana, ponieważ jej obliczenie jest niewiarygodne. Do analizy wykorzystuje się kombinację wartości await i aqu-sz: wysoka wartość await przy niskiej wartości aqu-sz (~0) wskazuje na powolny dysk; wysoka wartość await przy wysokiej wartości aqu-sz (>1) wskazuje, że dysk jest przeciążony żądaniami.
Analiza ogólnego obrazu za pomocą dstat
dstat służy do obserwacji systemu w czasie rzeczywistym oraz do korelacji obciążenia dysku z innymi zasobami.
Przykłady poleceń:
dstat -d dstat --disk-util dstat -rd --disk-util dstat -D vda,sda
Przykładowe uruchomienie z interwałem:
dstat -rd --disk-util 1 5
Podczas analizy należy zwrócić uwagę na:
- wzrostu wartości iowait w procesorze;
- szczytowe wartości odczytu lub zapisu;
- jednoczesną aktywność sieci i dysku (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 narzędzi dstat i iostat:
| Kryteria | iostat | dstat |
|---|---|---|
| Dokładność danych | Wysoka | Wysoka |
| Tryb czasu rzeczywistego | Ograniczony | Doskonała |
| Dane historyczne | Tak (sar) | Nie |
| Kolorowe wyniki | Nie | Tak |
| Możliwość rozbudowy | Nie | Wtyczki |
| Eksport do pliku CSV | Nie | Tak |
| Obciążenie procesora | Niskie | Średnie |
dstat jest szczególnie przydatny w przypadku krótkotrwałych skoków obciążenia, które nie zawsze są widoczne w iostat.
Wykrywanie wąskich gardeł operacji wejścia/wyjścia na 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;
- czas oczekiwania powyżej 20–30 ms dla dysków SSD lub powyżej 50–100 ms dla dysków HDD;
- wartość aqu-sz większa niż 2–3, wskazująca na gromadzenie się kolejki.
W przykładzie wykorzystano dysk /dev/vda – jest to dysk wirtualny (VirtIO) na serwerze wirtualnym.
Na serwerach fizycznych oraz 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 wejścia/wyjścia dysku
Po stwierdzeniu przeciążenia podsystemu dyskowego za pomocą narzędzi iostat i dstat, kolejnym krokiem jest zidentyfikowanie konkretnych procesów inicjujących intensywne operacje odczytu lub zapisu. Analiza na poziomie urządzenia bez zidentyfikowania źródła obciążenia nie pozwala na podjęcie właściwych działań naprawczych.
Korzystanie z narzędzia iotop
Głównym narzędziem do wyszukiwania procesów aktywnie korzystających z dysku jest narzędzie iotop.
sudo iotop -ao
Parametry polecenia:
-a — wyświetla skumulowane statystyki od momentu uruchomienia procesu, co pomaga zidentyfikować zadania działające w tle, charakteryzujące się długotrwałymi operacjami wejścia/wyjścia;
-o — pokazuje tylko te procesy, które aktualnie wykonują operacje wejścia/wyjścia.
Przykładowy wynik:
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 wynikach wyświetlanych przez iotop należy zwrócić szczególną uwagę na pola DISK READ, DISK WRITE oraz procent czasu operacji wejścia/wyjścia. Zazwyczaj źródłem obciążenia są procesy baz danych, procesy tworzenia kopii zapasowych, procesy synchronizacji plików lub skrypty użytkowników.
Wykorzystanie programu pidstat do analizy operacji wejścia/wyjścia poszczególnych procesów
W celu przeprowadzenia bardziej sformalizowanej i powtarzalnej analizy można użyć narzędzia pidstat, które jest częścią pakietu sysstat.
pidstat -d 1
Polecenie to generuje statystyki operacji wejścia/wyjścia na dysku dla każdego procesu w odstępach co jedną sekundę. Jest to przydatne do identyfikowania krótkotrwałych skoków aktywności i korelowania ich z innymi wskaźnikami systemowymi.
pidstat jest szczególnie przydatny w sytuacjach, w których obciążenie pojawia się okresowo i nie zawsze może zostać uchwycone przez iotop.
Wykorzystanie lsof do analizy aktywności plików
W przypadkach, gdy konieczne jest ustalenie, z jakimi konkretnymi plikami lub katalogami pracuje dany proces, stosuje się narzędzie 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 to pozwala określić, które procesy aktualnie zajmują deskryptory plików i wykonują operacje w podanej ścieżce, co jest szczególnie przydatne podczas analizy obciążenia generowanego przez aplikacje.
Analiza kontekstu obciążenia
Zidentyfikowanie procesu o wysokiej aktywności dyskowej nie jest celem samym w sobie. Administrator musi ocenić kontekst jego działania:
- czy obciążenie jest zgodne z oczekiwaniami dla tej usługi;
- czy proces działa w odpowiednim czasie (np. tworzenie kopii zapasowych w godzinach szczytu);
- czy można zmienić harmonogram lub parametry operacyjne;
- czy dopuszczalne jest obniżenie priorytetu operacji wejścia/wyjścia.
Takie podejście pozwala odróżnić normalne obciążenie od problematycznego oraz wybrać właściwą metodę optymalizacji.
Weryfikacja poprawności analizy
Poprawność przeprowadzonej analizy jest potwierdzona, jeśli:
- szczyty wartości %util, await lub aqu-sz w iostat pokrywają się czasowo z aktywnością procesów w iotop lub pidstat;
- wzrost wartości iowait w dstat pokrywa się w czasie z operacjami dyskowymi, a nie z obciążeniem procesora;
- powtarzane pomiary wykazują powtarzalny wzorzec obciążenia.
W celu gromadzenia danych i późniejszej analizy zaleca się stosowanie rejestrowania:
sar -d 1 100 > io.log
Pozwala to na rejestrowanie zachowania podsystemu dyskowego w określonym przedziale czasu i wykorzystanie tych danych podczas badania incydentów.
Typowe błędy i cechy operacyjne
W praktyce eksploatacji serwerów hostingowych najczęściej występują następujące problemy:
- uruchamianie kopii zapasowych i synchronizacja danych w godzinach szczytu;
- intensywne wykorzystanie pamięci wymiany (swap) przy niewystarczającej ilości pamięci RAM;
- niewłaściwy harmonogram operacji wejścia/wyjścia (I/O) dla danego typu dysku;
- brak ustalania priorytetów dla zadań działających w tle.
Aby zmniejszyć wpływ procesów działających w tle na wydajność, zaleca się użycie narzędzia ionice do zarządzania priorytetem operacji wejścia/wyjścia (I/O) danego procesu, co pozwala ograniczyć wpływ zadań działających w tle na szybkość reakcji systemu.
Przykład zastosowania:
ionice -c3 rsync /source /destination
Główne priorytety:
- -c1 (czas rzeczywisty) – najwyższy priorytet. Stosowany w przypadku zadań, w których opóźnienia mają kluczowe znaczenie. Może całkowicie blokować inne procesy.
- -c2 (best-effort) – domyślny poziom dla większości procesów. Umożliwia regulację poziomu priorytetu (od 0 (wysoki) do 7 (niski)).
- -c3 (bezczynność) – tło. Proces uzyska dostęp do dysku tylko wtedy, gdy żadne inne procesy z niego nie korzystają. Bezpieczne i zalecane rozwiązanie dla operacji w tle (kopie zapasowe, synchronizacja danych).
W tym przykładzie proces rsync działa z najniższym priorytetem operacji wejścia/wyjścia, co minimalizuje jego wpływ na podstawowe operacje systemu. Użycie polecenia ionice pozwala zminimalizować wpływ procesów działających w tle bez konieczności ich całkowitego wyłączania.
Wnioski
Monitorowanie operacji wejścia/wyjścia na dysku stanowi integralną część utrzymania wydajności i stabilności infrastruktury serwerowej. Narzędzia iostat i dstat pozwalają zidentyfikować sytuacje przeciążenia oraz ocenić 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 wskaźników oraz zarządzanie priorytetami operacji wejścia/wyjścia pomagają skrócić czas odpowiedzi usług, zwiększyć przewidywalność obciążenia oraz zapewnić zgodność z wymaganiami umowy SLA. W dalszej kolejności metodologię tę można rozszerzyć poprzez scentralizowane monitorowanie i automatyzację analizy obciążenia operacji wejścia/wyjścia.