Výkon a sledování

load average, top/htop, vmstat, iostat.

Když server „jede pomalu", většina lidí začne panikařit a vypínat procesy naslepo. To je omyl. Výkon se měří, ne hádá — a Linux ti dává hromadu malých nástrojů, které přesně ukážou, kde je úzké hrdlo: jestli se dře procesor, jestli čeká na disk, nebo jestli došla paměť. Až se naučíš číst pár čísel (load average, free -h, I/O wait), přestane ti „pomalý stroj" nahánět strach — místo dohadů budeš vědět, co se děje a proč.


Pár pojmů na úvod

  • Load average = průměrný počet procesů, které chtějí běžet (běží nebo čekají na CPU/disk), za poslední 1, 5 a 15 minut. Není to procento — je to počet. Smysl dostane až vztažený k počtu jader.
  • Jádro (core / vlákno) = kolik věcí umí CPU dělat opravdu naráz. Load 4 je něco jiného na 2 jádrech než na 8 — o tom celá kapitola.
  • CPU-bound = stroj brzdí procesor (počítá naplno).
  • I/O-bound = stroj brzdí disk nebo síť — CPU se nudí a čeká na data.
  • Paměťově-bound = došla RAM, systém začne odkládat na disk (swap) a všechno se zadrhne.
  • Cache (buff/cache) = RAM, kterou si Linux „půjčil" na zrychlení čtení z disku. Vypadá jako „obsazená", ale kdykoli se uvolní, když ji potřebuje program. Není to problém — je to feature.
  • Swap = kus disku, který slouží jako nouzová náhrada RAM. Pomalý. Když se používá pořád dokola, říká se tomu swap thrashing a stroj se prakticky zastaví.

Load average — nejčastěji špatně čtené číslo

Nejrychleji ho vidíš v uptime:

uptime
#  14:32:07 up 3 days,  2:11,  2 users,  load average: 0.42, 1.05, 2.30

Ta tři čísla na konci jsou load za 1 / 5 / 15 minut. Čteš je takhle:

  • 1 min = co se děje teď (nejvíc kolísá).
  • 5 a 15 min = trend. Klesá zleva doprava (2.30 → 1.05 → 0.42)? Nárazová špička už odeznívá. Roste zprava doleva? Zátěž narůstá a míří to do problému.

Klíč, který začátečníky mate: load číslo samo o sobě nic neříká, dokud ho nevydělíš počtem jader.

Kolik máš jader zjistíš takto:

nproc              # počet logických jader (vláken), např. 8

A teď to důležité pravidlo:

  • load ≈ počet jader → stroj je plně vytížený, ale stíhá. Pohoda.
  • load < počet jader → má rezervu.
  • load > počet jader → víc práce, než kolik jader zvládne — procesy stojí ve frontě, latence roste.

💡 Konkrétně: load 4 na 8 jádrech = pohoda (využitá zhruba polovina). Load 4 na 2 jádrech = přetíženo (dvojnásobek toho, co stroj zvládne — všechno čeká). Úplně stejné číslo, opačný závěr. Proto load bez znalosti počtu jader nikdy neinterpretuj.

