Z Windows na Linux, část 2.: optimalizace pro výkon a životnost SSD [blog]

27. 3. 2015

Sdílet

 Autor: Redakce

Soubor /etc/fstab

Soubor /etc/fstab určuje, do jakého uzlu ve stromu adresářů je připojen který diskový oddíl. Pokud při jeho editaci něco pokazíte, systém vám nenastartujte. Kromě obligátní zálohy před úpravami tedy mějte po ruce bootovatelný (live) USB disk nebo DVD, s jehož pomocí můžete v případě nutnosti soubor opravit.

O struktuře a základních nastaveních lze najít spoustu informací, například zde (je to sice wiki distribuce Arch Linux, zrovna toto je ale společné všem distribucím), takže to popisovat nebudu a vrhnu se rovnou na méně známá nastavení (sekce options).

Povolení trimu

Funkce trim má příznivý vliv jak na rychlost SSD (při zápisu), tak na jeho opotřebení. V Linuxu ale bohužel standardně není zapnutý, oficiálně proto, že toto nastavení není důkladně otestováno na širokém spektru disků. Změna je tedy na vlastní nebezpečí, jako ostatně asi všechno v Linuxu.

Povolit jej můžete v /etc/fstab možností discard. V takovém případě budou sektory po smazaných souborech čištěny ihned po smazání, což při mazání většího počtu souborů snižuje výkon. Namísto toho se doporučuje spouštět příkaz trim v pravidelných intervalech, například jednou denně. Návod najdete zde (ještě před naplánováním úlohy ověřte, že příkaz sudo fstrim -v / funguje a nezpůsobí pád operačního systému).

Sluší se dodat, že Ubuntu 14.04 toto dělá automaticky (jednou týdně), ale pouze na SSD značek Intel a Samsung.

Zaznamenávání posledního přístupu k souboru

Ve starých verzích linuxového jádra (do roku 2009) se ve výchozím nastavení zaznamenával čas posledního přístupu při každém čtení. Co jedno přečtení, to jeden zápis na disk. Možnost se tehdy nazývala atime, to však po novu funguje jako synonymum pro relatime (viz dále). Je-li takové chování žádoucí, lze jej vynutit nastavením strictatime.

relatime  je v současné době výchozím nastavením. Zapisuje čas posledního přístupu pouze tehdy, je-li poslední záznam starší než 24 hodin, nebo byl soubor od posledního přístupu změněn.

noatime informaci o času posledního čtení nezapisuje vůbec a je tak k SSD nejšetrnější. Existuje také možnost nodiratime, která působí stejným způsobem, ale pouze na složky; je to podmnožina noatime, takže je zbytečné nastavovat obojí naráz (ničemu to ale nevadí).

Žurnálování a kompromisy mezi výkonem a integritou

