top

TOP w Linuxie – interaktywny monitor procesów

TOP jest jednym z najbardziej znanych programów zarówno w świecie Linuksa, jak i Uniksa jako takiego. Większość dystrybucji Linuksowych korzysta z przepisanej i ulepszonej wersji będącej częścią procps-ng. W związku z tym faktem chciałbym podkreślić, iż większość zaprezentowanych w tym artykule treści nie będzie działać na innej implementacji. Sam top prezentuje zbiór użytecznych statystyk na […]

TOP jest jednym z najbardziej znanych programów zarówno w świecie Linuksa, jak i Uniksa jako takiego. Większość dystrybucji Linuksowych korzysta z przepisanej i ulepszonej wersji będącej częścią procps-ng. W związku z tym faktem chciałbym podkreślić, iż większość zaprezentowanych w tym artykule treści nie będzie działać na innej implementacji.

Sam top prezentuje zbiór użytecznych statystyk na temat obecnego obciążenia/zachowania/zdrowia systemu oraz procesów w nim będących. W związku z faktem, iż komenda top na pierwszy rzut oka może być odrobinę przytłaczająca, pozwoliłem sobie przybliżyć ją Czytelnikom.

Ponieważ pakiet procps-ng (lub procps w systemach SUSE) jest częścią grupy core, czyli najmniejszej możliwej instalacji systemu EuroLinux, jak i innych systemów Enterprise Linuksowych oraz generalnie systemów rpmowych (Fedora, OpenSuse, SUSE), to nie wymaga on dodatkowej instalacji.

Co jest czym w TOP?

W celu wywołania naszego monitora procesów wystarczy podać jego nazwę – nie wymaga żadnych dodatkowych flag lub opcji.

Po wywołaniu:

top

ukaże nam się mniej więcej następujące wyjście:

top

Pozwolę sobie tutaj rozłożyć wyjście komendy top na czynniki pierwsze.

top

Pierwszą linię stanowi nazwa programu, pod jaką został wykonany top. W naszym przypadku jest to standardowo top. Po czym wyświetla nam informacje o czasie nieprzerwanej pracy komputera (uptime), ilości użytkowników (liczą się aktywne sesje – zupełnie jak w programie who) i średnim obciążeniu (load average). Linia ta nie przez przypadek jest taka sama jak pierwsza linia doskonale znanego polecania w.

top

Następną sekcją jest sekcja mówiąca o zadaniach (task) lub wątkach (thread), którymi zarządza jądro, oraz o ich stanie. Jak łatwo zauważyć, top nie raportuje nam wszystkich stanów, gdyż liczba „total” nie jest równa zsumowanym pozostałym kolumnom. Wynika to z faktu, iż nie ma tutaj choćby stanu „idle”, czyli procesów, które dosłownie nic nie robią. By zobaczyć, jakie stany obecnie mamy w systemie, wystarczy wykonanie prostego jednolinijkowca ps ax -o state | sort | uniq, a w celu zliczenia, zamiast zwykłego uniq, można użyć unic -c. Jedną z ciekawszych kolumn w wyjściu top jest kolumna ze zliczoną ilością procesów zombie. W dużym uproszczeniu są to procesy, które skończyły swoje wykonanie i czekają na wait() od rodzica. Widzimy je jednak rzadko, gdyż programy mające dzieci z reguły mają dobrze napisaną obsługę końca pracy dziecka. Natomiast w przypadku sierot (procesów, które straciły swojego rodzica) systemd lub init automatycznie wywołują wait() na procesach adoptowanych. By proces zombie powstał i rezydował w tabeli procesów, musi wystąpić szereg zdarzeń i często pomyłek programistycznych.

top

Następna linia zawiera stany CPU (wartość procentową na poszczególny stan), które mogą być następujące:

  •  us(er): czas wykonywania procesów użytkownika z zerową wartością nice (większość procesów);
  • sy(stem): czas wykonywania procesów jądra;
  •  ni(ce): czas wykonywania procesów z wartością nice>0;
  •  id(le): czas wykonywania procesów idle (bezczynności);
  •  wa(it for IO): czas oczekiwania na operację I/O;
  •  hi[Hardware Interrups]: czas spędzony na obsłudze przerwań sprzętowych;
  •  si[Software Interrups]: czas spędzony na obsłudze przerwań programowych;
  •  st(olen): czas ukradziony przez hypervisora (dla maszyn wirtualnych).

