Vyčerpané místo je nejčastější příčina toho, proč server přestane fungovat bez jakéhokoli zlého úmyslu. Web vrací 500, databáze nezapisuje, pošta neodchází — a df -h přitom ukazuje několik volných gigabajtů. Projděme si tři případy, kdy k tomu dochází, a při té příležitosti i to, co je dobré vědět o SMART.

Případ první: došly i-uzly

Souborový systém drží dva omezené zdroje: místo pro obsah a záznamy o souborech. Druhý dochází nezávisle na prvním:

df -h
df -i

Pokud je u druhého příkazu IUse% rovno 100, jde o i-uzly. Místo je, ale nelze vytvořit ani jeden soubor, ani prázdný.

Viníci jsou vždy stejní: miliony drobných souborů. PHP sezení v /var/lib/php/sessions, kterým se rozbil úklid. Cache aplikace bez čištění. Zaseknutá poštovní fronta. Adresář s náhledy. Najdou se takto:

sudo find / -xdev -type f -printf '%h\n' 2>/dev/null | sort | uniq -c | sort -rn | head -20

Příkaz vypíše adresáře s největším počtem souborů. Na velkém systému běží několik minut — to je normální.

Případ druhý: soubor smazán, ale místo se nevrátilo

Zákeřnější situace. Někdo smazal příkazem rm nabobtnalý log, ale proces, který do něj zapisoval, ho stále drží otevřený. Soubor už v adresáři není, místo zůstává obsazené, a tak to bude až do restartu procesu.

sudo lsof +L1

Příkaz ukáže soubory bez odkazů v souborovém systému, které přesto drží nějaký proces. Léčí se to restartem nebo měkkým znovunačtením onoho procesu, ne hledáním „kam se poděly gigabajty“.

Odtud pravidlo: nabobtnalý log se nemaže, ale nuluje — otevřený deskriptor pak zůstane funkční:

sudo truncate -s 0 /var/log/huge.log

A hned poté se nastaví rotace, jinak se za týden vše zopakuje.

Případ třetí: sežraly to logy

Kam přesně místo šlo, je vidět při sestupu po úrovních:

sudo du -x -h --max-depth=1 / | sort -h
sudo du -x -h --max-depth=1 /var | sort -h

Přepínač -x nedovolí sestoupit do jiných souborových systémů; bez něj se počítání zavrtá do /proc a do připojených síťových prostředků. Pohodlnější je to všechno dělat v ncdu, pokud je k dispozici.

Obvyklí žrouti:

  • journald. Rozhodne jediný příkaz: journalctl --disk-usage. Omezuje se řádkem SystemMaxUse=500M v /etc/systemd/journald.conf, jednorázově čistí journalctl --vacuum-size=200M;
  • logy bezpečnostních nástrojů. Suricata s výchozí konfigurací zapisuje třicet typů událostí a rotaci po sobě nenastavuje — na skutečném serveru z toho bylo 15 GB za dva dny. Totéž se stává s audit.log a s ladicími logy nginxu;
  • zálohy ukládané na tentýž disk a nikdy nemazané;
  • cache aptuapt clean občas vrátí pár gigabajtů.

Zvlášť o /boot

Malý oddíl, který zaplňují stará jádra. Sám o sobě web nepoloží, zato zcela zastaví aktualizace: nové jádro se nenainstaluje a za ním stojí celá fronta balíčků. Léčí se to příkazem apt autoremove --purge a předchází zapnutím automatického mazání nepoužívaných jader v nastavení automatických aktualizací.

SMART: které atributy mají význam

Hned výhrada: na virtuálním serveru bývá SMART nedostupný — disk je virtuální a fyzický pod ním není vidět. Není to porucha, prostě nejsou data. Vše následující se týká dedikovaných serverů a vlastního hardwaru.

sudo smartctl -a /dev/sda

Řádek SMART overall-health self-assessment test result: PASSED není důvod ke klidu: zůstává zelený prakticky až do poruchy. Dívat se je třeba na konkrétní čítače:

  • 5, Reallocated_Sector_Ct — přemapované sektory. Nenulová hodnota znamená, že disk se už sype; roste-li v čase — vyměnit bez odkladu;
  • 197, Current_Pending_Sector — nečitelné sektory čekající na rozhodnutí. Nejznepokojivější ze všech: obvykle znamená, že část dat už zachránit nelze;
  • 198, Offline_Uncorrectable — totéž, potvrzené kontrolou;
  • SSD: Percentage Used / Media_Wearout_Indicator — vyčerpaná zápisová životnost. Předvídatelná veličina, podle níž se plánuje výměna.

Naopak teplota a hodiny provozu samy o sobě neříkají nic: disk s pěti lety provozu a nulovými čítači chyb je spolehlivější než nový s jedničkou v atributu 197.

Smysl sledování

Vše výše uvedené je reakce na to, co se už stalo. Přitom jak zaplňování disku, tak opotřebení SSD jsou pomalé a naprosto předvídatelné procesy: graf obsazenosti za dva týdny ukáže datum, kdy místo dojde, dávno předtím, než se to stane. Rozdíl mezi „web leží od tří ráno“ a „ve čtvrtek je třeba vyčistit logy“ je jen v tom, mít číslo před očima. Jak to vypadá jako celek, ukazuje ukázková stránka níže.