Što je vm.min_free_kbytes i kako ga podesiti?

What Is Vm Min_free_kbytes



Što je vm.min_free_kbytes sysctl podesiv za Linux kernel i na koju vrijednost treba postaviti? U ovom ćemo članku proučiti ovaj parametar i njegov utjecaj na pokrenuti linux sustav. Testirat ćemo njegov utjecaj na predmemoriju stranice OS -a i na mallokove te na to što pokazuje naredba besplatnog sustava kada je postavljen ovaj parametar. Napravit ćemo neke poučne pretpostavke o idealnim vrijednostima za ovo podesivo i pokazat ćemo kako trajno postaviti vm.min_free_kbytes da preživi ponovna pokretanja. Pa, idemo.

Kako vm.min_free_kbytes radi

Dodjela memorije sustavu može biti potrebna kako bi se osiguralo pravilno funkcioniranje samog sustava. Ako kernel dopušta dodjelu sve memorije, mogao bi imati problema kad mu je potrebna memorija za redovite operacije kako bi OS neometano radio. Zato jezgra nudi podesive vm.min_free_kbytes. Podešavanje će prisiliti upravljački program memorije kernela da zadrži najmanje X količinu slobodne memorije. Evo službene definicije iz dokumentacija jezgre linux : Ovo se koristi za prisiljavanje Linux VM -a da minimalni broj kilobajta ostane slobodan. VM koristi ovaj broj za izračunavanje vrijednosti vodenog žiga [WMARK_MIN] za svaku nisku memorijsku zonu u sustavu. Svaka lowmem zona dobiva određeni broj rezerviranih besplatnih stranica temeljenih na proporcionalnoj veličini. Potrebna je minimalna količina memorije kako bi se zadovoljile dodjele PF_MEMALLOC; ako ovo postavite na manje od 1024 KB, vaš će se sustav suptilno pokvariti i biti sklon zastoju pod velikim opterećenjima. Ako postavite ovo previsoko stanje, vaš će stroj odmah OOM.







Potvrđivanje vm.min_free_kbytes radi

Kako bih provjerio funkcionira li postavka min_free_kbytes, stvorio sam virtualnu instancu linux sa samo 3,75 GB RAM -a. Za analizu sustava upotrijebite donju besplatnu naredbu:



#besplatno -m



Gledajući gornji pomoćni program za slobodnu memoriju koristeći zastavicu -m za ispisivanje vrijednosti u MB. Ukupna memorija je 3,5 do 3,75 GB memorije. Koristi se 121 MB memorije, 3,3 GB memorije je besplatno, 251 MB koristi međuspremnik. Dostupno je i 3,3 GB memorije.





Sada ćemo promijeniti vrijednost vm.min_free_kbytes i vidjeti kakav je utjecaj na memoriju sustava. Ponovit ćemo novu vrijednost virtualnom datotečnom sustavu proc kako bismo promijenili vrijednost parametra jezgre prema dolje:

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



Možete vidjeti da je parametar promijenjen približno na 1,5 GB i stupio je na snagu. Sada iskoristimo besplatno naredite ponovno da vidite sve promjene koje sustav prepoznaje.

#besplatno -m

Slobodna memorija i međuspremnik se ne mijenjaju naredbom, ali količina memorije prikazana je kao dostupno smanjen je sa 3327 na 1222 MB. Što je približno smanjenje promjene parametra na 1,5 GB min slobodne memorije.

Sada napravimo podatkovnu datoteku od 2 GB, a zatim vidimo što čitanje te datoteke u predmemoriji međuspremnika čini vrijednostima. Evo kako stvoriti datoteku s podacima od 2 GB u 2 retka bash skripte ispod. Skripta će generirati nasumičnu datoteku od 35 MB pomoću naredbe dd, a zatim je 70 puta kopirati u novu podatkovna datoteka izlaz:

# dd if =/dev/random of =/root/d1.txt count = 1000000
# for i u `seq 1 70`; do echo $ i; cat /root/d1.txt >> /root /datoteka_datoteke; učinjeno

Pročitajmo datoteku i zanemarimo sadržaj čitanjem i preusmjeravanjem datoteke na /dev /null prema dolje:

#mačkapodatkovna datoteka> /dev/null

U redu, što se dogodilo s našom memorijom sustava s ovim nizom manevara, provjerimo sada:

#besplatno -m

