Výhody a nevýhody HugePages

Výhody a nevýhody HugePages

Preklad článku je pripravený pre študentov kurzu „Administrátor Linuxu“.

Predtým som hovoril o tom, ako skontrolovať a povoliť používanie HugePages v Linuxe.
Tento článok bude užitočný iba ak naozaj máte, kde používať HugePages. Stretával som množstvo ľudí, ktorí sa nechávajú oklamať perspektívou, že HugePages zázračne zvýšia výkon. Môže však byť oblasť hugepaging zložitou témou a pri nesprávnom použití môže výkon znížiť.

Časť 1: kontrola, či sú HugePages zapnuté v Linuxe (originál) tu)

Problém:
Je potrebné skontrolovať, či sú HugePages vo vašej systéme zapnuté.

Riešenie:
Je to celkom jednoduché:

cat /sys/kernel/mm/transparent_hugepage/enabled

Dostanete niečo takéto:

always [madvise] never

Uvidíte zoznam dostupných možností (always, madvise, never), pričom aktuálne aktívna možnosť bude označená zátvorkami (predvolene madvise).

madvise znamená, že transparent hugepages sú povolené iba pre oblasti pamäte, ktoré výslovne žiadajú hugepages pomocou madvise(2).

always znamená, že transparent hugepages sú povolené nepretržite a pre všetky procesy. Zvyčajne to zvyšuje výkon, ale ak máte variant využitia, kde viac procesov spotrebúva malé množstvo pamäte, môže celková záťaž na pamäť náhle vzrásť.

never znamená, že transparent hugepages sa nebudú povolovať ani na žiadosť cez madvise. Pre viac informácií sa obráťte na dokumenácie jadro Linuxu.

Ako zmeniť predvolenú hodnotu

Varianta 1: Priamo zmeniť sysfs (po reštarte sa parameter vráti k predvolenej hodnote):

echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/enabled

Varianta 2: Zmeňte systémovú predvolenú hodnotu prekompilovaním jadra s modifikovanou konfiguráciou (táto možnosť je odporúčaná iba ak používate vlastné jadro):

  • Ak chcete nastaviť always ako predvolené, použite:
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Zrušte komentár CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • Ak chcete nastaviť madvise ako predvolené, použite:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Zrušte komentár CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

Časť 2: Výhody a nevýhody HugePages

Snažíme sa výberovo vysvetliť výhody, nevýhody a možné chyby pri používaní Hugepages. Keďže ide o technologicky zložitý a detailný článok, pravdepodobne bude ťažké ho pochopiť pre ľudí, ktorí sa pomýlili v tom, že Hugepages sú všeliek, obetujem presnosť v prospech jednoduchosti. Je dôležité si uvedomiť, že mnoho tém je naozaj zložitých a preto sú výrazne zjednodušené.

Upozorňujem, že hovoríme o 64-bitových x86 systémoch bežiacich na Linuxe, a že jednoducho predpokladám, že systém podporuje transparent hugepages (pretože to, že hugepages nie sú preberané, nie je nevýhodou), ako sa to deje prakticky v každom modernom prostredí Linux.

Nižšie priložím viac technického popisu.

Virtuálna pamäť

Ak ste programátor C++, viete, že objekty v pamäti majú konkrétne adresy (hodnoty ukazovateľov).

Tieto adresy však nemusia nutne odrážať fyzické adresy v pamäti (adresy v RAM). Predstavujú adresy vo virtuálnej pamäti. Procesor má špeciálny modul MMU (jednotka správy pamäte), ktorý pomáha jadru mapovať virtuálnu pamäť na fyzickú polohu.

Takýto prístup má mnoho výhod, ale tieto sú najzákladnejšie:

  • Výkon (z rôznych dôvodov);
  • Izolácia programov, to znamená, že žiadny program nemôže čítať z pamäte iného programu.

Čo sú stránky?

Virtuálna pamäť je rozdelená na stránky. Každá jednotlivá stránka ukazuje na konkrétnu fyzickú pamäť; môže ukazovať na oblasť v operačnej pamäti alebo na adresu pridelenú fyzickému zariadeniu, ako je napríklad grafická karta.

Väčšina stránok, s ktorými sa stretávate, ukazuje buď na RAM, alebo sú preberané (swap), teda sú uložené na pevnom disku alebo SSD. Jadro riadi fyzické umiestnenie každej stránky. Ak sa pristupuje k prebranej stránke, jadro zastaví tok, ktorý sa pokúša získať prístup k pamäti, načíta stránku z pevného disku/SSD do operačnej pamäti a potom pokračuje vo vykonávaní toku.

Tento proces je pre tok transparentný, to znamená, že nečíta priamo z pevného disku/SSD. Veľkosť normálnych strán je 4096 bajtov. Veľkosť Hugepages je 2 megabajty.

Buffer asociatívneho prekladu (TLB)

Keď program pristupuje k určitej stránke pamäte, centrálny procesor musí vedieť, z ktorej fyzickej stránky načítať údaje (teda musí mať virtuálnu mapu adries).

V jadre existuje dátová štruktúra (tabuľka strán), ktorá obsahuje všetky informácie o použitých stránkach. Pomocou tejto dátovej štruktúry je možné priradiť virtuálnu adresu k fyzickej adrese.

Avšak tabuľka strán je pomerne komplexná a funguje pomaly, preto ich nemôžeme analyzovať každý raz, keď nejaký proces pristúpi k pamäti.

Našťastie máme v našom procesore TLB, ktorý cache-uje priradenia virtuálnych a fyzických adries. To znamená, že aj keď musíme analyzovať tabuľku strán pri prvom pokuse o prístup, všetky nasledujúce prístupy na stránku môžu byť spracované v TLB, čo zabezpečuje rýchlu prevádzku.

Keďže je implementovaný ako fyzické zariadenie (čo ho robí predovšetkým rýchlym), jeho kapacita je obmedzená. Preto, ak sa pokúsite získať prístup k väčšiemu množstvu stránok, TLB nebude schopný uchovávať priradenie pre všetky z nich, čo spôsobí, že váš program bude fungovať oveľa pomalšie.

Hugepages prichádzajú na pomoc

Čo môžeme urobiť, aby sme predišli preťaženiu TLB? (Predpokladáme, že program stále potrebuje rovnaké množstvo pamäte).

Tu nastupujú Hugepages. Namiesto 4096 bajtov, ktoré vyžadujú iba jeden záznam v TLB, môže jeden záznam v TLB teraz smerovať na obrovské 2 megabajty. Predpokladajme, že TLB má 512 záznamov, tu bez Hugepages môžeme priradiť:

4096 b⋅512=2 MB

Kdežto s nimi môžeme priradiť:

2 MB⋅512=1 GB

Preto sú Hugepages skvelé. Môžu zvýšiť výkon bez významného vynaloženia úsilia. Ale existujú tu zásadné výhrady.

Nahrádzanie Hugepages

Jadro automaticky sleduje frekvenciu používania každej stránky pamäte. Ak je fyzickej pamäte (RAM) nedostatok, jadro presunie menej dôležité (menej často používané) stránky na pevný disk, aby uvoľnilo časť RAM pre dôležitejšie stránky.
V podstate to isté platí aj pre Hugepages. Avšak jadro môže zamieňať iba celé stránky, nie jednotlivé bajty.

Predpokladajme, že máme takýto program:

char* mymemory = malloc(2*1024*1024); // Berieme to ako jednu Hugepage!\n// Naplníme mymemory nejakými údajmi\n// Urobíme veľa ďalších vecí,\n// ktoré vedú k prepisovaniu stránky mymemory\n// ...\n// Požiadame o prístup iba k prvému bajtu\nputchar(mymemory[0]); 

V tomto prípade bude jadru potrebné prečítať celých 2 megabajty informácií z pevného disku/SSD len na to, aby ste prečítali jeden bajt. Pokiaľ ide o bežné stránky, z pevného disku/SSD je potrebné prečítať iba 4096 bajtov.

