Nastavení jádra Linuxu pro GlusterFS

Překlad článku byl vyhotoven před začátkem kurzu «Linux Administrator. Professional».

Nastavení jádra Linuxu pro GlusterFS

Občas se vynořují dotazy ohledně doporučení Gluster k nastavení jádra a zda je to vůbec nutné.

Taková potřeba vzniká zřídka. Ve většině zátěží jádro funguje velmi dobře. I když je tu i druhá strana. Historicky jádro Linuxu ochotně spotřebovává hodně paměti, pokud mu to dovolíte, včetně využívání jako hlavního způsobu zvýšení výkonu.

Většinou to funguje skvěle, ale při vysoké zátěži to může způsobit problémy.

Máme bohaté zkušenosti se systémy s vysokou spotřebou paměti, jako jsou CAD, EDA a podobně, které začaly za vysoké zátěže zadrhávat. A občas jsme se setkávali s problémy v Glusteru. Pečlivým sledováním spotřeby paměti a čekací doby disků jsme zažili jejich přetížení, obrovské iowait, chyby jádra (kernel oops), zamrznutí atd.

Tento článek je výsledkem mnoha experimentů s konfigurací parametrů provedených v různých situacích. Díky těmto parametrům se nejen zlepšila celková odezva, ale také se výrazně stabilizoval provoz clustera.

Když jde o nastavení paměti, je třeba se nejprve zaměřit na subsystém virtuální paměti (VM, virtual memory), který má spoustu možností, jež vás mohou zmást.

vm.swappiness

Parameter vm.swappiness určuje, jak moc jádro používá swapování ve srovnání s operační pamětí. V zdrojovém kódu je také definováno jako „tendency to steal mapped memory“ (sklon k krádeži mapované paměti). Vysoká hodnota swappiness znamená, že jádro bude ochotnější vyhazovat mapované stránky. Nízká hodnota swappiness znamená opak: jádro bude méně vyhazovat stránky z paměti. Jinými slovy, čím vyšší je hodnota vm.swappiness, tím více systém využívá swap.

Velké využívání swapování není žádoucí, protože do operační paměti se načítají a vyhazují obrovské bloky dat. Mnozí tvrdí, že hodnota swapiness by měla být vysoká, ale z mé zkušenosti vede k zvýšení výkonu nastavení na „0“.

Další informace lze přečíst zde — lwn.net/Articles/100978

Avšak tato nastavení by měla být používána opatrně a pouze po testování konkrétní aplikace. Pro vysoce zatížené streamovací aplikace by měla být tato hodnota nastavena na '0'. Při změně na '0' se zlepší odezva systému.

vm.vfs_cache_pressure

Tato parametrová hodnota řídí paměť, kterou jádro využívá pro kešování objektů adresářů a indexových deskriptorů (dentry a inode).

Při výchozí hodnotě 100 se jádro pokusí uvolnit keš dentry a inode 'spravedlivě' ve vztahu k pagecache a swapcache. Snížení vfs_cache_pressure způsobí, že jádro si uchová keše dentry a inode. Když je hodnota nastavena na '0', jádro nikdy nevymaže keš dentry a inode z důvodu nedostatku paměti (memory pressure), což může snadno vést k chybě out-of-memory. Zvýšení vfs_cache_pressure nad 100 dává jádru prioritu k uvolnění dentry a inode.

Při použití GlusterFS mnoho uživatelů s velkými objemy dat a mnoha malými soubory může snadno využít na serveru značné množství operační paměti kvůli kešování inode/dentry, což může vést k poklesu výkonu, protože jádro musí zpracovávat datové struktury v systému s 40 GB paměti. Nastavení této parameterové hodnoty nad 100 pomohlo mnoha uživatelům dosáhnout spravedlivějšího kešování a zlepšit odezvu jádra.

vm.dirty_background_ratio a vm.dirty_ratio

První parametr (vm.dirty_background_ratio) určuje procento paměti se špinavými stránkami, při jehož dosažení je třeba zahájit na pozadí vyprázdnění špinavých stránek na disk. Dokud tato procentní hodnota není dosažena, stránky se na disk nevyprázdní. A když začíná vyprázdnění, provádí se na pozadí, aniž by to přerušovalo běžící procesy.

Druhý parametr (vm.dirty_ratio) určuje procento paměti, které mohou zabírat

Snížení hodnot těchto parametrů vede k častějšímu zápisu dat na disk a k jejich menšímu uchovávání v RAM. To může pomoci systémům s velkým množstvím paměti, v nichž je běžné zapisovat na disk cache stránek o velikosti 45–90 GB, což způsobuje obrovské doby čekání pro frontendové aplikace a snižuje celkovou odezvu a interaktivitu.

