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
4je 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.5ga lekneš se, že sežral 12 GB. Podívej se vedle naRES— když je tam třeba340m, 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.
- wa — I/O wait: procento času, kdy CPU nedělá nic, protože čeká na disk. Vysoké
waje 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říznak | Bottleneck | Kde to vidíš |
|---|---|---|
Vysoký load, %CPU procesů vysoké, wa nízké, us/sy vysoké | CPU-bound | top (P), vmstat sloupec r |
Vysoký load, ale %CPU nízké, wa vysoké, disk %util u 100 % | I/O-bound | vmstat (wa), iostat (%util) |
available RAM u nuly, swap used roste, si/so trvale nenulové | paměťově-bound | free -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).
freeukazuje pár MB volných → panika. Přitombuff/cacheje 20 GB aavailabletaky. Cache se uvolní, až bude třeba. Koukej naavailable. - Zabíjení procesů naslepo místo měření. Stroj je pomalý, tak
killna 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řitomwaje 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/sovevmstatjedou naplno, došla RAM.
🛠️ Cvičení
- Load vs jádra. Zjisti počet jader (
nproc) a aktuální load (uptime). Spočítej podílload ÷ 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? - Cache není obsazená RAM. Spusť
free -ha najdi hodnotyfree,buff/cacheaavailable. Vysvětli vlastními slovy, proč jeavailablemnohem větší nežfreea proč tě zajímá právě ono. - Najdi největšího žrouta. Pomocí
ps aux --sort=-%mem | headnajdi proces, který drží nejvíc paměti. Pak si ho najdi vtop(klávesaM) a porovnej jehoRESaVIRT. Které číslo je „skutečná" paměť a proč se liší? - CPU-bound, nebo I/O-bound? Nech běžet
vmstat 1a mezitím zkus něco náročného (např. zkopíruj velký soubor, nebo pusť výpočet). Sleduj sloupcewa,usar. Poznal bys z nich, jestli tě brzdí disk, nebo procesor? - Trend load average. Podívej se na tři čísla load average v
uptimea 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
- Load vs jádra —
nprocřekne počet jader (třeba 8),uptimeload (třeba 4). Podíl4 ÷ 8 = 0.5→ stroj využívá zhruba polovinu, má rezervu, pohoda. Na stroji se 2 jádry by byl podíl4 ÷ 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. - Cache vs available —
freeje RAM, kterou nikdo nedrží.buff/cacheje RAM půjčená na diskovou cache — technicky „obsazená", ale kdykoli uvolnitelná.available= free + uvolnitelná cache, tedy kolik reálně dostane nový program. Proto jeavailablevětší nežfreea proto koukáš na něj: říká pravdu o tom, kolik paměti máš k dispozici. Pozor: nízkéfreesamo o sobě není problém. - RES vs VIRT —
RESje skutečná fyzická RAM, kterou proces právě drží;VIRTje celý naadresovaný prostor včetně věcí, co reálně v RAM nejsou (namapované soubory, rezervace). „Skutečná" paměť jeRES. VIRT bývá mnohonásobně větší a nemá smysl se ho lekat — nedrží tolik fyzické paměti, jen si ji naadresoval. - CPU vs I/O — sleduj
vmstat 1: když rosteus(userspace) ar(fronta na CPU) awaje nízké → CPU-bound, brzdí procesor. Když jewa(I/O wait) vysoké,usnízké a disk viostatu 100 %%util→ I/O-bound, brzdí disk a CPU se nudí. Rozhodující je, jestli CPU pracuje, nebo jen čeká. - 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é.