Preto, ak je hugepage prepísaná, jej čítanie prebieha rýchlejšie, iba ak potrebujete získať prístup ku celej stránke. To znamená, že ak sa snažíte získať prístup náhodne k rôznym častiam pamäte a jednoducho čítate pár kilobajtov, mali by ste použiť bežné stránky a viac sa o nič nestarať.

Na druhej strane, ak potrebujete získať prístup k veľkej časti pamäte sekvenčne, hugepages zvýšia vašu produktivitu. Napriek tomu, musíte to overiť sami (a nie na príklade abstraktného softvéru) a pozrieť sa, čo bude fungovať rýchlejšie.

Alokácia v pamäti

Ak píšete v C, viete, že môžete požiadať o akékoľvek malé (alebo takmer akékoľvek veľké) objemy pamäte z hromady pomocou malloc(). Povedzme, že potrebujete 30 bajtov pamäte:

char* mymemory = malloc(30);

Programátorovi sa môže zdať, že „žiadate“ 30 bajtov pamäte z operačného systému a vraciate ukazovateľ na nejakú virtuálnu pamäť. Ale v skutočnosti malloc () je jednoducho funkcia C, ktorá volá interné funkcie brk a sbrk na požiadanie alebo uvoľnenie pamäte z operačného systému.

Avšak, žiadať o čoraz viac pamäte pre každú alokáciu nie je efektívne; je veľmi pravdepodobné, že nejaký segment pamäte už bol uvoľnený (free()), a môžeme ho znovu použiť. malloc() implementuje pomerne komplikované algoritmy na znovupoužitie uvoľnenej pamäte.

Z tohto dôvodu sa to deje pre vás nepozorovane, prečo by vás to malo trápiť? Pretože volanie free() neznamená, že pamäť sa nevyhnutne vracia okamžite operačnému systému.

Existuje pojem nazývaný fragmentácia pamäte. V extrémnych prípadoch sú segmenty hromady, kde sa používajú len niektoré bajty, zatiaľ čo všetko medzi nimi bolo uvoľnené. (free()).

Majte na pamäti, že fragmentácia pamäte je neuveriteľne zložitá téma a aj malé zmeny v programe môžu mať na ňu výrazný vplyv. V mnohých prípadoch programy nespôsobujú významnú fragmentáciu pamäte, ale mali by ste si uvedomiť, že ak v nejakej oblasti hromady nastal problém s fragmentáciou, hugepages môžu situáciu len zhoršiť.

Cielené použitie hugepages

Po prečítaní článku ste zistili, ktoré časti vášho programu môžu ťažiť z použitia hugepages a ktoré nie. Môžete vôbec zahrnúť hugepages?

Našťastie môžete použiť madvise(), aby ste aktivovali hugepaging len pre tie oblasti pamäte, kde to bude užitočné.

Začnite tým, že skontrolujete, či hugepages fungujú v režime madvise(), pomocou the instructions na začiatku článku.

Potom použite madvise(), aby ste povedali jadru, kde presne použiť hugepages.

#include <sys/mman.h>
// Аллоцируйте большое количество памяти, которую будете использовать
size_t size = 256*1024*1024;
char* mymemory = malloc(size);
// Просто включите hugepages…
madvise(mymemory, size, MADV_HUGEPAGE);
// … и задайте следующее
madvise(mymemory, size, MADV_HUGEPAGE | MADV_SEQUENTIAL)

Majte na pamäti, že táto metóda je len odporúčaním pre jadro ohľadom správy pamäte. Neznamená to, že jadro automaticky použije hugepages pre stanovenú pamäť.

Odkazujte na dokumentáciu (manpage) madvise, aby ste sa dozvedeli viac o správe pamäte a madvise(), táto téma má neuveriteľne strmý učenia. Preto, ak sa skutočne chcete do tejto problematiky ponoriť, pripravte sa na čítanie a testovanie niekoľko týždňov predtým, než očakávate akýkoľvek pozitívny výsledok.

Čo čítať?

Máte otázku? Napíšte v komentároch!

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster