Čo je vm.min_free_kbytes a ako ho vyladiť?

What Is Vm Min_free_kbytes



Čo je vm.min_free_kbytes sysctl laditeľný pre linuxové jadro a na akú hodnotu by mal byť nastavený? V tomto článku budeme študovať tento parameter a jeho vplyv na spustený systém Linux. Otestujeme jeho vplyv na vyrovnávaciu pamäť stránok operačného systému a na mallocy a to, čo ukazuje príkaz bez systému, keď je tento parameter nastavený. Urobíme niekoľko kvalifikovaných odhadov ideálnych hodnôt pre tento laditeľný nástroj a ukážeme, ako natrvalo nastaviť vm.min_free_kbytes tak, aby prežil reštart. Tak, poďme.

Ako vm.min_free_kbytes funguje

Systém môže potrebovať alokáciu pamäte, aby zaistil správne fungovanie samotného systému. Ak jadro umožňuje alokovať všetku pamäť, môže mať problémy s potrebou pamäte na pravidelné operácie, aby OS bežal hladko. Preto jadro poskytuje laditeľné vm.min_free_kbytes. Laditeľný prinúti správcu pamäte jadra zachovať najmenej X voľnej pamäte. Tu je oficiálna definícia z dokumentácia jadra linuxu : Toto sa používa na vynútenie toho, aby virtuálny počítač s Linuxom ponechal minimálny počet kilobajtov voľný. VM používa toto číslo na výpočet hodnoty vodoznaku [WMARK_MIN] pre každú zónu s nízkou pamäťou v systéme. Každá zóna s nízkou pamäťou získa množstvo vyhradených voľných stránok v závislosti od veľkosti. Na uspokojenie alokácií PF_MEMALLOC je potrebných určité minimálne množstvo pamäte; ak to nastavíte na menej ako 1024 kB, váš systém sa jemne pokazí a pri vysokom zaťažení bude náchylný k zablokovaniu. Nastavením príliš vysokej hodnoty sa váš stroj okamžite premiestni.







Overenie platnosti vm.min_free_kbytes funguje

Aby som otestoval, či nastavenie min_free_kbytes funguje tak, ako bolo navrhnuté, vytvoril som virtuálnu inštanciu linux s iba 3,75 GB RAM. Na analýzu systému použite nižšie uvedený bezplatný príkaz:



#zadarmo -m



Pri pohľade na nástroj bezplatnej pamäte vyššie pomocou príznaku -m sa hodnoty vytlačia v MB. Celková pamäť je 3,5 až 3,75 GB pamäte. Využitých je 121 MB pamäte, 3,3 GB pamäte je voľných, 251 MB používa vyrovnávacia pamäť cache. A k dispozícii je 3,3 GB pamäte.





Teraz zmeníme hodnotu vm.min_free_kbytes a uvidíme, aký vplyv má na systémovú pamäť. Novú hodnotu zopakujeme pre virtuálny súborový systém proc, aby sme zmenili hodnotu parametra jadra podľa nižšie uvedeného postupu:

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



Môžete vidieť, že parameter bol zmenený na približne 1,5 GB a nadobudol účinnosť. Teraz použijeme zadarmo príkazom znova zobrazte všetky zmeny rozpoznané systémom.

#zadarmo -m

Voľná ​​pamäť a vyrovnávacia pamäť sa príkazom nezmenia, ale veľkosť pamäte sa zobrazí ako k dispozícii sa znížilo z 3327 na 1222 MB. Čo je približné zníženie zmeny parametra na 1,5 GB min voľnej pamäte.

Teraz vytvoríme dátový súbor s kapacitou 2 GB a potom sa pozrieme na to, čo čítanie týchto súborov z vyrovnávacej pamäte vyrovnávacej pamäte urobí s hodnotami. Tu je návod, ako vytvoriť 2 GB dátový súbor v 2 riadkoch bash skriptu nižšie. Skript vygeneruje 35 MB náhodný súbor pomocou príkazu dd a potom ho 70 -krát skopíruje do nového súbor údajov výkon:

# dd if =/dev/random of =/root/d1.txt count = 1000000
# pre i v `seq 1 70`; opakujte $ i; mačka /koreň /súbor1.txt >> /root /údajový_súbor; hotový

Prečítajte si súbor a ignorujte obsah prečítaním a presmerovaním súboru na /dev /null podľa nižšie uvedeného postupu:

#katsúbor údajov> /dev/nulový

Dobre, čo sa stalo s našou systémovou pamäťou s touto sadou manévrov, pozrime sa na to teraz:

#zadarmo -m

