Pokud jste si koupili zbrusu nový SSD disk a přinesli jste si ho nadšeně domů, měli byste před jeho zapojením do počítače znát některá specifika používání těchto zařízení. SSD disk je sice z venčí podobný klasickému disku, připojuje se ke stejnému rozhraní a z hlediska počítače se chová stejně, přesto je tu několik nenápadných „pastí“. Ty sice nejsou vidět na první ani druhý pohled, ale pokud o nich nevíte, nemusí váš disk podávat stoprocentní výkon nebo bude mít nižší životnost.
Následující řádky by vám měly tyto nové problémy objasnit a zároveň se dozvíte, jak je jednoduše a efektivně vyřešit. Nejprve se ale budeme muset seznámit trochu víc s principem SSD.
SSD jako řada bloků
SSD pracuje jinak. To asi není pro většinu z vás překvapením, přesto si musíme ujasnit některé detaily z jeho principu. Především pracuje s podstatně většími bloky než rotační disky (dále HDD). Zatímco ten dokáže přečíst a zapsat samostatně kterýkoliv sektor (obvykle 512 B, nověji 4096 B), SSD disky pracují s podstatně většími bloky, které bývají velké 512 KB.
Pokud jste někdy pracovali s paměťmi typu EPROM nebo EEPROM, znáte jejich největší nevýhodu – daly se mazat jen jako celek. Zapisování probíhalo po bitech, ale pokud jste chtěli něco vymazat, museli jste čip vystavit ultrafialovému záření (EPROM) nebo většímu napětí (EEPROM) a paměť se vymazala celá. Pak mohl nastat nový zápis.
Podobným způsobem fungují i dnešní SSD disky, jen se nepracuje s celou pamětí, ale s už zmíněnými bloky. Pokud je blok prázdný, je možné do něj libovolně zapisovat. Pokud je ale třeba něco „přepsat“, musí se celý blok načíst do mezipaměti, resetovat a poté znovu s úpravou zapsat.
Interní práce s velkými bloky dat přináší problémy i při čtení. Pokud se totiž načítaná data nacházejí na dvou sousedních blocích, je třeba přečíst oba bloky a počítači předat třeba jen žádaných několik set bajtů. Efektivita celé práce se tak zhoršuje, protože kvůli několika kilobajtům musel disk uvnitř přečíst třeba i megabajt dat.
Většina problémů s SSD disky vychází právě z tohoto principu. Existují ovšem postupy, které snižují dopad různých problémů na minimum.
Zarovnání oddílu
Při pořízení nového SSD disku je třeba vytvořit na něm správně oddíly. To je potřeba udělat tak, aby geometrie oddílů odpovídala geometrii disku. Tedy aby jednotlivé bloky zapadaly do fyzických bloků, se kterými pracuje interně disk.
Přestože při použití LBA se již nepoužívá adresování pomocí cylindrů, hlaviček a sektorů, Linux stále tuto adresaci interně používá. U klasických rotačních disků se pomocí cylindrů volí radiální pozice nosiče hlav, označením hlavy se vybírá plotna a sektor pak určuje axiální polohu hlavy při čtení. Toto už u SSD nemá žádný praktický význam, my toho ovšem využijeme pro správné vytvoření oddílu.
Našim cílem je zajistit, aby oddíl ležel na celých násobcích velikosti interních SSD bloků. Při práci s fdiskem proto zvolíme, aby oddíly měly 32 sektorů na stopu a počítalo se se 32 diskovými hlavičkami.
# fdisk -S 32 -H 32 /dev/sda
Jeden cylindr tak bude mít 1024 bajtů, a protože fdisk rozděluje disky v násobcích 512 cylindrů, budou nám vycházet ideálně velké bloky. Poté si vytvořte oddíly tak, jak jste zvyklí.
Ujistěte se ještě, že první oddíl začíná na sektoru dělitelném číslem 512. Fdisk se vás při tvorbě oddílu na první sektor zeptá, ale můžete to ověřit i zpětně ve výpisu:
# fdisk -lu /dev/sda
Zarovnání souborového systému
Když máme správně zarovnány oddíly, je čas vytvořit si souborový systém. Pro něj platí stejná pravidla a problémy, o jakých jsme už mluvili. Dnes se běžně pracuje s 4KB sektory, ale SSD disk pracuje vždy s 512 KB bloky. Mohli bychom sice sektory jednoduše zvětšit na 512 KB, ale tím bychom neuvěřitelně plýtvali místem, protože každý soubor by pak měl nejméně 512 KB a jeho velikost by se vždy pohybovala v násobcích této hodnoty.
Výhodnější je, dodržet opět pravidlo o násobcích a vytvořit souborový systém tak, aby se „vešel“ do připravených bloků. Při tvorbě souborového systému tedy postupujeme takto:
# mke2fs -t ext4 -E stripe-width=128 /dev/sda1
Jelikož souborový systém ext4 používá standardně 4KB sektory, dosáhneme zarovnání na 512KB, což je kýžený stav. Některé nové distribuce už s SSD disky pracují, takže toto zarovnání provedou samy. Pokud ale budete využívat služeb standardního instalátoru, ověřte si, zda touto schopností už vládne.
TRIM a klesající výkon
O problematice TRIM jsem už psal v článcích Proč u SSD disků používáním klesá výkon a SSD disky ničí důkazní materiály a špatně mažou soubory, proto jen stručně. Už víme, že SSD disk nedokáže přímo přepisovat data, ale musí mazat celé bloky. To je časově poměrně náročná záležitost. Je proto výhodné, když má disk „v zásobě“ prázdné bloky, do kterých může přímo psát.
Těchto bloků ale s použitím disku neustále ubývá, neboť disk nemá žádné informace o tom, které soubory jsou na souborovém systému označené jako smazané. Souborové systémy totiž kvůli úspoře času data skutečně nemažou, ale jen si poznamenají, že bloky jsou volné a bude je možno v budoucnu využít. Z hlediska disku jsou tyto neužitečné bloky stále plné dat a není možné s nimi manipulovat.
Vzniklo proto rozšíření ATA protokolu zvané TRIM, které dovoluje operačnímu systému, aby disk informoval o tom, že konkrétní bloky už považuje za nepotřebné a disk si je může „smazat do zásoby“. Když pak přijde požadavek na další zápis či změnu dat, disk má prostor, kam může vše rychle zapsat a zapamatovat si, že nová data leží na novém místě.
Pro podporu TRIM v Linuxu je potřeba mít jádro 2.6.33 (únor 2010) a pokud i váš disk TRIM umí, mělo by být možné jej aktivovat. Do /etc/fstab
je třeba k příslušnému řádku přidat parametr discard
. Řádek pak bude vypadat asi takto:
/dev/sda1 / ext4 discard,defaults 0 1
Po restartu se můžete podívat, zda má systém TRIM aktivní. Stačí prohlédnout výstup hdparm
a hledat hvězdičku před příslušným řádkem:
# hdparm -I /dev/sda|grep TRIM * Data Set Management TRIM supported
Nikdy ale není na škodu ověřit pro jistotu funkčnost reálným testem. Postup je jednoduchý: vytvoříme si soubor, přečteme si nízkoúrovňově příslušné sektory na disku, pak soubor smažeme a přečteme si sektory znovu. Pokud data skutečně z disku zmizela (výstupem druhého čtení jsou nuly), pak TRIM zafungoval a disk nepotřebný sektor promazal.
Zjištění počátečního sektoru (položka begin_LBA
) souboru:
# hdparm --fibmap testovacisoubor
Přečtení dat z příslušného místa disku:
# hdparm --read-sector [doplňte zjištěnou adresu] /dev/sda
Po smazání souboru pro jistotu ještě vyprázdněte cache pomocí příkazu sync
a chvíli počkejte (stačí pár sekund). Poté by měl být výstup prázdný – data jsou zlikvidována.
Méně zápisů a vyšší výkon
Často skloňovanou nevýhodou SSD disků je omezený počet zápisů, který dokáží snést. Tato vlastnost je stále dokola omílána a je jakýmsi tajemným zaklínadlem všech, kteří brojí proti nasazení SSD. Faktem je, že starší MLC čipy vydržely jen asi 10 000 zapisovacích cyklů, lepší SLC pak 100 000. Dnešní SSD disky ale vydrží až 5 milionů zápisů.
Disky navíc používají takzvaný wear leveling, což je technika, při kterém se fyzické sektory interně mapují na logické, tedy ty, které vidí operační systém. To umožňuje disku rovnoměrně přenášet zátěž na všechny buňky na disku. I když tedy stokrát přepíšeme jeden sektor, interně se bude místo zápisu stále měnit a disk si bude pamatovat, kde leží aktuální data. Ve skutečnosti tak nepřepíšeme jediný bajt. Životnost disků je tak poměrně vysoká.
Příklad: Mějme dnešní běžný disk s kapacitou 64 GB a dvěma miliony bezproblémových zápisů. Pokud bychom na takový disk trvale hrnuli data rychlostí 80 MB za sekundu, trvalo by dosažení jeho funkčního limitu 50 let (zdroj). I kdyby byla reálně tato hodnota pětkrát nebo desetkrát nižší, stále ještě jsme daleko od chvíle, kdy bychom se měli začít obávat. Navíc nikdo nepřepisuje trvale disk několik let v kuse.
Přesto existuje několik metod, které nám pomohou množství zápisů na disk snížit. Krátce si ještě popíšeme některé z nich a přidáme i pár rad k vyššímu výkonu.
Parametr noatime
Za normálních okolností si souborový systém poznamenává časy posledních přístupů k souborům. Výrazně ušetříme SSD práci, pokud tuto funkci vypneme. Do /etc/fstab
stačí připsat parametr noatime
:
/dev/sda1 / ext4 discard,defaults,noatime 0 1
Přemístění /tmp do paměti
Největší pohyby na disku se odehrávají v adresáři /tmp
, kam si jednotlivé aplikace odkládají dočasné soubory. Běžně se jedná o data, která mají platnost několik sekund a je proto zbytečné, aby se skutečně ukládala na disk. Můžeme tedy vytvořit ramdisk, který do adresáře připojíme. Opět stačí upravit /etc/fstab
:
none /tmp tmpfs nodev,nosuid,noatime,size=512M,mode=1777 0 0
Všimněte si, že součástí řádku je i velikost. Jedná se o maximální velikost takto vytvořeného ramdisku. Nemusíte se bát, že by ramdisk automaticky ukousl zvolenou velikost. Je to jen ochrana proti přeplnění.
Přemístění cache Firefoxu do paměti
Pokud používáte webový prohlížeč Firefox, můžete disku výrazně ušetřit práci tím, že cache prohlížeče přemístíte do adresáře /tmp
, který jsme si už namapovali do ramdisku. Dočasné soubory tak budou v dočasném adresáři a nebudou zbytečně často přepisovány na disku.
Pro tuto změnu vstupte do pokročilé konfigurace na URL about:config
a vytvořte nový klíč browser.cache.disk.parent_directory
s hodnotou /tmp
. Pokud máte v počítači více uživatelů, proveďte tuto změnu u každého z nich zvlášť.
Vypnutí výtahu
Ve standardním režimu používá jádro k optimalizaci práce s diskem takzvaný elevator (česky výtah). Ten řadí požadavky za sebe tak, aby dokázal obsloužit co nejefektivněji plochu disku ve správném pořadí (jako výtah patra pěkně po sobě). V případě rotujících disků s relativně vysokou dobou vystavení hlaviček to má smysl, u SSD disků je to ale zbytečné, protože u nich je jedno, v jakém pořadí s daty pracujeme. V takovém případě jen elevator snižuje výkon a nepřináší žádnou výhodu. Vypneme ho proto pomocí zavaděče (čtěte článek o ovládánu Grub 2) tak, že jádru předáme parametr elevator=noop
.
Vypnout žurnál nebo ne?
Mnoho uživatelů se při pořízení SSD zabývá otázkou žurnálování. Na mnoha fórech se také můžete dočíst, že ext4 je kvůli žurnálu pro SSD nevhodný a je lepší použít starší ext2. Stále ovšem platí, že při vypnutí žurnálu se vystavujete riziku poškození souborového systému v případě, že dojde k náhlému výpadku. V nejhorším případě tak můžete přijít o data.
Odpověď na otázku není možné dát bez toho, aniž bychom věděli, jak moc je žurnálování náročné a kolik přidělává disku práci. Jaderný vývojář Ted Tso před časem provedl reálné testy, podle kterých i při tak velké akce, jakou je překlad jádra, nezvyšuje žurnál množství zápisů více než o několik procent. Nejnáročnější byl během měření proces make clean
, při kterém se počet zápisů zdvojnásobil. Je to ale logické – jde o pouhé mazání souborů a samotné smazání je tak malá operace, že je datově stejně nenáročná jako zápis do žurnálu. V relativních číslech jde tedy sice o nárůst o polovinu, ale z velmi malého čísla (místo 4 MB se zapsalo 7 MB).
Z měření tedy plyne, že zátěž způsobovaná žurnálem není při běžné práci nijak dramatická a není důvod se jí příliš zabývat. Je výhodnější oželet několik zapsaných kilobajtů navíc než přijít o bezpečí, které nám žurnál nabízí.