Analizirajući gornje rezultate. Još uvijek imamo 1,8 GB slobodne memorije pa je kernel zaštitio veliki dio memorije rezerviran zbog naše postavke min_free_kbytes. Međuspremnik je iskoristio 1691 MB, što je manje od ukupne veličine naše podatkovne datoteke koja iznosi 2,3 GB. Očigledno cijeli podatkovna datoteka nije se moglo pohraniti u predmemoriju zbog nedostatka raspoložive memorije za korištenje u međuspremniku. Možemo potvrditi da cijela datoteka nije pohranjena u predmemoriji, već tempirati ponovljene pokušaje čitanja datoteke. Da se spremi u memoriju, bit će potrebno djelić sekunde za čitanje datoteke. Pokušajmo.

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

Čitanje datoteke trajalo je gotovo 20 sekundi, što znači da gotovo sigurno nije sve predmemorirano.

Kao posljednju provjeru, smanjimo vm.min_free_kbytes kako bismo omogućili predmemoriji stranice više prostora za rad, pa možemo očekivati ​​da predmemorija radi, a čitanje datoteke postaje sve brže.

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

Uz dodatnu memoriju dostupnu za predmemoriranje, vrijeme čitanja datoteke palo je s 20 sekundi prije na .364 sekunde, a sve je to u predmemoriji.

Zanima me napraviti još jedan eksperiment. Što se događa s malloc pozivima za dodjelu memorije iz C programa u odnosu na ovu jako visoku postavku vm.min_free_kbytes. Hoće li uspjeti malloc? Hoće li sustav umrijeti? Najprije vratite postavku vm.min_free_kbytes na zaista visoku vrijednost da biste nastavili s našim eksperimentima:

#izbaciti 1500000 > /posto/sys/vm/min_slobodnih_kbajta

Pogledajmo ponovno naše slobodno pamćenje:

Teoretski imamo 1,9 GB besplatnih i 515 MB dostupnih. Upotrijebimo program testiranja otpornosti na stres koji se naziva stres-ng kako bismo upotrijebili malo memorije i vidjeli gdje ne uspijevamo. Koristit ćemo vm tester i pokušati dodijeliti 1 GB memorije. Budući da smo rezervirali samo 1,5 GB na sustavu od 3,75 GB, pretpostavljam da bi ovo trebalo funkcionirati.

# stress-ng --vm 1 --vm-bytes 1G-timeout 60s
stres: info:[17537]otpremanje svinja:1vm
stres: info:[17537]alociranje predmemorije: zadana veličina predmemorije: 46080K
stres: info:[17537]uspješna vožnja dovršenau60.09s(1min,0,09suho)
# stress-ng --vm 2 --vm-bytes 1G-timeout 60s
# stress-ng --vm 3 --vm-bytes 1G-timeout 60s

Pokušajmo ponovno s više radnika, možemo pokušati s 1, 2, 3, 4 radnika i u jednom trenutku bi to trebalo uspjeti. U mom testu je prošao s 1 i 2 radnika, ali nije uspio s 3 radnika.

Vratimo vm.min_free_kbytes na mali broj i provjerimo pomaže li nam to u pokretanju 3 stresora za memoriju s po 1 GB na sustavu od 3,75 GB.

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

Ovaj put je uspio bez greške, pokušao sam dva puta bez problema. Stoga mogu zaključiti da postoji razlika u ponašanju što ima više memorije na raspolaganju za malloc, kada je vrijednost vm.min_free_kbytes postavljena na nižu vrijednost.

Zadana postavka za vm.min_free_kbytes

Zadana vrijednost za postavku na mom sustavu je 67584, što je oko 1,8% RAM -a na sustavu ili 64 MB. Iz sigurnosnih razloga na jako razbijenom sustavu nastojao bih ga malo povećati na 128 MB kako bi se omogućila rezerviranija slobodna memorija, no za prosječnu upotrebu zadana vrijednost čini se dovoljno razumnom. Službena dokumentacija upozorava na previsoku vrijednost. Postavljanje na 5 ili 10% RAM -a sustava vjerojatno nije namjeravana upotreba postavke i previsoka je.

Postavljanje vm.min_free_kbytes za preživljavanje ponovnog pokretanja

Kako bi se osiguralo da postavka može preživjeti ponovno podizanje sustava i da se pri ponovnom pokretanju ne vraća na zadane vrijednosti, obavezno učinite postavku sysctl trajnom stavljanjem željene nove vrijednosti u datoteku /etc/sysctl.conf.

Zaključak

Vidjeli smo da se vm.min_free_kbytes linux kernel može podesiti i može rezervirati memoriju u sustavu kako bi se osiguralo da je sustav stabilniji, osobito tijekom velike upotrebe i velikih dodjele memorije. Zadane postavke mogu biti malo preniske, osobito na sustavima s velikom memorijom, pa ih treba pažljivo povećati. Vidjeli smo da memorija rezervirana ovim podesivim sprečava predmemoriju OS -a da koristi svu memoriju, a također sprječava i neke malloc operacije da koriste svu memoriju.