Przejdź do treści
Lekcja 22 z 117

Kurs › Moduł 2 › Lekcja 22

htop: top dla ludzi

⏱ ok. 10 min czytania· moduł 2: Procesy i jak działa system

Po tej lekcji: kursant instaluje htop na Ubuntu i RHEL, czyta jego paski i nagłówek, używa drzewa, filtra, wyszukiwania i sortowania, zabija i zmienia priorytet procesów F-klawiszami, konfiguruje widok, i wie, czym są btop i glances.

Wstęp

obok siebie surowy top i kolorowy htop z paskami

Wczoraj był top. Działa wszędzie, wszystko pokazuje, ale wygląda jak rozkład jazdy PKP z 1995 roku. Żeby zabić proces, musisz przepisać jego numer. Żeby zobaczyć drzewo, musisz pamiętać wielkie V.

A teraz to samo, tylko że strzałkami wybierasz proces, F9 i po sprawie. Paski pokazują obciążenie każdego rdzenia. Drzewo jednym klawiszem. Filtr, który działa w trakcie pisania. To jest htop. Pierwsza rzecz, którą wielu adminów instaluje na świeżym serwerze, zaraz po tym, jak przeklnie, że jeszcze go nie ma.

Instalacja

Pamiętasz, że menadżer pakietów to hurtownia z kurierem? Na Ubuntu htop jest w hurtowni od ręki:

sudo apt install htop
htop --version
htop 3.3.0

Na RHEL jest problem. Red Hat do swoich repozytoriów htop nie dorzuca. Trzeba włączyć EPEL, czyli dodatkowe repozytorium z pakietami budowanymi przez społeczność Fedory. Hurtownia z sąsiedniej ulicy. Dobrze zaopatrzona, ale Red Hat nie daje na nią gwarancji ani wsparcia.

sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
sudo dnf install htop

Na Rocky i Alma jest prościej, bo epel-release jest w ich standardowych repozytoriach:

sudo dnf install epel-release
sudo dnf install htop

Z wiedzą o pakietach i repozytoriach nie przejmuj się na razie. Cały moduł o tym przed nami. Dziś wystarczy, że wiesz, którą komendę wkleić.

Nagłówek: paski i liczniki

htop
    0[|||||||||||||||||||||||||||||||||         66.4%] Tasks: 54, 49 thr, 63 kthr; 2 running
    1[||||||||||||||||||||||||||||||||||||||||||98.7%] Load average: 6.16 3.06 1.23
  Mem[|||||||||||||||||||                  828M/7.84G] Uptime: 00:12:17
  Swp[                                          0K/0K]

Po lewej są paski. 0 i 1 to rdzenie. Mam dwa, więc dwa paski. Na serwerze z 64 rdzeniami będzie ich 64 i wygląda to jak equalizer w wieży stereo.

Pasek nie jest jednokolorowy. Kolory mają znaczenie, a legendę masz pod klawiszem F1:

CPU usage bar: [low/normal/kernel/guest                  used%]
Memory bar:    [used/shared/compressed/buffers/cache          used/total]

W domyślnym schemacie kolorów:

  • procesor: niebieski to procesy o niskim priorytecie, zielony zwykłe programy, czerwony jądro, turkusowy maszyny goście. Czyli to samo co ni, us i sy w top, tylko kolorkami.
  • pamięć: zielony to pamięć naprawdę używana przez programy, niebieski bufory, żółty cache. Dużo żółtego to nie problem. Pamiętasz stół z tacami z poprzedniej lekcji? Sprzątaczka zabierze.

Po prawej liczniki:

  • Tasks: 54, 49 thr, 63 kthr; 2 running — 54 procesy, 49 wątków programów, 63 wątki jądra i ile z tego teraz biegnie.
  • Load average — te same trzy liczby co w top. Porównujesz z liczbą pasków rdzeni. Tu dwa rdzenie i load 6, czyli kolejka w Biedronce.
  • Uptime — jak długo maszyna działa.

Lista procesów

  PID USER       PRI  NI  VIRT   RES   SHR S  CPU%-MEM%   TIME+  Command
