Jak vm.min_free_kbytes funguje
Systém může vyžadovat přidělení paměti, aby bylo zajištěno správné fungování samotného systému. Pokud jádro umožňuje alokovat veškerou paměť, mohlo by se to potýkat s potřebou paměti pro běžné operace, aby operační systém fungoval hladce. Proto jádro poskytuje laditelný vm.min_free_kbytes. Laditelné vynutí správce paměti jádra, aby udržel alespoň X množství volné paměti. Zde je oficiální definice z dokumentace linuxového jádra: „Toto se používá k vynucení virtuálního počítače s Linuxem, aby udržel volný minimální počet kilobajtů. Virtuální počítač používá toto číslo k výpočtu hodnoty vodoznaku [WMARK_MIN] pro každou zónu lowmem v systému. Každá lowmem zóna dostane počet rezervovaných stránek zdarma úměrně k její velikosti. K uspokojení přidělení PF_MEMALLOC je potřeba určité minimální množství paměti; pokud nastavíte tuto hodnotu na méně než 1024 kB, váš systém se nenápadně rozbije a bude náchylný k zablokování při vysokém zatížení. Nastavením této příliš vysoké hodnoty se váš stroj okamžitě OOM."
Ověřování vm.min_free_kbytes Works
Aby bylo možné otestovat, že nastavení min_free_kbytes funguje tak, jak bylo navrženo, vytvořil jsem virtuální instanci linuxu pouze s 3.75 GB RAM. Pro analýzu systému použijte níže uvedený bezplatný příkaz:
# zdarma -m
Podíváme-li se výše na obslužný program volné paměti pomocí příznaku -m, aby byly hodnoty vytištěny v MB. Celková paměť je 3.5 až 3.75 GB paměti. Je použito 121 MB paměti, 3.3 GB paměti je zdarma, 251 MB využívá mezipaměť mezipaměti. A 3.K dispozici jsou 3 GB paměti.
Nyní změníme hodnotu vm.min_free_kbytes a uvidíte, jaký je dopad na systémovou paměť. Odpovíme novou hodnotu na virtuální souborový systém proc, abychom změnili hodnotu parametru jádra, jak je uvedeno níže:
# echo 1500000> / proc / sys / vm / min_free_kbytes# sysctl vm.min_free_kbytes
Vidíte, že parametr byl změněn na 1.Přibližně 5 GB a vstoupilo v platnost. Nyní použijeme volný, uvolnit znovu zobrazte všechny změny rozpoznané systémem.
# zdarma -m
Volná paměť a mezipaměť vyrovnávací paměti 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 2 GB datový soubor a poté uvidíme, co čtení tohoto souboru do mezipaměti vyrovnávací paměti způsobí hodnotám. Zde je návod, jak vytvořit 2GB datový soubor ve 2 řádcích bash skriptu níže. Skript vygeneruje náhodný soubor 35 MB 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.počet txt = 10 000 000# for i in 'seq 1 70'; dělat echo $ i; kočka / kořen / d1.txt >> / root / data_file; Hotovo
Přečti si soubor a ignorujme obsah čtením a přesměrováním souboru na / dev / null podle níže:
# cat data_file> / dev / nullDobře, co se stalo s naší systémovou pamětí s touto sadou manévrů, pojďme to teď zkontrolovat:
# zdarma -m
Analýza výše uvedených výsledků. Stále máme 1.8 GB volné paměti, takže jádro chránilo velkou část paměti jako rezervovanou kvůli našemu nastavení min_free_kbytes. Vyrovnávací paměť používala 1691 MB, což je menší než celková velikost našeho datového souboru, která je 2.3 GB. Zřejmě celá datový soubor nelze uložit do mezipaměti z důvodu nedostatku dostupné paměti pro mezipaměť vyrovnávací paměti. Můžeme ověřit, že celý soubor není uložen v mezipaměti, ale načasování opakovaných pokusů o čtení souboru. Pokud by byl v 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ěř jistě ne všechny uložené v mezipaměti.
Jako jednu finální validaci pojďme snížit vm.min_free_kbytes, aby mezipaměť stránky měla více prostoru pro provoz, a můžeme očekávat, že bude mezipaměť fungovat a čtení souboru bude mnohem rychlejší.
# echo 67584> / proc / sys / vm / min_free_kbytes# time cat data_file> / dev / null
# time cat data_file> / dev / null
S extra pamětí dostupnou pro ukládání do mezipaměti klesl čas čtení souboru z 20 sekund před na .364 sekund, vše v mezipaměti.
Jsem zvědavý na další experiment. Co se stane s malloc voláními k přidělení paměti programu C tváří v tvář tomuto opravdu vysokému vm.min_free_kbytes nastavení. Zklame to malloc? Zemře systém? Nejprve resetujte vm.nastavení min_free_kbytes na opravdu vysokou hodnotu pro obnovení našich experimentů:
# echo 1500000> / proc / sys / vm / min_free_kbytesPodívejme se znovu na naši volnou paměť:
Teoreticky máme 1.9 GB zdarma a 515 MB k dispozici. Využijeme program zátěžového testu s názvem stress-ng, abychom využili trochu paměti a zjistili, kde selháváme. Použijeme vm tester a pokusíme se přidělit 1 GB paměti. Protože jsme rezervovali pouze 1.5 GB na 3.75 GB systém, myslím, že by to mělo fungovat.
# stress-ng --vm 1 --vm-bytes 1G --timeout 60sstress-ng: info: [17537] odeslání prasat: 1 vm
stress-ng: info: [17537] přidělení mezipaměti: výchozí velikost mezipaměti: 46080K
stress-ng: info: [17537] úspěšný běh dokončen za 60.09 s (1 min, 0.09 s)
# stress-ng --vm 2 --vm-bytes 1G --timeout 60s
# stress-ng --vm 3 --vm-bytes 1G --timeout 60s
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 mělo selhat. V mém testu prošel s 1 a 2 pracovníky, ale selhal u 3 pracovníků.
Pojďme resetovat vm.min_free_kbytes na nízké číslo a uvidíme, jestli nám to pomůže spustit 3 paměťové stresory, každý s 1 GB na 3.75GB systém.
# echo 67584> / proc / sys / vm / min_free_kbytes# stress-ng --vm 3 --vm-bytes 1G --timeout 60s
Tentokrát to proběhlo úspěšně bez chyby, zkusil jsem to dvakrát bez problémů. Mohu tedy dojít k závěru, že existuje behaviorální rozdíl v dostupnosti více paměti pro malloc, když je vm.hodnota min_free_kbytes je 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ů na silně otřeseném systému bych měl tendenci jej trochu zvýšit, možná na 128 MB, abych umožnil více rezervované volné paměti, ale pro průměrné použití se výchozí hodnota zdá dostatečně rozumná. Oficiální dokumentace varuje před příliš vysokou hodnotou. Nastavení na 5 nebo 10% systémové paměti RAM pravděpodobně není zamýšleným použ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í přežije restartování a nebude při restartování obnoveno na výchozí hodnoty, nezapomeňte nastavit sysctl jako trvalé vložením požadované nové hodnoty do / etc / sysctl.soubor conf.
Závěr
Viděli jsme, že vm.laditelné jádro linuxového min_free_kbytes lze upravit a může rezervovat paměť v systému, aby byl zajištěn stabilnější systém, zejména při vysokém používání a velkém přidělování paměti. Výchozí nastavení může být trochu příliš nízké, zejména na systémech s vysokou pamětí, a mělo by být považováno za pečlivě zvýšeno. Viděli jsme, že paměť rezervovaná tímto laditelným systémem brání mezipaměti OS používat celou paměť a také brání tomu, aby některé operace malloc nevyužily také celou paměť.