Prawdopodobnie każdy użytkownik komputera, nie wspominając o administratorach zadawał sobie pytania: "Dlaczego mój system tak wolno działa?", "Co mogę zrobić aby go przyśpieszyć?". Oczywiście zawsze jest rozwiązanie ostateczne - wymienić na nowszy. Ale czy cały system trzeba wymienić? Może wystarczy jeden komponent? Ale który?
Procesor, dysk twardy? A może po prostu dodać więcej pamięci RAM? Może jakiś program zabiera szczególnie dużo zasobów i wystarczy go wyłączyć lub inaczej skonfigurować, aby system "odetchnął"? Poniżej przedstawiam metodę znajdowania wąskich gardeł w systemach UNIX/Linux w oparciu o programy vmstat.
vmstat
vmstat to program występujący we wszystkich (chyba) odmianach UNIX i Linux. Jego odmiany różnią się nieznacznie od siebie, ale generalnie są bardzo podobne. Poniższy opis bazuje na wersji vmstat z Linux. Do uruchomiania vmstat nie są wymagane prawa administratora. Aby uruchomić program należy na konsoli napisać vmstat, najlepiej podać też jako parametr interwał lub dwa parametry tj. interwał oraz ilość wywołań np.:
$ vmstat 5 30
Powyższa linia uruchomi vmstat 30 razy z interwałem 5s pomiędzy uruchomieniami.
Aby przerwać natychmiast działanie programu należy na konsoli nacisnąć CTRL-C. Pełny opis działania i możliwości vmstat uzyskasz z podręcznika systemu pisząc na konsoli man vmstat.
Po uruchomieniu programu ukaże się poniższy widok.
Pierwsza linia zawiera średnie wartości wyliczone od czasu ostatniego startu systemu. Najważniejsze kolumny, dzięki którym można odczytać stan systemu to:
procs: r - ilość procesów oczekujących w kolejce na przydzielenie procesora,
memory: swapd - wielkość wykorzystanej pamięci swap,
memory: free - ilość wolnej pamięci,
swap: si - ilość bloków pamięci wczytywanych ze swap,
swap: so - ilość bloków pamięci zapisywanych do swap,
io: bi - ilość bloków danych wczytywanych z dysku,
io: bo - ilość bloków danych zapisywanych na dysk,
cpu: id - czas bezczynności procesora (wyrażony w %),
cpu: wa - czas procesora spędzony w oczekiwaniu na zakończenie operacji I/O np. pisanie lub czytanie z dysku (wyrażony w %),
cpu: sy - czas procesora spędzony na realizację zadań systemu (wyrażony w %),
cpu: us - czas procesora spędzony na wykonaniu programów nie będących elementem systemu (wyrażony w %).
Najczęściej system ma za mało zasobów w jednym z trzech podstawowych podsystemów tzn.:
- za słaby jest procesor,
- system ma za mało pamięci,
- dysk jest zbyt wolny.
Poniżej opisy każdej z sytuacji.
Za słaby procesor
Jeśli cpu: id jest zwykle bliskie 0 to oznacza, że procesor (lub procesory) nie jest wystarczająco mocny i pracuje z pełną mocą. Jeśli taka sytuacja powtarza się to oznacza, że procesor nie nadąża obsłużyć wszystkich uruchomionych programów. W takim przypadku warto przyjrzeć się kolumnom cpu: us, cpu: sy oraz cpu: wa. Wysoka wartość cpu: us oznacza, że większość czasu procesora jest zużywane na wykonanie programów. Wysoka wartość cpu: sy oznacza, że większość czasu procesora jest zużywane na wykonanie zadań systemowych. Wysoka wartość cpu: wa jest opisana poniżej. Dodatkową informacje zawiera w kolumna procs: r. Wysokie wartości procs: r oznaczają, że w systemie jest dużo procesów, które konkurują ze sobą o procesor (tak bywa np. w serwerach obsługujących wielu użytkowników). Jeśli zaś w tej kolumnie jest np. 1, to oznacza że w systemie jest jeden dominujący proces, który potrzebuje mocnego procesora (tak bywa np. na stacjach roboczych, gdzie wykonywane są obliczenia lub kompilowane są programy).
Zbyt wolny dysk
Gdy w kolumnie cpu: wa występują wysokie wartości, często w korelacji z wysokimi wartościami io: bi oraz io: bo oznacza to, że system dużo czasu spędza w oczekiwaniu na zakończenie operacji I/O. Gdyby dysk (podsystem dyskowy, bo dysków może być kilka) był szybszy, system czekałby krócej na zakończenie operacji I/O i tym samym jako całość system działaby szybciej.
Za mało RAM
O tym jak wykorzystywana jest pamięć mówią przede wszystkim kolumny:
memory: swapd
memory: free
swap: si, so
Jeśli memory: free ma małą wartość oraz memory: swapd ma wysoką wartość, oznacza to że system mocno wykorzystuje zarówno pamięć RAM jaki swap. To jeszcze nie oznacza, że pamięci jest za mało, oznacza jedynie, że jest mocno wykorzystana. Kolumna swap: si mówi o ilości stron pamięci wczytywanych ze swap do RAM, zaś swap: so informuje o ilości stron pamięci wyrzucanych z RAM do swap. Jeśli wartości kolumn swap: si , swap: so są wysokie, oraz pamięć jest mocno wykorzystywana, to oznacza że system ma za mało RAM i musi często zapisywać i odczytywać strony ze swap. Jeśli zaś, wartości kolumn swap: si , swap: so są wysokie ale pamięć nie jest mocno wykorzystywana, to być system nie wykorzystuje pamięci optymalnie, zobacz: Optymalizacja Linux. O ile to możliwe lepiej jest aby system nie korzystał ze swap. Pamięć swap znajduje się na twardym dysku, do którego dostęp jest około 100 razy wolniejsze niż dostęp do pamięci RAM.
Przykład analizy systemu
Analizowany system to stacja robocza, która zasadniczo pracuje sprawnie, ale podczas uruchamiania jednego ważnego programu bardzo zwalnia. Niestety ten programu musi być uruchamiany. Nie można z niego zrezygnować ani zastąpić go innym. Sprawdźmy gdzie w systemie znajduje się wąskie gardło.
Uruchamiany vmstat i po chwili uruchamiamy aplikację. Poniższy obrazek przedstawia odczyty vmstat.
Pierwsza linia, przedstawia wartości średnie systemu wyliczone od chwili ostatniego startu. W dwóch kolejnych liniach widać, że system odpoczywa. cpu: id jest wysokie, swap nie jest wykorzystany, zapisy i odczyty na i z dysku są znikome. W czwartej linii, coś zaczyna się dziać - w tym momencie program został uruchomiony.
Po chwilowym wzroście cpu: us, wartości w tej kolumnie mocno spadają. Jednocześnie wysokie wartości można zaobserwować w kolumnach cpu: sy oraz cpu: wa. Oznacza, to że dużo zasobów jest przeznaczonych na obsługę wywołań systemowych i funkcji systemu, oraz dużo czasu jest "marnowane" w oczekiwaniu na realizację operacji I/O. Warto również zauważyć, że memory: free spada - dane są ładowane do pamięci RAM, jednak memory: swpd oraz swap: si i swap: so cały czas wynoszą 0.
Wnioski:
- System ma wystarczająco dużo pamięci można to wywnioskować z faktu, że swap nie jest w cale wykorzystany.
- Procesor jest zbyt słaby. Wymiana procesora na szybszy przyśpieszy działanie systemu.
- Wymiana dysku na szybszy zmniejszy
cpu: wa, dzięki czemu system będzie krócej czekał na realizację operacji I/O.
Zauważyć też można, że wymiana jedynie procesora spowoduje, ze system będzie "wisiał" na operacjach I/O. Wymiana jedynie dysku spowoduje, że operacje I/O będą realizowane szybciej, jednak wąskim gardłem pozostanie procesor. Wniosek: najlepiej wymienić zarówno procesor, jak i dysk.
Punkt odniesienia (ang. base line)
W powyższym opisie wykorzystania vmstat często padały pojęcia "wysoka wartość", "niska wartość" są one oczywiście relatywne. Warto co jakiś czas uruchomić vmstat aby wiedzieć jakie wartości są przeciętne dla systemu, przy jakich wartościach odczytów system pracuje gładko. Mając taki punkt odniesienia (ang. base line), łatwo zauważyć który z komponentów systemu zaczął sprawiać problem.
Jak sobie z tym radzić?
Po zlokalizowaniu wąskiego gardła systemu warto poszukać konkretnej przyczyny takiego stanu rzeczy, czyli procesów które zabierają najwięcej zasobów. Czasem taki proces można wyłączyć lub inaczej skonfigurować. Jeśli nie jest to możliwe pozostaje wymiana/dodanie kolejnego CPU, dodanie pamięci RAM, wymiana lub rekonfiguracja dysków.
Komentarze
Aby sprawdzić wydajność dysków należałoby użyć iostat (najlepiej z opcją -mdx) i zobaczyć ilość zapisów/odczytów, await (oczekiwanie w ms) oraz %util.
Tak, jest to wielkie uproszczenie
ale już tu widać że jest problem z I/O, który namierzamy już dokładnie iostatem.
Pewnie że może to nie musi być dysk - załóżmy że ktoś intensywnie działa na dysku podłączonym przez USB