W alternatywnym trybie wyświetlania użycia CPU przy pomocy grapu mamy następujący format:

[us+ni]/[sy] [suma wszystkich poza id(le)][Graf]

 

top

Po informacjach o procesorze wyświetla nam informacje o pamięci.

Mamy tutaj ilość całkowitej, wolnej (free) (nietkniętej przez jądro), użytej (used), pamięci zużytej na bufory/cache(buff/cache) oraz dostępnej (avail Mem). Najważniejszą wartością jest z reguły avail Mem. W przypadku, gdyby swap nie istniał, a avail Mem „dobiłby” do zera, nastąpiłoby wywołanie OOM(Out Of Memory) Killera.

Druga linijka zawiera informacje o swapie (total, free, used). Zauważmy, że mamy tutaj used.. Ta kropka nie jest przypadkowa. Wskazuje bowiem koniec sekcji swap – avail Mem nie dotyczy swapa i nie wlicza go do swojej wartości. Pokazuje to poniższy przykład.

top

Ostatnią sekcją wyjścia komendy `top` jest „pole zadań” (luźny przekład z angielskiego „task area”).

top

W standardowej konfiguracji mamy:

  •  PID – ID Procesu (Process ID).
  •  User – User, do którego proces przynależy.
  •  PR – Priorytet. Istnieją dwa typy priorytetów: Normalne (liczba) i RT (Real Time – wykonywane w czasie rzeczywistym – rzadko spotykane).
  •  NI – Wartość Nice. Zauważmy, że w większości przypadków priorytet = 20 + NI.
  •  VIRT – Virtual Image Size, czyli wielkość wirtualnego obrazu procesu. Jest to suma pamięci zmapowanej przez proces (np. pamięci karty graficznej), pamięci używanej przez proces, plików zmapowanych przez proces oraz pamięci współdzielonej z innymi procesami. W wielu przypadkach VIRT jest wartością wręcz wprowadzającą w błąd.
  •  RES – Resident Memory – nieswappowalna pamięć, której proces używa (pamięć fizyczna).
  •  SHR – Shared Memory – pamięć, która jest/może być współdzielona przez proces.
  •  S – Stan procesu (Running, Sleeping, Zombie, etc…).
  •  %CPU – Użycie CPU w procentach. W środowiskach wieloprocesorowych (mówiąc o procesorze jako rdzeniu procesora, niekoniecznie o wielu układach) może być wartością większą niż 100%. Np. wysycenie dwóch procesorów (rdzeni lub wątków procesora, w zależności od typu procesora, architektury itp.) da nam wynik 200%.
  •  %MEM – Procentowy udział w dostępnej pamięci fizycznej.
  •  TIME+ – Całkowity czas, który procesor zużył na zadanie, odkąd to wystartowało.+ oznacza większą dokładność. W naszym przypadku setne części sekundy.
  •  COMMAND – Komenda.

Customizcja top

Zanim zaczniemy „grzebać” w standardowych ustawieniach top, proponuję zrobić link symboliczny, a następnie go wywołać.

$ sudo ln -s /usr/bin/top /usr/bin/my_top
$ my_top

Teraz pierwsza linia wyjścia będzie zaczynała się od my_top - . Wynika to z faktu, iż top, jak każdy program w systemie Linux, ma dostęp do informacji, z jaką nazwą został wywołany. Narzędzie top wykorzystuje ten fakt, by umożliwić nam tworzenie i utrzymanie wielu konfiguracji. Moim skromnym zdaniem jest to całkiem sprytny mechanizm.

