Co je vm.min_free_kbytes a jak jej naladit?

What Is Vm Min_free_kbytes

Co je vm.min_free_kbytes sysctl laditelný pro linuxové jádro a na jakou hodnotu by měl být nastaven? V tomto článku prostudujeme tento parametr a jeho dopad na běžící systém Linux. Otestujeme jeho dopad na mezipaměť stránek operačního systému a na mallocy a to, co ukazuje příkaz free system, když je tento parametr nastaven. Učiníme několik vzdělaných odhadů ideálních hodnot pro tento laditelný nástroj a ukážeme, jak trvale nastavit vm.min_free_kbytes, aby přežil restart. Tak pojďme.

Jak vm.min_free_kbytes funguje

Systém může potřebovat alokaci paměti, aby zajistil správné fungování samotného systému. Pokud jádro umožňuje přidělit veškerou paměť, může mít potíže při potřebě paměti pro běžné operace, aby OS fungoval hladce. Proto jádro poskytuje laditelné vm.min_free_kbytes. Laditelný způsobí, že správce paměti jádra zachová alespoň X množství volné paměti. Zde je oficiální definice z dokumentace jádra linuxu : Toto se používá k vynucení virtuálního počítače s Linuxem, aby ponechal minimální počet kilobajtů volných. Virtuální počítač používá toto číslo k výpočtu hodnoty vodoznaku [WMARK_MIN] pro každou zónu s nízkou pamětí v systému. Každá zóna s nízkou pamětí získá určitý počet vyhrazených volných stránek v závislosti na její velikosti. K uspokojení alokací PF_MEMALLOC je zapotřebí určité minimální množství paměti; pokud toto nastavíte na nižší než 1024 kB, váš systém se jemně rozbije a bude náchylný k zablokování při vysokém zatížení. Pokud nastavíte příliš vysokou hodnotu, bude váš stroj okamžitě OOM.



Ověření vm.min_free_kbytes funguje

Abych otestoval, že nastavení min_free_kbytes funguje tak, jak bylo navrženo, vytvořil jsem virtuální instanci linuxu s pouze 3,75 GB RAM. K analýze systému použijte níže uvedený bezplatný příkaz:



#volný, uvolnit -m



Při pohledu na výše uvedenou utilitu volné paměti pomocí příznaku -m se hodnoty vytisknou v MB. Celková paměť je 3,5 až 3,75 GB paměti. Je využito 121 MB paměti, 3,3 GB paměti je volných, 251 MB využívá vyrovnávací paměť cache. A k dispozici je 3,3 GB paměti.

Nyní změníme hodnotu vm.min_free_kbytes a uvidíme, jaký to má dopad na systémovou paměť. Zopakujeme novou hodnotu pro virtuální souborový systém proc, abychom změnili hodnotu parametru jádra podle níže:

# echo 1500000>/proc/sys/vm/min_free_kbytes
# sysctl vm.min_free_kbytes



Můžete vidět, že parametr byl změněn přibližně na 1,5 GB a projevil se. Nyní použijeme volný, uvolnit znovu zobrazte všechny změny rozpoznané systémem.

#volný, uvolnit -m

Volná paměť a vyrovnávací paměť se příkazem nezmění, ale velikost paměti se zobrazí jako k dispozici byla snížena z 3327 na 1222 MB. Což je přibližné snížení změny parametru na 1,5 GB min volné paměti.

Nyní vytvoříme datový soubor o velikosti 2 GB a poté se podíváme, co čtení tohoto souboru z mezipaměti vyrovnávací paměti udělá s hodnotami. Zde je návod, jak vytvořit 2 GB datový soubor ve 2 řádcích bash skriptu níže. Skript vygeneruje 35 MB náhodný soubor pomocí příkazu dd a poté jej 70krát zkopíruje do nového datový soubor výstup:

# dd if =/dev/random of =/root/d1.txt count = 1000000
# for i in `seq 1 70`; do echo $ i; cat /root/d1.txt >> /root /data_file; Hotovo

Přečteme si soubor a ignorujeme obsah čtením a přesměrováním souboru na /dev /null podle níže:

#kočkadatový soubor> /dev/nula

Dobře, co se stalo s naší systémovou pamětí s touto sadou manévrů, pojďme to nyní zkontrolovat:

#volný, uvolnit -m

Analýza výsledků výše. Stále máme 1,8 GB volné paměti, takže jádro chránilo velký kus paměti jako rezervovaný kvůli našemu nastavení min_free_kbytes. Vyrovnávací paměť používala 1691 MB, což je méně než celková velikost našeho datového souboru, která je 2,3 GB. Zjevně celý datový soubor nebylo možné uložit do mezipaměti z důvodu nedostatku dostupné paměti, kterou lze použít pro mezipaměť vyrovnávací paměti. Můžeme ověřit, že celý soubor není uložen v mezipaměti, ale načasovat opakované pokusy o čtení souboru. Pokud by byl uložen do mezipaměti, čtení souboru by trvalo zlomek sekundy. Pojďme to zkusit.