26359 root        20   0  2740  1776  1644 S   0.0  0.0  0:00.00 sleep 7001
26360 root        20   0  2740  1772  1644 S   0.0  0.0  0:00.00 sleep 7002

Te same kolumny co w top, z dwiema różnicami. Priorytet nazywa się PRI. A pamięć htop pisze po ludzku: 5536M, 547M, zamiast liczyć w kilobajtach.

I pierwsza rzecz, która zaskakuje: niektóre programy widać na liście kilka razy, z tym samym RES. To nie klony. To wątki. htop domyślnie pokazuje wątki programów jako osobne linijki. Kucharz z czterema parami rąk pojawia się cztery razy. Klawisz H je chowa, K chowa wątki jądra.

Myszka i strzałki

Tu jest największa różnica. W htop możesz się poruszać strzałkami i klikać myszką, nawet przez SSH. Klikasz w nagłówek kolumny, sortuje się po niej. Klikasz w proces, podświetla się. Wszystkie akcje działają na podświetlonym procesie. Żadnego przepisywania PID-ów z kartki.

A na dole ekranu masz ściągawkę: pasek z F-klawiszami. Ten pasek to najlepszy pomysł w historii programów terminalowych. Nie musisz niczego pamiętać.

F-klawisze po kolei

  • F1 albo h — pomoc, razem z legendą kolorów.
  • F2 albo S — ustawienia. O nich za chwilę.
  • F3 albo / — szukaj. Piszesz kawałek nazwy, podświetlenie skacze do pasującego procesu. Kolejne F3 skacze do następnego.
  • F4 albo \ — filtr. To co innego niż szukanie: filtr ukrywa wszystko, co nie pasuje. Wielkość liter nie ma znaczenia, a kilka słów oddzielasz kreską, na przykład nginx|php. Wyłączasz, otwierając filtr jeszcze raz i naciskając Esc.
  • F5 albo t — drzewo. Jak pstree, tylko na żywo i z kolumnami.
  • F6 — wybór kolumny do sortowania. Albo krócej, jak w top: P procesor, M pamięć, T czas. I odwraca kolejność.
  • F7 i F8 — zmiana priorytetu. F8 obniża priorytet, czyli podnosi nice. F7 podnosi priorytet i wolno to tylko rootowi.
  • F9 albo k — wyślij sygnał. O tym za chwilę.
  • F10 albo q — wyjście.

Filtr i drzewo razem wyglądają tak. Filtr sleep 700, potem F5:

  PID+USER       PRI  NI  VIRT   RES   SHR S  CPU% MEM%   TIME+  Command
26346 root        20   0  5092  3748  3292 S   0.0  0.0  0:00.00 |     |  `- bash
26359 root        20   0  2740  1776  1644 S   0.0  0.0  0:00.00 |     `- sleep 7001
26360 root        20   0  2740  1772  1644 S   0.0  0.0  0:00.00 |     `- sleep 7002

W drzewie zostają też rodzice pasujących procesów, żebyś wiedział, kto je zatrudnił. Bardzo przydatne, kiedy szukasz, który skrypt namłodził sto kopii czegoś.

Przydatne drobiazgi bez F-klawiszy:

  • u — pokaż procesy jednego użytkownika.
  • Spacja — zaznacz proces. Możesz zaznaczyć kilka i zabić wszystkie naraz. c zaznacza proces razem z jego dziećmi, U odznacza wszystko.
  • p — pełne ścieżki do programów.
  • F — śledź proces. Podświetlenie trzyma się go, nawet kiedy przeskakuje na liście przy sortowaniu.
  • l — otwarte pliki procesu, jeśli masz zainstalowany lsof. s — podgląd wywołań systemowych, jeśli masz strace.
  • Cyfry — wpisujesz PID, podświetlenie do niego skacze.

Zabijanie strzałkami

Podświetlasz proces, naciskasz F9. Po lewej pojawia się lista sygnałów:

Send signal:
 0 Cancel
 1 SIGHUP
 2 SIGINT
 3 SIGQUIT
 ...
 9 SIGKILL
 ...
15 SIGTERM

Domyślnie podświetlony jest 15 SIGTERM. Enter i proces dostaje grzeczną prośbę o zamknięcie. Pamiętasz analogię? SIGTERM to grzeczna prośba o zamknięcie lokalu, SIGKILL to wyłączenie prądu. Zawsze zaczynasz od prośby. Cały następna lekcja jest o tym, czemu.

Uwaga: htop uruchomiony jako zwykły użytkownik zabije tylko Twoje procesy. Cudze, na przykład roota, odmówią. To dobrze. Strażnik nie wpuści Cię do cudzego pokoju z siekierą.

Konfiguracja: F2

F2 otwiera ustawienia. Po lewej kategorie:

  • Meters — co ma być w nagłówku i gdzie. Możesz dodać na przykład zegar, nazwę komputera albo osobny pasek każdego rdzenia w dwóch kolumnach, kiedy rdzeni jest dużo.
  • Display options — widok drzewa na start, ukrywanie wątków jądra i programów, podświetlanie nazwy programu w komendzie.
  • Colors — schemat kolorów. Jest nawet czarno-biały, na terminal z lat dziewięćdziesiątych.
  • Screens — kolumny. Możesz dodać na przykład IO_READ_RATE i IO_WRITE_RATE, żeby widzieć, kto mieli dyskiem.

Ustawienia zapisują się same przy normalnym wyjściu do pliku ~/.config/htop/htoprc. Plik jest nadpisywany przy każdym wyjściu, więc ręcznie go nie edytujesz, bo i tak przepadnie. Konfigurujesz przez F2 i już.

To samo z linii komend:

htop -u eryk
htop -p 1234,5678
htop -t
htop -F nginx
htop -d 20

Tylko procesy użytkownika eryk, tylko wskazane PID-y, od razu drzewo, od razu filtr, odświeżanie co dwie sekundy. Uwaga na -d: liczba jest w dziesiątych częściach sekundy, więc 20 to dwie sekundy, nie dwadzieścia. Klasyczna pułapka dla osób, które przyszły z top, gdzie -d jest w sekundach.

btop i glances w skrócie

Skoro htop to top dla ludzi, to btop jest dla ludzi, którzy oglądają kokpity samolotów na YouTube. Wykresy procesora, pamięci, dysków i sieci, wszystko w kolorach, wszystko się rusza. Świetny na własny laptop albo serwer domowy.

sudo apt install btop
btop --version
btop version: 1.3.0

[RHEL] btop jest w EPEL, więc po włączeniu EPEL wystarczy sudo dnf install btop.

glances idzie w inną stronę: jeden ekran ze wszystkim naraz, procesy, sieć, dyski, czujniki, plus ostrzeżenia na kolorowo, kiedy coś przekracza normy. Umie też wypisywać dane dla skryptów i działać jako mały serwer WWW z podglądem w przeglądarce.

sudo apt install glances
glances
glances --stdout cpu.total,mem.percent,load
cpu.total: 59.1
mem.percent: 18.7
load: {'min1': 0.81298828125, 'min5': 1.3251953125, 'min15': 1.23583984375, 'cpucore': 2}

[RHEL] Z glances na RHEL 10 bywa różnie. Sprawdź dnf search glances po włączeniu EPEL. Jeśli go nie ma, instaluje się go jako program w Pythonie, na przykład przez pipx install glances.

Uczciwie: na serwerach produkcyjnych najczęściej spotkasz top i htop. Reszta to dodatki, ładne, ale nie zawsze obecne. Fundament to rozumienie liczb. Jeśli rozumiesz load average, wa, RES i stany procesów, to każdy z tych programów przeczytasz w minutę.

Jak to działa pod spodem

htop robi to samo co top i ps: co chwilę czyta /proc. Każdy proces to folder /proc/PID, każdy wątek to folder /proc/PID/task/TID, pasek procesora to różnica liczb z /proc/stat między dwoma odczytami, pasek pamięci to /proc/meminfo.

A zabijanie? F9 robi dokładnie to samo co komenda kill: prosi jądro o dostarczenie sygnału do procesu o danym numerze. Zmiana priorytetu przez F7 i F8 to to samo, co komenda renice. htop to tylko ładna nakładka z myszką na narzędzia, które już znasz albo zaraz poznasz.

Ściąga flag

KomendaFlaga / klawiszCo robi
htop-u użytkownikprocesy jednego użytkownika
htop-p PID,PIDtylko wskazane procesy
htop-tstart w widoku drzewa
htop-F tekststart z filtrem
htop-d Nodświeżanie co N dziesiątych sekundy
htop-s KOLUMNAsortowanie po kolumnie
htopF3 / F4szukaj / filtruj
htopF5drzewo
htopF6, P, M, T, Isortowanie, odwrócenie
htopF7 / F8wyższy / niższy priorytet
htopF9wyślij sygnał (domyślnie SIGTERM)
htopSpacja, c, Uzaznacz / z dziećmi / odznacz
htopH / Kukryj wątki programów / jądra
htopu, p, Fużytkownik, pełne ścieżki, śledź proces
btop-u msodświeżanie w milisekundach
glances--stdout poladane w formie tekstu dla skryptów

⚠ Typowy błąd

Admin w htop widzi swoją aplikację dwadzieścia razy na liście, każda linijka 2 GB w kolumnie RES. Liczy: dwadzieścia razy dwa, czterdzieści gigabajtów. Serwer ma szesnaście. Pisze do zespołu, że aplikacja łamie prawa fizyki.

To nie dwadzieścia procesów, tylko jeden proces z dwudziestoma wątkami. Wszystkie wątki dzielą tę samą pamięć, więc każdy pokazuje to samo RES. Jeden kucharz, dwadzieścia rąk, jeden fartuch. Naciśnij H, żeby schować wątki, albo F5, żeby zobaczyć drzewo, i liczba wróci do rozsądnych granic.

A nawet przy samych procesach sumowanie RES kłamie, bo biblioteki wspólne są liczone każdemu osobno. Ekspres do kawy z poprzedniej lekcji. Prawdziwe zużycie całego systemu pokazuje pasek Mem na górze.

✎ Zadanie

  • Zainstaluj htop. Na RHEL najpierw włącz EPEL.
  • Uruchom w tle trzy procesy sleep 5000 &.
  • W htop znajdź je filtrem F4, włącz drzewo F5 i sprawdź, kto jest ich rodzicem.
  • Jednemu obniż priorytet klawiszem F8 i zobacz, jak zmienia się kolumna NI.
  • Zaznacz spacją wszystkie trzy i zakończ je jednym F9 z SIGTERM.
  • W F2 dodaj do nagłówka zegar, wyjdź i sprawdź, że powstał plik ~/.config/htop/htoprc.
Pokaż rozwiązanie
sudo apt install htop          # [Ubuntu]
sudo dnf install htop          # [RHEL], po włączeniu EPEL
sleep 5000 & sleep 5000 & sleep 5000 &
htop
# F4: sleep 5000, F5: drzewo, F8 na jednym, Spacja na trzech, F9, Enter
# F2 > Meters > dodaj Clock, wyjście F10
ls -l ~/.config/htop/htoprc

W drzewie rodzicem trzech sleep jest Twój Bash. Po F8 kolumna NI zmienia się z 0 na 1:

  PID  NI CMD
31851   1 sleep 5000

Po F9 z SIGTERM wszystkie trzy znikają naraz, a Bash melduje Terminated przy każdym. Jeśli przy F7 htop Ci odmówił, to działałeś jako zwykły użytkownik. Podnosić priorytet wolno tylko rootowi. W kuchni też tylko szef decyduje, kto gotuje pierwszy.

Co dalej

W tej lekcji dwa razy wysłałeś sygnał, ale tak naprawdę jeszcze nie wiesz, czym jest. W następnej lekcji: sygnały i zabijanie procesów. kill, pkill, killall, czemu kill -9 to ostateczność i jak jedna literówka w pkill potrafi zabić … Ciebie.