„1“ > /proc/sys/vm/pagecache

Stránková cache (page cache) je cache, ve které jsou uložena data souborů a spustitelných programů, tedy stránky s aktuálním obsahem souborů nebo blokových zařízení. Tato cache se používá k redukci počtu čtení z disku. Hodnota „1“ znamená, že pro cache se používá 1% RAM a že operací čtení z disku bude více než z RAM. Není nutné měnit tento parametr, ale pokud jste paranoidní ohledně kontroly nad stránkovou cache, můžete jej použít.

„deadline“ > /sys/block/sdc/queue/scheduler

Plánovač vstupu a výstupu (I/O scheduler) je komponenta jádra Linuxu, která zpracovává fronty čtení a zápisu. Teoreticky je pro chytrý RAID řadič lepší použít „noop“, protože Linux nic neví o fyzické geometrii disku, a proto je efektivnější nechat řadič, který dobře zná geometrii disku, zpracovat požadavek co nejrychleji. Ale zdá se, že „deadline“ zvyšuje výkon. Více o plánovačích si můžete přečíst v dokumentaci ke zdrojovému kódu jádra Linuxu: linux/Documentation/block/*osched.txt. A také jsem pozoroval nárůst propustnosti čtení během smíšených operací (mnoho zápisových operací).

„256“ > /sys/block/sdc/queue/nr_requests

Počet I/O požadavků v bufferu před tím, než jsou předány plánovači. Velikost vnitřní fronty některých ovladačů (queue_depth) je větší než nr_requests plánovače I/O, takže plánovač I/O má málo šancí správně priorizovat a provést sloučení požadavků. Pro plánovače deadline a CFQ je lepší, když je nr_requests dvakrát větší než vnitřní fronta ovladače. Sloučení a přeřazení požadavků pomáhá plánovači být citlivější při vysokém zatížení.

echo "16" > /proc/sys/vm/page-cluster

Parametr page-cluster řídí počet stránek, které se zapisují do swapu najednou. V uvedeném příkladu je hodnota nastavena na "16" podle velikosti stripe (stripe size) RAIDu, která je 64 KB. To nedává smysl při swappiness = 0, ale pokud jste nastavili swappiness na 10 nebo 20, pak použití této hodnoty vám pomůže, když velikost stripe RAIDu činí 64 KB.

blockdev —setra 4096 /dev/<devname> (-sdb, hdc nebo dev_mapper)

Výchozí nastavení blokových zařízení pro mnoho RAID ovladačů často vedou k hrozné výkonnosti. Přidání výše uvedené možnosti nastaví předběžné čtení na 4096 * 512-bajtových sektorů. Nejméně pro streamové operace se zvyšuje rychlost, naplňující vestavěnou paměť disku díky předběžnému čtení během období, které jádro používá pro přípravu I/O. Do vyrovnávací paměti mohou být umístěna data, která budou požadována při dalším čtení. Příliš velké předběžné čtení může zničit náhodné I/O pro velké soubory, pokud využívá potenciálně užitečný čas disku nebo načítá data mimo vyrovnávací paměť.

Níže jsou uvedena další doporučení na úrovni souborového systému. Ale dosud nebyla testována. Ujistěte se, že váš souborový systém zná velikost stripe a počet disků v poli. Například, že se jedná o pole RAID5 se stripe o velikosti 64K sestávající ze šesti disků (ve skutečnosti pěti, protože jeden disk se používá pro paritu). Tato doporučení jsou založena na teoretických předpokladech a shromážděna z různých blogů/článků expertů na RAID.

-> ext4 fs, 5 disků, 64K stripe, jednotky ve 4K blocích
mkfs -text4 -E stride=$((64/4))
-> xfs, 5 disků, 64K stripe, jednotky v 512-bajtových sektorech
mkfs -txfs -d sunit=$((64*2)) -d swidth=$((5*64*2))

Pro velké soubory lze zvážit zvýšení výše uvedených velikostí stripe.

POZOR! Vše, co bylo výše popsáno, je pro některé typy aplikací velmi subjektivní. Tento článek nezaručuje žádná zlepšení bez předchozího testování příslušných aplikací ze strany uživatele. Měl by být aplikován pouze v případě zlepšení celkové odezvy systému nebo pokud řeší současné problémy.

Další materiály:

Nastavení jádra Linuxu pro GlusterFS

Číst dál

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster