Kaj je vm.min_free_kbytes in kako ga nastaviti?

What Is Vm Min_free_kbytes



Kaj je vm.min_free_kbytes sysctl nastavljiv za jedro Linux in na kakšno vrednost naj bo nastavljen? V tem članku bomo preučili ta parameter in kako vpliva na delujoč sistem Linux. Preizkusili bomo njegov vpliv na predpomnilnik strani OS in malloc -e ter na to, kaj prikaže sistemski prosti ukaz, ko je ta parameter nastavljen. Naredili bomo nekaj izobraženih ugank o idealnih vrednostih za to nastavljivo vrednost in pokazali bomo, kako trajno nastaviti vm.min_free_kbytes, da preživi ponovni zagon. Pa pojdimo.

Kako deluje vm.min_free_kbytes

Za zagotovitev pravilnega delovanja samega sistema bo sistem morda potreboval dodelitev pomnilnika. Če jedro dovoljuje dodelitev vsega pomnilnika, bi lahko imelo težave, ko bi potreboval pomnilnik za redne operacije, da bi OS nemoteno deloval. Zato jedro ponuja nastavljive vm.min_free_kbytes. Z nastavljivo enoto bo upravitelj pomnilnika jedra ohranil vsaj X količino prostega pomnilnika. Tukaj je uradna definicija iz dokumentacija o jedru linux : To se uporablja za prisilitev Linux VM, da ohrani minimalno število kilobajtov. VM uporablja to številko za izračun vrednosti [WMARK_MIN] vodnega žiga za vsako nizko območje v sistemu. Vsako nizko območje dobi število rezerviranih brezplačnih strani, sorazmerno glede na velikost. Za zadostitev dodelitev PF_MEMALLOC je potrebna nekaj minimalne količine pomnilnika; če to nastavite na manj kot 1024 KB, bo vaš sistem subtilno pokvarjen in nagnjen k zastoju pri velikih obremenitvah. Če nastavite previsoko vrednost, bo naprava takoj zagnala OOM.







Preverjanje vm.min_free_kbytes deluje

Da bi preveril, ali nastavitev min_free_kbytes deluje, kot je bilo načrtovano, sem ustvaril navidezni primerek linux s samo 3,75 GB RAM -a. Za analizo sistema uporabite spodnji brezplačni ukaz:



#prost -m



Če pogledate zgornji pripomoček za prost pomnilnik z uporabo zastavice -m, da se vrednosti natisnejo v MB. Skupni pomnilnik je 3,5 do 3,75 GB pomnilnika. Uporablja se 121 MB pomnilnika, 3,3 GB pomnilnika je prostega, 251 MB pomnilnika uporablja predpomnilnik. Na voljo je 3,3 GB pomnilnika.





Zdaj bomo spremenili vrednost vm.min_free_kbytes in videli, kakšen je vpliv na sistemski pomnilnik. Novo vrednost bomo odzvali v virtualni datotečni sistem proc, da spremenimo vrednost parametra jedra, kot je prikazano spodaj:

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



Vidite lahko, da je bil parameter približno spremenjen na 1,5 GB in je začel veljati. Zdaj pa uporabimo prost znova ukaz, da vidite vse spremembe, ki jih sistem prepozna.

#prost -m

Prosti pomnilnik in medpomnilniški predpomnilnik se z ukazom ne spremenita, vendar je količina pomnilnika prikazana kot na voljo je bila zmanjšana s 3327 na 1222 MB. To je približno zmanjšanje spremembe parametra na 1,5 GB min prostega pomnilnika.

Ustvarimo 2 -GB podatkovno datoteko in si oglejmo, kaj branje te datoteke v predpomnilniku naredi z vrednostmi. Spodaj je opisano, kako ustvarite podatkovno datoteko 2 GB v 2 vrsticah bash skripta. Skript bo z ukazom dd ustvaril naključno datoteko velikosti 35 MB in jo nato 70 -krat kopiral v novo podatkovna_datoteka izhod:

# 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; Končano

Preberite datoteko in prezrite vsebino tako, da datoteko preberete in preusmerite v /dev /null, kot je prikazano spodaj:

#mačkapodatkovna_datoteka> /dev/nič

V redu, kaj se je s tem nizom manevrov zgodilo z našim sistemskim pomnilnikom, preverimo zdaj:

#prost -m

Analiza zgornjih rezultatov. Še vedno imamo 1,8 GB prostega pomnilnika, zato je jedro zaradi nastavitve min_free_kbytes zaščitilo velik del pomnilnika, ki je rezerviran. Vmesni predpomnilnik je porabil 1691 MB, kar je manj od skupne velikosti naše podatkovne datoteke, ki znaša 2,3 GB. Očitno celota podatkovna_datoteka ni bilo mogoče shraniti v predpomnilnik zaradi pomanjkanja razpoložljivega pomnilnika za uporabo medpomnilnika. Lahko potrdimo, da celotna datoteka ni shranjena v predpomnilniku, ampak časovno določi čas večkratnih poskusov branja datoteke. Če bi bil predpomnjen, bi za branje datoteke potreboval delček sekunde. Poskusimo.

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

Branje datoteke je trajalo skoraj 20 sekund, kar pomeni, da skoraj zagotovo ni predpomnjeno.

Kot zadnjo potrditev zmanjšajmo vm.min_free_kbytes, da bo imel predpomnilnik strani več prostora za delovanje, zato lahko pričakujemo, da bo predpomnilnik deloval in branje datoteke postalo veliko hitrejše.

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

Ker je na voljo dodaten pomnilnik za predpomnjenje datoteke, se je čas branja datoteke zmanjšal z 20 sekund prej na .364 sekund, vse skupaj pa je v predpomnilniku.

Zanima me še en poskus. Kaj se zgodi s klici malloc za dodelitev pomnilnika iz programa C ob tej res visoki nastavitvi vm.min_free_kbytes. Bo malloc spodletel? Bo sistem umrl? Najprej ponastavite nastavitev vm.min_free_kbytes na res visoko vrednost, da nadaljujete naše poskuse:

#vrgel ven 1500000 > /odstotkov/sys/vm/min_prosti_kbajtov

Poglejmo še enkrat naš prosti spomin:

Teoretično imamo 1,9 GB brezplačnega in 515 MB prostora na voljo. Uporabimo program stresnih testov, imenovan stress-ng, da uporabimo nekaj pomnilnika in vidimo, kje nam spodleti. Uporabili bomo vm tester in poskušali dodeliti 1 GB pomnilnika. Ker smo v sistemu s 3,75 GB rezervirali le 1,5 GB, mislim, da bi to moralo delovati.

# stress-ng --vm 1 --vm-bytes 1G-timeout 60s
stres: info:[17537]pošiljanje svinj:1vm
stres: info:[17537]dodelitev predpomnilnika: privzeta velikost predpomnilnika: 46080K
stres: info:[17537]uspešen tek zaključenv60.09s(1min,0,09suho)
# stress-ng --vm 2 --vm-bytes 1G-timeout 60s
# stress-ng --vm 3 --vm-bytes 1G-timeout 60s

Poskusimo znova z več delavci, lahko poskusimo z 1, 2, 3, 4 delavci in v nekem trenutku bi moralo spodleteti. V mojem testu je opravil z 1 in 2 delavcema, vendar s 3 delavci ni uspel.

Ponastavimo vm.min_free_kbytes na nizko število in poglejmo, ali nam to pomaga pri izvajanju treh stresorjev pomnilnika po 1 GB v sistemu 3,75 GB.

# echo 67584>/proc/sys/vm/min_free_kbytes
# stress-ng --vm 3 --vm-bytes 1G-timeout 60s

Tokrat je uspešno tekel brez napak, poskusil sem dvakrat brez težav. Tako lahko sklepam, da obstaja vedenjska razlika, ker je na voljo več pomnilnika za malloc, ko je vrednost vm.min_free_kbytes nastavljena na nižjo vrednost.

Privzeta nastavitev za vm.min_free_kbytes

Privzeta vrednost za nastavitev v mojem sistemu je 67584, kar je približno 1,8% RAM -a v sistemu ali 64 MB. Iz varnostnih razlogov na močno razbitem sistemu bi ga morda nekoliko povečal na 128 MB, da bi omogočil bolj rezerviran prosti pomnilnik, vendar se za povprečno uporabo zdi privzeta vrednost dovolj smiselna. Uradna dokumentacija opozarja na previsoko vrednost. Nastavitev na 5 ali 10% sistemskega RAM -a verjetno ni predvidena uporaba nastavitve in je previsoka.

Nastavitev vm.min_free_kbytes za preživetje ponovnega zagona

Da bi zagotovili, da lahko nastavitev preživi ponovni zagon in se pri ponovnem zagonu ne obnovi na privzete vrednosti, nastavite sysctl za stalno, tako da v datoteko /etc/sysctl.conf vnesete želeno novo vrednost.

Zaključek

Videli smo, da je mogoče prilagoditi jedro Linux vm.min_free_kbytes, ki ga je mogoče prilagoditi, in da lahko rezervira pomnilnik v sistemu, da bi zagotovil stabilnejši sistem, zlasti med veliko uporabo in velikimi dodelitvami pomnilnika. Privzete nastavitve so lahko nekoliko prenizke, zlasti v sistemih z velikim pomnilnikom, zato jih je treba skrbno povečati. Videli smo, da pomnilnik, ki ga rezervira ta nastavljiva naprava, preprečuje, da bi predpomnilnik OS uporabil ves pomnilnik in tudi nekaterim malloc operacijam preprečil uporabo celotnega pomnilnika.