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 -mSlobodna 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/nullU redu, što se dogodilo s našom memorijom sustava s ovim nizom manevara, provjerimo sada:
#besplatno -mAnalizirajuć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_kbajtaPogledajmo 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 60sstres: 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.