Malá záludnost: na Linuxu se do load počítají i procesy čekající na disk (stav „D", uninterruptible sleep), ne jen ty čekající na CPU. Takže vysoký load nemusí znamenat vytížený procesor — může to být zavařený disk. Kdo to úzké hrdlo je, rozlišíš dál v kapitole.


top a htop — živý pohled na procesy

top je předinstalovaný všude, htop je barevný a příjemnější (často se doinstalovává):

top      # ukončíš klávesou q
htop     # hezčí, myš, barvy — pokud je nainstalovaný

Nahoře vidíš souhrn (load average, počet úloh, využití CPU a paměti), pod tím tabulku procesů. Nejdůležitější sloupce:

  • %CPU — kolik procenta jednoho jádra proces právě žere. Pozor: může přesáhnout 100 % — proces na 4 vláknech ukáže klidně 380, protože počítá na víc jádrech naráz.
  • %MEM — procento fyzické RAM, které proces drží.
  • RES (resident) — skutečná fyzická paměť, kterou proces právě zabírá. Tohle je číslo, které tě zajímá.
  • VIRT (virtual) — kolik paměti si proces naadresoval celkem (včetně věcí, co reálně v RAM nejsou — namapované soubory, rezervované bloky…). Bývá obrovské a samo o sobě není problém. Nedívej se na VIRT, dívej se na RES.

Užitečné klávesy uvnitř top:

P   # seřadí procesy podle %CPU (default)
M   # seřadí podle %MEM (kdo žere paměť)
q   # konec

🚩 Klasická past: vidíš proces s VIRT 12.5g a lekneš se, že sežral 12 GB. Podívej se vedle na RES — když je tam třeba 340m, reálně drží 340 MB. VIRT je jen „adresní prostor", ne obsazená RAM.


free -h — a proč „málo volné RAM" NENÍ problém

Tohle je nejčastější zbytečná panika v celém Linuxu. Nejdřív příkaz:

free -h        # -h = human readable (GB/MB místo bajtů)
#               total        used        free      shared  buff/cache   available
# Mem:           31Gi        6.0Gi       800Mi       200Mi        24Gi        24Gi
# Swap:         8.0Gi          0B       8.0Gi

Nováček uvidí free: 800Mi a zděsí se, že mu skoro došla paměť. Chyba. Podívej se na dvě čísla:

  • buff/cache: 24Gi — tolik RAM si Linux „půjčil" jako cache na zrychlení čtení z disku. Prázdná RAM je totiž promarněná RAM — tak proč ji nevyužít? Jakmile nějaký program potřebuje víc, Linux tuhle cache okamžitě uvolní. Nic tím netrpí.
  • available: 24Gi — kolik RAM je reálně k dispozici pro nové programy (volná + uvolnitelná cache). Tohle je jediné číslo, které tě zajímá.

Pravidlo: koukej na available, ne na free. Dokud je available slušné, máš paměti dost — i když free ukazuje skoro nulu. „Linux mi sežral RAM" je mýtus; on ji jen chytře využívá.

Skutečný problém s pamětí nastane, teprve když je available malé a začne se plnit swap.


Swap a swap thrashing

Swap je kus disku, který slouží jako nouzová RAM. Když dojde fyzická paměť, jádro odloží nejméně používané stránky na disk, aby uvolnilo místo. To je záchranná brzda — lepší než aby procesy padaly.

Problém je, že disk je řádově pomalejší než RAM. Když dojde paměť tak, že systém musí stránky neustále odkládat na disk a hned zase načítat zpátky, vznikne swap thrashing: CPU se skoro nudí, disk jede na 100 %, a celý stroj se táhne jako šnek — někdy i tak, že nejde ani přihlásit.

Jak thrashing poznáš:

free -h                 # Swap: used roste, available RAM u nuly
vmstat 1                # sloupce si (swap in) a so (swap out) jsou stále nenulové

Když ve vmstat vidíš trvale nenulové si/so, systém aktivně swapuje — to je varovný signál. Nárazové malé číslo je OK; trvalý proud dovnitř i ven znamená, že ti reálně došla RAM.


vmstat a iostat — kde je vlastně brzda

vmstat 1 — celkový přehled každou sekundu

vmstat 1       # nový řádek každou sekundu, ukončíš Ctrl+C

Sloupce, které stojí za pohled:

  • r — kolik procesů čeká na CPU (run queue). Trvale vyšší než počet jader → CPU-bound.
  • si / so — swap in/out. Nenulové trvale → došla paměť (thrashing).
  • us / sy — čas CPU strávený v uživatelských / systémových procesech.
  • waI/O wait: procento času, kdy CPU nedělá nic, protože čeká na disk. Vysoké wa je klasický příznak I/O-bound stroje.
  • id — idle, nečinnost CPU.

iostat -xz 1 — detail disků

iostat -xz 1   # z balíčku sysstat; -x = rozšířené, -z = skryj nečinná zařízení

Nejdůležitější sloupec je úplně vpravo:

  • %util — jak moc je disk vytížený. Blízko 100 % znamená, že disk je na plný plyn a je to úzké hrdlo (u SSD to není tak striktní jako u točivých disků, ale i tak je to signál).
  • r/s, w/s — čtení / zápisy za sekundu.
  • await — průměrná doba, kterou požadavek čeká (ms). Vysoké číslo = disk nestíhá.

Jak rozlišit bottleneck: CPU vs I/O vs paměť

Celé sledování výkonu se scvrkne na jednu otázku: na co se čeká? Rozhodni podle tabulky:

PříznakBottleneckKde to vidíš
Vysoký load, %CPU procesů vysoké, wa nízké, us/sy vysokéCPU-boundtop (P), vmstat sloupec r
Vysoký load, ale %CPU nízké, wa vysoké, disk %util u 100 %I/O-boundvmstat (wa), iostat (%util)
available RAM u nuly, swap used roste, si/so trvale nenulovépaměťově-boundfree -h, vmstat (si/so)

Zlaté pravidlo: vysoký load + nudící se CPU = disk (nebo síť), ne procesor. Kdyby brzdil procesor, byl by vytížený. Když je load vysoký a %CPU přitom nízké, hledej I/O wait nebo swap.


ps aux --sort=-%cpu — kdo za to může

top/htop jsou živé; když chceš jednorázový snímek nebo ho poslat do souboru/filtru, použij ps:

ps aux --sort=-%cpu | head        # top žrouti CPU (sestupně)
ps aux --sort=-%mem | head        # top žrouti paměti (sestupně)

--sort=-%cpu řadí sestupně (minus = od největšího). head ořízne na prvních pár řádků — přesně ty, co tě zajímají. Výhoda oproti top: dá se to nasypat do grep, uložit, poslat kolegovi.


Failure modes — časté omyly začátečníků

  • Panika z load bez kontextu jader. „Load je 6, hrůza!" — na 8jádrovém stroji je to pohoda, na 2jádrovém průšvih. Load vždy vztáhni k nproc, jinak nic neznamená.
  • „RAM je plná!" (ale je to jen cache). free ukazuje pár MB volných → panika. Přitom buff/cache je 20 GB a available taky. Cache se uvolní, až bude třeba. Koukej na available.
  • Zabíjení procesů naslepo místo měření. Stroj je pomalý, tak kill na cokoli velkého. Bez měření jen střílíš do tmy a klidně shodíš nevinný proces. Nejdřív změř (top, vmstat), pak jednej.
  • Ignorování I/O waitu. Díváš se jen na %CPU, vidíš, že se CPU nudí, a divíš se, proč to jede pomalu. Přitom wa je 60 % a disk na 100 % — úzké hrdlo je disk, ne procesor.
  • Nepoznaný swap thrashing. Stroj se zničehonic táhne jako smola, CPU idle, a ty nechápeš. Zapomněl jsi mrknout na swap — si/so ve vmstat jedou naplno, došla RAM.

🛠️ Cvičení

  1. Load vs jádra. Zjisti počet jader (nproc) a aktuální load (uptime). Spočítej podíl load ÷ jádra. Je tvůj stroj vytížený, nebo má rezervu? Kdyby stejný load měl stroj s polovinou jader, změnil by se závěr?
  2. Cache není obsazená RAM. Spusť free -h a najdi hodnoty free, buff/cache a available. Vysvětli vlastními slovy, proč je available mnohem větší než free a proč tě zajímá právě ono.
  3. Najdi největšího žrouta. Pomocí ps aux --sort=-%mem | head najdi proces, který drží nejvíc paměti. Pak si ho najdi v top (klávesa M) a porovnej jeho RES a VIRT. Které číslo je „skutečná" paměť a proč se liší?
  4. CPU-bound, nebo I/O-bound? Nech běžet vmstat 1 a mezitím zkus něco náročného (např. zkopíruj velký soubor, nebo pusť výpočet). Sleduj sloupce wa, us a r. Poznal bys z nich, jestli tě brzdí disk, nebo procesor?
  5. Trend load average. Podívej se na tři čísla load average v uptime a rozhodni, jestli zátěž roste, klesá, nebo je stabilní. Podle čeho to poznáš?
Náčrt řešení — rozbal, až si cvičení zkusíš sám
  1. Load vs jádranproc řekne počet jader (třeba 8), uptime load (třeba 4). Podíl 4 ÷ 8 = 0.5 → stroj využívá zhruba polovinu, má rezervu, pohoda. Na stroji se 2 jádry by byl podíl 4 ÷ 2 = 2 → dvojnásobek kapacity, přetíženo, procesy čekají ve frontě. Stejné číslo, opačný závěr — proto se load bez počtu jader neinterpretuje.
  2. Cache vs availablefree je RAM, kterou nikdo nedrží. buff/cache je RAM půjčená na diskovou cache — technicky „obsazená", ale kdykoli uvolnitelná. available = free + uvolnitelná cache, tedy kolik reálně dostane nový program. Proto je available větší než free a proto koukáš na něj: říká pravdu o tom, kolik paměti máš k dispozici. Pozor: nízké free samo o sobě není problém.
  3. RES vs VIRTRES je skutečná fyzická RAM, kterou proces právě drží; VIRT je celý naadresovaný prostor včetně věcí, co reálně v RAM nejsou (namapované soubory, rezervace). „Skutečná" paměť je RES. VIRT bývá mnohonásobně větší a nemá smysl se ho lekat — nedrží tolik fyzické paměti, jen si ji naadresoval.
  4. CPU vs I/O — sleduj vmstat 1: když roste us (userspace) a r (fronta na CPU) a wa je nízké → CPU-bound, brzdí procesor. Když je wa (I/O wait) vysoké, us nízké a disk v iostat u 100 % %util → I/O-bound, brzdí disk a CPU se nudí. Rozhodující je, jestli CPU pracuje, nebo jen čeká.
  5. Trend load — čísla jsou za 1/5/15 minut. Když klesají zleva doprava (např. 2.30, 1.05, 0.42 čteno jako 15→5→1 min klesá), špička odeznívá a zátěž klesá. Když 1min hodnota je výš než 15min, zátěž roste. Přibližně stejná tři čísla = stabilní vytížení. Krátkodobá (1 min) kolísá nejvíc, dlouhodobá (15 min) ukazuje trend.

🧠 Otázky & odpovědi

Co znamenají tři čísla v load average a jak je mám číst?

Jsou to průměrné počty procesů, které chtějí běžet, za poslední 1, 5 a 15 minut. Není to procento, je to počet — a smysl dostane až vydělený počtem jader. Load přibližně roven počtu jader znamená plně vytížený, ale stíhající stroj; výrazně vyšší znamená přetížení a čekání ve frontě. Tři čísla ukazují trend: klesající řada (od 15minutového k 1minutovému) znamená, že špička odeznívá, rostoucí že zátěž narůstá.

Proč load 4 může být v pohodě i katastrofa zároveň?

Protože load se musí vztáhnout k počtu jader. Load 4 na 8 jádrech znamená využitou zhruba polovinu kapacity — pohoda, rezerva je. Load 4 na 2 jádrech znamená dvojnásobek toho, co stroj zvládne naráz, takže procesy stojí ve frontě a latence roste — přetíženo. Úplně stejné číslo, opačný závěr. Proto se load nikdy nehodnotí, dokud nevíš, kolik má stroj jader (zjistíš příkazem nproc).

Linux mi ukazuje skoro nula volné RAM, mám problém?

Skoro jistě ne. Podívej se ve free -h na sloupec available, ne na free. Linux totiž využívá volnou RAM jako diskovou cache (sloupec buff/cache), protože prázdná paměť je promarněná paměť. Tahle cache se okamžitě uvolní, jakmile ji potřebuje nějaký program. Available ukazuje, kolik paměti je reálně k dispozici pro nové programy — a dokud je slušné, máš paměti dost, i když free je skoro nula. Skutečný problém nastane, teprve když je available malé a začne se plnit swap.

Stroj je pomalý, ale procesor se nudí. Čím to je?

Klasicky diskem nebo pamětí, ne procesorem. Když je load vysoký, ale %CPU procesů nízké, hledej dvě věci. Zaprvé I/O wait — ve vmstat 1 sloupec wa; když je vysoký a disk v iostat -xz 1 má %util blízko 100 %, jsi I/O-bound a CPU jen čeká na disk. Zadruhé swap thrashing — když available RAM je u nuly a sloupce si a so ve vmstat jsou trvale nenulové, došla paměť a systém se udře odkládáním na disk. V obou případech je úzké hrdlo mimo procesor.

Co je swap thrashing a jak ho poznám?

Swap je kus disku sloužící jako nouzová náhrada RAM. Když dojde fyzická paměť, jádro odkládá stránky na disk. Problém je, že disk je řádově pomalejší než RAM — a když systém musí stránky neustále odkládat a hned zase načítat zpátky, vznikne thrashing: CPU se nudí, disk jede na 100 % a celý stroj se táhne, někdy tak, že nejde ani přihlásit. Poznáš ho tak, že ve free -h je available RAM u nuly a swap used roste, a ve vmstat 1 jsou sloupce si a so trvale nenulové.