Moje odkazy
vydáno: 13. 8. 2023 12:18, aktualizováno: 25. 8. 2023 00:00
Na chvíli jsem se teď na hlavní pracovní stanici po letech se SSD vrátil k čistě rotačním diskům (HDD), protože jsem si potřeboval udělat pořádek v datech a soubory se přeci jen rychleji přesouvají v rámci jednoho souborového systému (i když je na pomalém HDD) než mezi více oddíly nebo fyzickými disky. A dostatečnou kapacitu jsem měl jen na HDD. Původní plán byl, že soubory roztřídím podle toho, jak a jak často s nimi pracuji a umístím na různě rychlé disky (v počítači jsem měl kombinaci asi šesti různých SSD a HDD disků). Úklid sice celkem úspěšný byl, ale navrhnout rozdělení souborů na různě rychlá úložiště bylo složitější. Buď bych to musel řídit ručně a mít data na více souborových systémech (původní stav jen s lépe rozmístěnými soubory) nebo si softwarově vytvořit hybridní disk (ty se prodávaly v dobách, kdy flash paměti byly drahé na to, aby se z nich poskládal celý disk – šlo o HDD+SSD v jednom SATA disku, kde SSD sloužilo jako rychlá cache pro HDD). To se dá postavit nad bcache, dm-cache, Flashcache atd. Ale protože to pracuje na úrovni blokového zařízení, nejde říct, kde mají které soubory být a funguje to automaticky. Problém je v tom, že systém neví, které soubory potřebuji číst rychle (byť třeba jednou za dlouho) a u kterých je mi to jedno (i když je můžu číst relativně často).
Nakonec jsem usoudil, že 4 TB M.2 NVMe disky už nejsou tak drahé a nejlepší a zároveň nejjednodušší bude mít všechna data na rychlém SSD/NVMe zařízení. Zároveň se ale nechci vzdát bezpečí zrcadleného pole (RAID 1). V tomto článku si tedy ukážeme, jak složit diskové pole z více různě rychlých zařízení a jak mu říct, že má číst přednostně z těch rychlých.
Pro záznam uvádím přibližné ceny vybraných SSD a HDD (koncové ceny včetně DPH, srpen 2023):
Název | Typ | Rozhraní | Kapacita | Cena |
WD BLACK SN850X NVMe | TLC SSD | M.2 NVMe | 4 TB | 8 200 Kč |
Kingston NV2 4TB | QLC SSD | M.2 NVMe | 4 TB | 4 700 Kč |
Samsung 870 EVO 4TB | TLC SSD | SATA | 4 TB | 6 000 Kč |
Samsung 980 PRO 1TB | TLC SSD | M.2 NVMe | 1 TB | 1 800 Kč |
WD Gold 4TB | CMR HDD, 256 MB cache, 7 200 rpm | SATA | 4 TB | 3 900 Kč |
WD Red Plus 4TB | CMR HDD, 256 MB cache, 5 400 rpm | SATA | 4 TB | 2 300 Kč |
Seagate BarraCuda 4TB | SMR HDD, 256 MB cache, 5 400 rpm | SATA | 4 TB | 1 900 Kč |
WD Black 1TB | CMR HDD, 64 MB cache, 7 200 rpm | SATA | 1 TB | 2 300 Kč |
Výchozí stav je, že máme softwarové (MD) diskové pole RAID 1 (zrcadlení) složené ze dvou 4 TB HDD a k tomu jsme přikoupili nový 4 TB NVMe disk. Pole jsem vytvářel už dřív a vzniklo asi nějak takto:
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sd[ab]1
Běžné M.2 NVMe (na rozdíl od serverových U.2/U.3) nepodporují hot-swap, takže počítač musíme vypnout, nainstalovat NVMe disk do slotu na desce nebo do PCIe adaptéru a zase nastartovat systém. Potom už budeme dělat vše za chodu a bez dalších restartů – s počítačem se dá během toho normálně pracovat.
Po znovu-naběhnutí systému ověříme, že nový disk byl správně detekován:
nvme list # příkaz z balíčku nvme-cli
dmesg | grep -i nvme # nebo jen prohledáme log
ls -l /dev/nvme* # nebo se podíváme do /dev
lsblk # výpis všech blokových zařízení
n.b. předpokladem je, že nový disk je minimálně stejně velký jako ty původní.
Na novém NVMe vytvoříme stejné oddíly jako jsou na HDD. Používám k tomu příkaz parted
a aby byl výsledek na bajt stejný, přepnu si jednotky pomocí unit b
. Já mám na těchto discích vždy tři oddíly a celkem dvě pole, ale zde budeme pro jednoduchost předpokládat, že máme na každém jen jeden oddíl a dohromady jedno pole.
Přidáme nový disk do pole a zároveň zvýšíme celkový počet zařízení ze dvou na tři:
mdadm --grow /dev/md0 --add /dev/nvme0n1p1 --raid-devices=3
Pokud máme v plánu jeden HDD odebrat, vynecháme --raid-devices=3
. Já jsem si zatím nechal aktivní všechny tři disky: 2×HDD + 1×NVMe. Také je možnost nechat jeden HDD jako tzv. spare tzn. záložní disk, který se automaticky použije v případě selhání aktivního disku (to je dobré hlavně u serverů, kde při poruše nemusíme hned spěchat s novým diskem do datového centra a pole se opraví samo).
alias mdstat='cat /proc/mdstat' # alias pro sledování stavu pole
Synchronizace pole bude trvat několik hodin v závislosti na velikosti disků a rychlosti čtení z HDD. Po tu dobu bude počítač zpomalený – až synchronizace doběhne, změříme rychlost jednotlivých disků:
hdparm -t /dev/sda hdparm -t /dev/sdb hdparm -t /dev/nvme0n1 hdparm -t /dev/md0
HDD budou mít rychlost řádově 200 MB/s zatímco NVMe víc než patnáctkrát víc, přes 3 000 MB/s a hlavně budou mnohem lepší v náhodném přístupu a paralelismu (tam je významné zlepšení i oproti SATA SSD). Při čtení z pole RAID 1 pak budeme dostávat střídavě vysoká i nízká čísla, podle toho, z kterého disku se zrovna Jádro rozhodlo číst. Zápis na RAID 1 obecně odpovídá nejpomalejšímu disku v poli a čtení se pohybuje někde mezi nejrychlejším a nejpomalejším. Při paralelním čtení z více procesů či vláken dosáhneme teoreticky součtu rychlostí čtení ze všech disků pole.
NVMe jsme ale přidávali do pole proto, abychom měli vyšší rychlost vždy a ne jen při každém druhém či třetím čtení. Proto je potřeba poli říct, že některé disky má používat hlavně pro zápis (HDD) tzn. číst přednostně z těch ostatních (NVMe). To se dá nastavit parametrem --write-mostly
příkazu mdadm
nebo zápisem do virtuálního souboru v sysfs
:
echo writemostly > /sys/block/md0/md/dev-sda1/state # zapneme režim write-mostly
echo -writemostly > /sys/block/md0/md/dev-sda1/state # vypneme režim write-mostly
Aktuální stav zjistíme vypsáním těchto virtuálních souborů nebo příkazem mdadm --detail /dev/md0
.
$ cat /sys/block/md*/md/dev-sd*/state in_sync,write_mostly in_sync,write_mostly in_sync,write_mostly in_sync,write_mostly $ cat /sys/block/md*/md/dev-nvme*/state in_sync in_sync
Po tom, co si nastavíme všechny HDD na writemostly měla by už rychlost celého pole odpovídat rychlosti NVMe. Jádro sice NVMe pro čtení jen preferuje a nemá zakázáno čtení z HDD, ale číst z nich prakticky nebude.
Za cenu jednoho drahého NVMe a jednoho levného HDD (případně dvou), máme hybridní pole, které je spolehlivé a odolné proti výpadku (zrcadlení - RAID 1) a jehož rychlost čtení odpovídá NVMe a rychlostí zápisu je na úrovni HDD. Pro mne je to momentálně optimální poměr mezi cenou, kapacitou, výkonem a spolehlivostí. Je to zároveň nekomplikované řešení, což snižuje riziko chyby (ať už uživatele nebo softwaru). Osobně mne překvapilo, že i s těmi čistě rotačními disky jsem byl schopný celkem normálně fungovat (asi největší problém bylo prohlížení fotek, jejichž náhledy ve složce se pomalu načítaly).
Samotný RAID 1 se nepovažuje za zálohu, ale můžeme ho k zálohování použít. Disky v poli lze totiž dynamicky přidávat a odebírat za chodu, takže např. ten druhý HDD můžeme připojit jen občas, nechat pole na něj synchronizovat data a následně ho odpojit a uložit někam do bezpečí. Tento způsob zálohování má výhody i nevýhody – musíme sice kopírovat celou kapacitu – i volné místo – ale zase máme jistotu, že máme zazálohováno vše, data se čtou a zapisují jednoduše sekvenčně od začátku do konce, takže odpadá režie souborového systému (která může být u velkého množství malých souborů značná) i režie dešifrování a šifrování, pokud nad polem máme LUKS (což je obvykle vhodné až nutné).
P.S. Dá se vymyslet ledasco. RAID dvou SSD disků nebo se třeba na RAID vykašlat úplně a jenom zálohovat (např. několikrát denně odesílat Btrfs snapshoty na druhý disk v počítači + méně často na externí). Další možnost by bylo použití souborového systému, který umí spravovat více blokových zařízení, a řídit umístění různých souborů na různě rychlé disky pomocí něj. To by teoreticky bylo optimální řešení… Pokud s tím máte někdo reálnou zkušenost, budu rád za komentáře – já se k tomu v téhle iteraci nedopracoval a zvolil jsem řešení, které je pro mne jednodušší a důvěryhodnější.
Témata: [hardware]
Tento článek zatím nikdo nekomentoval