Analýza výsledkov uvedených vyššie. Stále máme 1,8 GB voľnej pamäte, takže jadro kvôli nášmu nastaveniu min_free_kbytes ochránilo veľkú časť pamäte ako vyhradenú. Vyrovnávacia pamäť používa 1691 MB, čo je menej ako celková veľkosť nášho dátového súboru, ktorá je 2,3 GB. Podľa všetkého celý súbor údajov nebolo možné uložiť do vyrovnávacej pamäte z dôvodu nedostatku dostupnej pamäte na použitie pre vyrovnávaciu pamäť vyrovnávacej pamäte. Môžeme overiť, že celý súbor nie je uložený vo vyrovnávacej pamäti, ale načasovať opakované pokusy o prečítanie súboru. Ak by bol uložený do vyrovnávacej pamäte, čítanie súboru by trvalo zlomok sekundy. Skúsme to.

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

Načítanie súboru trvalo takmer 20 sekúnd, čo znamená, že takmer úplne nie je vo vyrovnávacej pamäti.

Ako jedno z posledných overení zredukujme vm.min_free_kbytes, aby mala vyrovnávacia pamäť stránky viac priestoru na prevádzku, a môžeme očakávať, že vyrovnávacia pamäť bude fungovať a čítanie súborov bude oveľa rýchlejšie.

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

Vďaka dodatočnej pamäti dostupnej na ukladanie do vyrovnávacej pamäte sa čas na čítanie súboru skrátil z 20 sekúnd predtým na 0,364 sekundy, pričom bolo všetko v pamäti cache.

Som zvedavý na ďalší experiment. Čo sa stane s hovormi malloc na pridelenie pamäte z programu C tvárou v tvár tomuto skutočne vysokému nastaveniu vm.min_free_kbytes. Nepodarí sa to mallocu? Zomrie systém? Najprv obnovte nastavenie vm.min_free_kbytes na skutočne vysokú hodnotu, aby ste mohli pokračovať v našich experimentoch:

#zahodil 1 500 000 > /percent/sys/vm/min_free_kbytes

Pozrime sa znova na našu voľnú pamäť:

Teoreticky máme k dispozícii 1,9 GB bezplatných a 515 MB k dispozícii. Použime program stresového testu nazývaný stress-ng, aby sme použili pamäť a zistili, kde sme zlyhali. Použijeme tester vm a pokúsime sa prideliť 1 GB pamäte. Pretože sme v systéme 3,75 GB vyhradili iba 1,5 GB, hádam by to malo fungovať.

# stress-ng --vm 1 --vm-bytes 1G-časový limit 60 s
stres: info:[17537]dispečing ošípaných:1vm
stres: info:[17537]pridelenie vyrovnávacej pamäte: predvolená veľkosť vyrovnávacej pamäte: 46080 kB
stres: info:[17537]úspešný beh dokončenýv60,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

Skúsme to znova s ​​viacerými pracovníkmi, môžeme skúsiť 1, 2, 3, 4 pracovníkov a v určitom okamihu by to mohlo zlyhať. V mojom teste prešiel s 1 a 2 pracovníkmi, ale s 3 pracovníkmi neuspel.

Vynulujme vm.min_free_kbytes na nízke číslo a uvidíme, či nám to pomôže spustiť 3 stresory pamäte s každým 1 GB v systéme 3,75 GB.

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

Tentoraz to prebehlo úspešne bez chyby, vyskúšal som to dvakrát bez problémov. Môžem teda usúdiť, že existuje behaviorálny rozdiel v tom, že pre malloc je k dispozícii viac pamäte, keď je hodnota vm.min_free_kbytes nastavená na nižšiu hodnotu.

Predvolené nastavenie pre vm.min_free_kbytes

Predvolená hodnota pre nastavenie v mojom systéme je 67584, čo je asi 1,8% pamäte RAM v systéme alebo 64 MB. Z bezpečnostných dôvodov na silne prepracovanom systéme by som mal tendenciu ho trochu zväčšiť na 128 MB, aby som umožnil vyhradenejšiu voľnú pamäť, ale pre priemerné využitie sa zdá, že predvolená hodnota je dostatočne rozumná. Oficiálna dokumentácia varuje pred príliš vysokou hodnotou. Nastavenie na 5 alebo 10% systémovej pamäte RAM pravdepodobne nie je zamýšľaným použitím nastavenia a je príliš vysoké.

Nastavenie vm.min_free_kbytes na prežitie reštartov

Aby bolo zaistené, že nastavenie vydrží aj reštarty a pri reštarte sa neobnoví na predvolené hodnoty, uistite sa, že nastavenie sysctl bude trvalé vložením požadovanej novej hodnoty do súboru /etc/sysctl.conf.

Záver

Videli sme, že laditeľný jadro linuxového jadra vm.min_free_kbytes je možné upraviť a môže vyhradiť pamäť v systéme, aby sa zabezpečilo, že systém bude stabilnejší, najmä pri vysokom používaní a alokácii pamäte. Predvolené nastavenia môžu byť príliš nízke, najmä v prípade systémov s veľkou pamäťou, a mali by ste ich považovať za zvýšené. Videli sme, že pamäť vyhradená týmto laditeľným súborom bráni vyrovnávacej pamäti operačného systému používať všetku pamäť a tiež bráni niektorým operáciám malloc využívať celú pamäť.