Většina distribucí dnes ve výchozím nastavení používá souborový systém ext4 (některé progresivnější už přecházejí na novější btrfs). Nastavení zde uvedená jsou určena pro tento filesystém a v jiných nemusí fungovat. ext4 je žurnálovací souborový systém, což znamená, že kromě samotných dat se na disk zapisuje ještě žurnál – historie toho, co se daty dělo. Žurnálování pochopitelně znamená zápisy navíc a proto je častou obětí optimalizací. Při standardních operacích a s volbou noatime žurnálování zvyšuje objem zapsaných dat o zhruba 4 % (měření najdete na blogu kernelového vývojáře Theodora Ts'o), takže zvažte, zdali to za to stojí – dle mého názoru spíše ne. Žurnálování zvyšuje odolnost souborového systému proti chybám, které asi nejčastěji vznikají při náhlém výpadku napájení nebo vypnutí „natvrdo“, ale způsobit je mohou i závady samotného disku, operační paměti nebo poškozený datový kabel.

Deaktivaci žurnálu nelze provádět za běhu, takže budete potřebovat v úvodu zmíněné bootovatelné médium. Dotyčný oddíl odpojte (umount) a spusťte:

sudo tune2fs -O ^has_journal /dev/sdxY

Poté oddíl zkontrolujte příkazem fsck.

Alternativou je žurnál ponechat a pouze přepnout na rychlejší způsob. Žurnálování má tři možné režimy, v souboru fstab reprezentované volbami data=journal (žurnáluje se obsah souboru i metadata), data=ordered (výchozí nastavení, žurnálují se pouze metadata) a data=writeback, který taktéž žurnáluje pouze metadata, ale umožňuje zapisovat obsah souboru až po metadatech. Díky tomu lze dosáhnout o něco větší rychlosti a je zachována integrita souborového systému, ale při výpadku napájení se může stát, že v souboru zůstanou stará data.

Toto nastavení je třeba provést na třech místech:

  • doplnit data=writeback do /etc/fstab,
  • spustit sudo tune2fs -o journal_data_writeback /dev/sdxY (bez toho by systém odmítl nabootovat, protože nastavení v fstab by nesouhlasilo se skutečným nastavením souborového systému),
  • a nakonec ještě upravit soubor /etc/default/grub a následujícího řádku připsat tučnou část:
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash rootflags=data=writeback"

Na závěr je tu ještě volba commit, s níž můžete v /etc/fstab specifikovat, jak dlouho mohou být držena v paměti nezapsaná data. Výchozí nastavení je commit=5, což znamená, že změny jsou zapisovány na disk každých pět vteřin. Prodloužením intervalu lze ušetřit nějaké zápisy na SSD, ale v případě výpadku napájení o nezapsaná data přijdete. Pokud se nacházíte v oblasti s nespolehlivými dodávkami elektřiny, jako jsou země třetího světa nebo Jižním město, na stolních počítačích bez UPS nedoporučujeme interval příliš zvyšovat. Zajímavější je to na noteboocích, kde můžete mechanický disk nechat uspávat a pro zapsání změn jej probouzet třeba jednou za půl hodiny nebo hodinu.

Ramdisk pro dočasné soubory

Některé zdroje také doporučují přidat do /etc/fstab následující tři řádky:

tmpfs /tmp       tmpfs defaults,noatime,mode=1777,size=20% 0 0
tmpfs /var/tmp   tmpfs defaults,noatime,mode=1777 0 0
tmpfs /var/spool tmpfs defaults,noatime,mode=1777 0 0

Tímto jsou složky dočasných souborů připojeny do ramdiskových oddílů, jejichž maximální velikost můžete nastavit buď v kilo/mega/gigabajtech (např. size=1536m) nebo jako procento velikosti operační paměti (výchozí nastavení je 50 %). Opět tedy ušetříte nějaké zápisy na SSD a při intenzivním využívání dočasných souborů můžete zaznamenat i vyšší výkon. Ovšem pozor – složka /tmp je někdy využívána aplikacemi, které předpokládají, že si tam mohou beztrestně odložit třeba několik gigabajtů dat. Dojde-li místo na systémovém disku, aplikace spadne a soubory můžete promazat, ale dojde-li kapacita operační paměti a oddílu swap, spadne celý systém. Na strojích s menší operační pamětí je tedy na místě opatrnost.

Bonuz pro kikoťi: nastavení scheduleru

Trochu výkonu navíc můžete z diskového subsystému vytřískat také správným nastavením scheduleru, tedy algoritmu, který rozhoduje o pořadí vykonávání příkazů ke čtení a zápisu na disk.

Aktuálně používaný scheduler pro daný disk získáte příkazem: cat /sys/block/sdx/queue/scheduler
Výstup bude vypadat takto: noop [deadline] cfq

K dispozici tedy máme tři schedulery (ve starších verzích uvidíte ještě čtvrtý, anticipatory, který byl odstraněn, protože deadline nebo cfq nabízely všeobecně lepší výkon), v hranatých závorkách je ten aktuálně používaný. V Linuxu Mint 17.1 je deadline výchozí pro SSD i HDD.

Babské moudro praví, že pro SSD jsou vhodné schedulery noop (příkazy vykonává v pořadí, v jakém přijdou) nebo deadline (dává vyšší prioritu čtení, čímž zlepšuje responzivitu systému při velkých objemech zápisu) a naproti tomu cfq (zkratka pro Completely Fair Queuing, přiděluje procesům a uživatelům časové sloty) se hodí pro mechanické pevné disky. Realita je bohužel o něco složitější. V souboru testů, které provedl server Phoronix, v průměru nejlepších výsledků na dvou sestavách s SSD dosáhl jako na potvoru právě cfq. Ideální nastavení tak bude záležet především na využití.

Pro změnu nestačí sudo, ale je nutné být opravdu root (sudo su). Provedete ji následujícím příkazem (tento nastaví scheduler cfq na disku /dev/sdx).

bitcoin_skoleni

echo cfq > /sys/block/sdx/queue/scheduler

Pro tentokrát je to vše. Rovnou vás trochu navnadím na příští díl: za téma jsem si zvolil zlepšování vykreslování písem a sám jsem zvědavý, co objevím. Do té doby na shledanou.