# time cat data_file> /dev /null
# time cat data_file> /dev /null

Čtení souboru trvalo téměř 20 sekund, což znamená, že téměř všechny nejsou uloženy v mezipaměti.

Jako jedno konečné ověření omezme vm.min_free_kbytes, aby mezipaměť stránky měla více prostoru pro provoz a můžeme očekávat, že mezipaměť bude fungovat a čtení souborů bude mnohem rychlejší.

# echo 67584>/proc/sys/vm/min_free_kbytes
# time cat data_file> /dev /null
# time cat data_file> /dev /null

S dodatečnou pamětí dostupnou pro ukládání do mezipaměti se doba čtení souboru snížila z 20 sekund dříve na 0,364 sekundy a vše v mezipaměti.

Jsem zvědavý na další experiment. Co se stane s voláním malloc alokovat paměť z programu C tváří v tvář tomuto opravdu vysokému nastavení vm.min_free_kbytes. Nepovede se to na mallocu? Zemře systém? Nejprve obnovte nastavení vm.min_free_kbytes na skutečně vysokou hodnotu, abyste mohli pokračovat v našich experimentech:

#vyhodil 1500 000 > /procento/sys/vm/min_free_kbytes

Podívejme se znovu na naši volnou paměť:

Teoreticky máme k dispozici 1,9 GB zdarma a 515 MB k dispozici. Použijme program zátěžového testu zvaný stress-ng, abychom využili paměť a zjistili, kde selháváme. Použijeme tester vm a pokusíme se přidělit 1 GB paměti. Protože jsme v systému 3,75 GB rezervovali pouze 1,5 GB, myslím, že by to mělo fungovat.

# stress-ng --vm 1 --vm-bytes 1G-časový limit 60 s
stres: informace:[17537]dispečerské prasata:1vm
stres: informace:[17537]alokovat mezipaměť: výchozí velikost mezipaměti: 46080 kB
stres: informace:[17537]úspěšný běh dokončenv60,09 s(1min.,0,09suchý)
# stress-ng --vm 2 --vm-bytes 1G-časový limit 60 s
# stress-ng --vm 3 --vm-bytes 1G-časový limit 60 s

Zkusme to znovu s více pracovníky, můžeme zkusit 1, 2, 3, 4 pracovníky a v určitém okamžiku by to mohlo selhat. V mém testu prošel s 1 a 2 pracovníky, ale se 3 pracovníky neuspěl.

Obnovíme vm.min_free_kbytes na nízké číslo a uvidíme, jestli nám to pomůže spustit 3 paměťové stresory s 1 GB každý na 3,75 GB systému.

# echo 67584>/proc/sys/vm/min_free_kbytes
# stress-ng --vm 3 --vm-bytes 1G-časový limit 60 s

Tentokrát to proběhlo úspěšně bez chyby, zkusil jsem to dvakrát bez problémů. Mohu tedy usoudit, že existuje behaviorální rozdíl v tom, že pro malloc je k dispozici více paměti, když je hodnota vm.min_free_kbytes nastavena na nižší hodnotu.

Výchozí nastavení pro vm.min_free_kbytes

Výchozí hodnota pro nastavení v mém systému je 67584, což je asi 1,8% RAM v systému nebo 64 MB. Z bezpečnostních důvodů bych na silně vymláceném systému měl tendenci to trochu zvětšit, třeba na 128 MB, aby bylo umožněno více vyhrazené volné paměti, ale pro průměrné využití se zdá být výchozí hodnota dostatečně rozumná. Oficiální dokumentace varuje před příliš vysokou hodnotou. Nastavení na 5 nebo 10% systémové RAM pravděpodobně není zamýšleným využitím nastavení a je příliš vysoké.

Nastavení vm.min_free_kbytes, aby přežily restarty

Aby bylo zajištěno, že nastavení vydrží restarty a nebude při restartu obnoveno na výchozí hodnoty, zajistěte, aby nastavení sysctl bylo trvalé vložením požadované nové hodnoty do souboru /etc/sysctl.conf.

Závěr

Viděli jsme, že laditelný linuxový jádro vm.min_free_kbytes lze upravit a může rezervovat paměť v systému, aby byl systém stabilnější, zejména při vysokém využití a alokaci velké paměti. Výchozí nastavení může být příliš nízké, zejména u systémů s vysokou pamětí, a mělo by být považováno za zvýšené opatrně. Viděli jsme, že paměť vyhrazená tímto laditelným souborem brání mezipaměti OS používat veškerou paměť a také brání některým operacím malloc využívat veškerou paměť.