
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 systemów Enterprise Linuksowych (Rocky Linux, RHEL, AlmaLinux, CentOS) oraz generalnie systemów rpmowych (jak 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:
Pozwolę sobie tutaj rozłożyć wyjście komendy top
na czynniki pierwsze.
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
.
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.
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]
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.
Ostatnią sekcją wyjścia komendy `top` jest „pole zadań” (luźny przekład z angielskiego „task area”).
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.
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
.
Finalny efekt naszej konfiguracji można znaleźć poniżej.
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.