Pierwszą rzeczą, jaką praktycznie zawsze należy ustawić, jest skalowanie pamięci. W przeciwieństwie do htop, top nie posiada inteligentnego skalowania. Jest ono ustawione na sztywną wartość (jednostkę). Co gorsze, domyślnie są to KiB (kilobajty, w teorii poprawnie nazywane kikibajtami [użycie 2^10 zamiast 10^3, jednak słownictwo to się nie przyjęło i tylko twórcy nośników pamięci oraz firma Apple używają „przekłamanej” nomenklatury]). Przy pomocy klawisza E możemy skalować pamięć aż do exbibajtów (częściej nazywanych eksabajtami [co ciekawe, zgodnie z polską Wikipedią, w tym przypadku zamieniamy ks na x]). W przypadku dobrnięcia do kresu skalowania „zapętlamy” się i dostajemy wartość początkową. W celu wyskalowania pamięci dla obszaru zadań używamy z kolei małego e. Tutaj jednak maksymalne skalowanie kończy się na petabajtach.

Po takiej operacji możemy zapisać naszą konfigurację. Służy do tego skrót klawiszowy W. W zależności od nazwy programu, ścieżka do pliku konfiguracyjnego to ${HOME}/.${NAZWA}rc lub w nowszych wersjach pakietu procps-ng ${HOME}/.config/procps/.${NAZWA}rc.

Następnie proponuję przejść do ustawień odświeżania. Domyślnie jest ono ustawione na 3 sekundy. Przy pomocy klawisza d (d jak delay) lub s (jak sekunda) można ustawić pożądaną wartość. W moim wypadku jest to z reguły 5 sekund (w tym celu wpisuję 5 i wciskam enter).

Kolejną zmienną, którą lubię mieć w swoim topie, jest zmiana kolumn. Po pierwsze kolumna VIRT musi odejść! Po drugie według uznania można dodać kolumnę. W moim wypadku pozwolę sobie na dodanie nTH mówiącej o liczbie wątków w danym procesie. By wejść w tryb edycji pół (field), użyjemy klawisza f.

W tym trybie nawigujemy przy pomocy strzałek w górę i w dół. Spacją możemy włączać/wyłączać pola. Jeśli chcemy zmienić kolejność pól, wciskamy prawą strzałkę (wchodzimy w tryb przenoszenia pola). Następnie przy pomocy strzałek góra, dół przenosimy pole na wybrane miejsce. By wyjść z trybu przenoszenia pola i potwierdzić jego nową pozycję, należy użyć klawisza enter. Ja zmieniłem kolejność pól %MEM oraz ustawiłem nTH w odpowiednim, moim zdaniem, miejscu.

Finalnie po zmianach okno powinno wyglądać mniej więcej następująco.

top

W trybie edycji pól istnieje też istotna funkcjonalność, jaką jest ustawienie pola, po którym top będzie sortował procesy. Służy do tego klawisz s. Jest to najłatwiejszy sposób na ustawienie pola sortowania.

Przedostatnią rzeczą, na jaką chciałbym zwrócić uwagę przy okazji menu wyboru pól, jest fakt, iż top w trybie alternatywnym posiada 4 okna (grupy) – 1:Def,2:Mem,3:Job,4:Usr. Domyślne okno, które nam się wyświetla, to okno 1:Def. Jest ono współdzielone zarówno przez tryb pracy „normalnej”, jak i tryb pracy „alternatywnej”. Klawiszem zmieniającym edytowane okno jest klawisz w.

Mając pola ustawione tak, jak chcemy, możemy wyjść z edycji pól przy pomocy q lub ESC. Ten drugi sposób jest odrobinkę bezpieczniejszy, gdyż podwójne wciśnięcie q spowoduje wyjście z programu :), podczas gdy ESC wyjdzie z edycji okna, a następnie wymusi odświeżenie stanu programu.

Gdy już mamy ustawioną konfigurację, możemy śmiało zapisać nasze ustawienia, ponownie używając klawisza W.

Ostatnią zmianą w konfiguracji, którą chciałbym zaproponować, jest zmiana kolorów. Zdaję sobie sprawę, iż nie każdy (facet) rozróżnia więcej niż 3 kolory, nie mniej bez paniki, top pozwala nam wybrać z listy oszałamiających 8! By wejść do trybu mapowania kolorów, używamy klawisza Z. Niemniej przed tą operacją należy włączyć tryb kolorów przy pomocy przełącznika z.

Na początku przy pomocy (S, M, H, T) wybieramy sekcje, a następnie jednym z numerów (0-7) wybieramy kolor. W tym wypadku także mamy możliwość zmiany okna, którego kolory edytujemy (służy do tego w lub a).

By wyjść i zapisać zmiany należy wcisnąć klawisz enter.
Ustawienia prezentowane poniżej daje następująca konfiguracja S2 M1 H4 T7.

top

Finalny efekt naszej konfiguracji można znaleźć poniżej.

top

Kilka dodatkowych porad à propos użytkowania TOP

Pierwszą i najważniejszą poradę zaczerpnę wprost z manuala `top`.

When operating top, the two most important keys are help (’h’ or ’?’) and quit (’q’) key.

Co w luźnym tłumaczeniu oznacza:

Podczas pracy z top, dwoma najważniejszymi klawiszami są pomoc (’h’ lub ’?’) i klawisz wyjścia (’q’).

Ze względu na rozbudowane opcje, nie ma sensu zapamiętywać wszystkich możliwych klawiszy. Niemniej pozwolę sobie kilka z nich wymienić.

Sortowanie i filtry

P – sortuje procesy po użyciu procesora.
M – sortuje procesy po użyciu pamięci.
n – sortuje po numerze PID.
< i > – zmienia pole, po którym odbywa się sortowanie.
u – filtruje po nazwie użytkownika, niestety należy wpisać jego pełną nazwę.
R – odwraca kolejność sortowania.

Użyteczne

k – służy do wysłania SIGKILL.
r – służy do zmiany wartości parametru nice.

Tryb „alternatywny”*

A – służy do wejścia/wyjścia w/z tryb/u alternatywny/ego.
w lub a – zmienia okno w trybie alternatywnym.

Zmiana podsumowań

1,2,3 – zmienia tryb podsumowania procesora. Tryby te mogą mieć „podtryby”. W tym wypadku należy ponownie wywołać klawisz.
t – zmienia tryb wyświetlania podsumowania procesora.
m – zmienia tryb podsumowania pamięci.
l – włącza/wyświetla baner podsumowania (pierwszą linijkę).
H – zmienia tryb zadania (procesy) na wątki (threads).

Inne

c – włącza/wyłącza wyświetlanie całych ścieżek komend.
G – wybór jednej z 4 grup (1:Def,2:Mem,3:Job,4:Usr) w danym oknie. W trybie alternatywnym mamy 4 okna, które posiadają kolejno wymienione grupy. Tutaj należy zwrócić uwagę, iż top nie jest konsekwentny w nazewnictwie. Raz mówimy o grupach, raz o oknach. W trybie pracy normalnej wybieramy grupę pól, które się wyświetlają. W trybie alternatywnym polecenie ustawia grupę pól, które będą w danym oknie.

Podsumowanie i film wideo

Chciałbym Państwu podziękować za spędzenie swojego czasu z tym tekstem. Firma EuroLinux na co dzień realizuje wsparcia dla użytkowników systemów operacyjnych i baz danych. Dostarczamy treści i usługi zarówno łatwiej przyswajalne, jak i te trudniejsze merytorycznie. Dzisiaj przygotowaliśmy do niniejszego materiału instruktażowy film video, który znajduje się poniżej. Jego tematyka jest bardzo zbliżona do poruszanej w tym artykule. Myślę, że jest wartościowym dopełnieniem tego artykułu. Życzę owocnego oglądania.

https://www.youtube.com/watch?v=MrfJryQ7C9Y

Autorzy

Artykuły na blogu są pisane przez osoby z zespołu EuroLinux. 80% treści zawdzięczamy naszym developerom, pozostałą część przygotowuje dział sprzedaży lub marketingu. Dokładamy starań, żeby treści były jak najlepsze merytorycznie i językowo, ale nie jesteśmy nieomylni. Jeśli zauważysz coś wartego poprawienia lub wyjaśnienia, będziemy wdzięczni za wiadomość.