Mi az a vm.min_free_kbytes és hogyan kell hangolni?

What Is Vm Min_free_kbytes



Mi a vm.min_free_kbytes sysctl hangolható a linux kernel számára, és milyen értékre kell beállítani? Ebben a cikkben tanulmányozzuk ezt a paramétert és azt, hogy ez hogyan befolyásolja a futó linuxos rendszert. Tesztelni fogjuk a hatását az OS oldal gyorsítótárában és a rosszindulatú fájlokban, valamint azt, hogy a rendszer ingyenes parancs mit jelenít meg ennek a paraméternek a beállításakor. Néhány alapos találgatást fogunk tenni a hangolható ideális értékekről, és megmutatjuk, hogyan lehet a vm.min_free_kbytes véglegesen beállítani az újraindítások túlélését. Akkor gyerünk.

Hogyan működik a vm.min_free_kbytes

A rendszernek szüksége lehet memóriakiosztásra annak érdekében, hogy biztosítsa a rendszer megfelelő működését. Ha a kernel lehetővé teszi az összes memória kiosztását, akkor nehézségekbe ütközhet, ha a rendszeres műveletekhez memóriára van szüksége az operációs rendszer zökkenőmentes működéséhez. Ezért a kernel biztosítja a hangolható vm.min_free_kbyte -ot. A hangolható kényszeríti a kernel memóriakezelőjét, hogy legalább X mennyiségű szabad memóriát tartson fenn. Itt a hivatalos definíció a linux kernel dokumentáció : Ezzel arra kényszerítik a Linux virtuális gépet, hogy minimális számú kilobájt szabad legyen. A virtuális gép ezt a számot használja a vízjel [WMARK_MIN] értékének kiszámításához a rendszer minden alacsony szintű zónájához. Minden lowmem zóna számos fenntartott ingyenes oldalt kap a méretétől függően. Minimális memóriamennyiség szükséges a PF_MEMALLOC kiosztások kielégítéséhez; Ha ezt 1024 KB alá állítja be, a rendszer finoman tönkremegy, és nagy terhelés esetén hajlamos a holtpontra. Ha ezt túl magasra állítja, azonnal OOM lesz a gép.







A vm.min_free_kbytes Works ellenőrzése

Annak tesztelésére, hogy a min_free_kbytes beállítás megfelelően működik -e, létrehoztam egy linuxos virtuális példányt, amely mindössze 3,75 GB RAM -mal rendelkezik. Használja az alábbi ingyenes parancsot a rendszer elemzéséhez:



#ingyenes -m



Nézze meg a fenti szabad memória segédprogramot a -m jelző használatával, hogy az értékek MB -ban legyenek kinyomtatva. A teljes memória 3,5-3,75 GB memória. 121 MB memória, 3,3 GB szabad memória, 251 MB a puffer gyorsítótár. És 3,3 GB memória áll rendelkezésre.





Most megváltoztatjuk a vm.min_free_kbytes értékét, és megnézzük, milyen hatással van a rendszer memóriájára. Az új értéket visszhangozzuk a proc virtuális fájlrendszeréhez, hogy megváltoztassuk a kernel paraméter értékét az alábbiak szerint:

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



Látható, hogy a paraméter hozzávetőleg 1,5 GB -ra változott, és életbe lépett. Most használjuk a ingyenes parancsot, hogy megnézze a rendszer által felismert változásokat.

#ingyenes -m

A szabad memória és a puffer gyorsítótár nem változik a paranccsal, de a memória mennyisége mint elérhető 3327 -ről 1222 MB -ra csökkent. Ez hozzávetőlegesen csökkenti a paraméter változását 1,5 GB perc szabad memóriára.

Most hozzunk létre egy 2 GB -os adatfájlt, majd nézzük meg, hogy az adott fájl puffer -gyorsítótárba való beolvasása mit jelent az értékekkel. Az alábbiakban bemutatjuk, hogyan hozhat létre 2 GB -os adatfájlt az alábbi 2 sor bash -szkriptben. A szkript 35 MB -os véletlenszerű fájlt hoz létre a dd paranccsal, majd 70 -szer másolja át egy újba data_file Kimenet:

# dd if =/dev/random of =/root/d1.txt count = 1000000
# i az `170. sorban '; do echo $ i; cat /gyökér/d1.txt >> /root /data_file; Kész

Olvassuk el a fájlt, és figyelmen kívül hagyjuk a tartalmát az alábbi módon olvasva és átirányítva a /dev /null mappába:

#macskadata_file> /dev/nulla

Ok, mi történt a rendszer memóriájával ezzel a manőverekkel, akkor most nézzük meg:

#ingyenes -m

A fenti eredmények elemzése. Még mindig 1,8 GB szabad memóriánk van, így a kernel a memória egy nagy részét lefoglaltként védte a min_free_kbytes beállítás miatt. A puffer gyorsítótár 1691 MB -ot használt, ami kevesebb, mint az adatfájlunk teljes mérete, ami 2,3 GB. Nyilván az egész data_file nem lehet tárolni a gyorsítótárban, mert nincs elegendő memória a puffer gyorsítótárhoz. Ellenőrizhetjük, hogy a teljes fájl nincs -e tárolva a gyorsítótárban, hanem időzítjük a fájl ismételt olvasási kísérleteit. Ha gyorsítótárazott, akkor a másodperc töredéke alatt el kell olvasni a fájlt. Próbáljuk ki.

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

A fájl olvasása majdnem 20 másodpercet vett igénybe, ami azt jelenti, hogy szinte biztosan nem minden tárolt.

Végső ellenőrzésként csökkentsük a vm.min_free_kbyte -ot, hogy az oldal gyorsítótárának több helye legyen a működésre, és számíthatunk arra, hogy a gyorsítótár működik, és a fájl olvasása sokkal gyorsabb lesz.

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

A gyorsítótárazáshoz rendelkezésre álló többletmemóriával a fájl olvasási ideje az előző 20 másodpercről 0,364 másodpercre csökkent, mindezt a gyorsítótárban.

Kíváncsi vagyok egy újabb kísérletre. Mi történik a malloc hívásokkal, hogy memóriát foglaljon ki egy C programból ezzel az igazán magas vm.min_free_kbytes beállítással. Nem fog sikerülni a malloc? Meghal a rendszer? A kísérletek folytatásához először állítsa vissza a vm.min_free_kbytes beállítást az igazán magas értékre:

#kidobta 1500000 > /százalék/sys/vm/min_free_kbytes

Nézzük újra szabad memóriánkat:

Elméletileg 1,9 GB szabad és 515 MB áll rendelkezésre. Használjunk stressz-teszt programot, a stressz-ng-t, hogy használjunk memóriát, és lássuk, hol hibázunk. A vm tesztert fogjuk használni, és megpróbálunk 1 GB memóriát kiosztani. Mivel csak 1,5 GB -ot foglaltunk le 3,75 GB -os rendszeren, azt hiszem, ennek működnie kell.

# stress-ng --vm 1 --vm-byte 1G-timeout 60s
stressz: info:[17537]disznó disznó:1vm
stressz: info:[17537]cache allocate: alapértelmezett gyorsítótár -méret: 46080K
stressz: info:[17537]sikeres futás befejeződöttban ben60.09s(1perc,0,09száraz)
# stress-ng --vm 2 --vm-byte 1G-timeout 60s
# stress-ng --vm 3 --vm-byte 1G-timeout 60s

Próbáljuk meg újra több dolgozóval, megpróbálhatunk 1, 2, 3, 4 dolgozót, és valamikor meghiúsul. A tesztemben 1 és 2 dolgozóval sikerült, de 3 munkással nem sikerült.

Állítsuk vissza a vm.min_free_kbyte -t ​​alacsony számra, és nézzük meg, hogy ez segít -e 3 memória stresszor futtatásában, egyenként 1 GB -mal egy 3,75 GB -os rendszeren.

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

Ezúttal sikeresen futott hiba nélkül, kétszer próbáltam meg gond nélkül. Így megállapíthatom, hogy viselkedésbeli különbség van abban, hogy több memória áll rendelkezésre a malloc számára, ha a vm.min_free_kbytes érték alacsonyabbra van állítva.

A vm.min_free_kbytes alapértelmezett beállítása

A rendszer alapértelmezett értéke 67584, ami a rendszer RAM -jának körülbelül 1,8% -a vagy 64 MB. Biztonsági okokból egy erősen ütköző rendszerben hajlamos vagyok egy kicsit talán 128 MB -ra növelni, hogy fenntartsam a szabad memóriát, de átlagos használat esetén az alapértelmezett érték elég ésszerűnek tűnik. A hivatalos dokumentáció figyelmeztet az érték túl magasra emelésére. A rendszer RAM -jának 5 vagy 10% -ára való beállítása valószínűleg nem a beállítás rendeltetésszerű használata, és túl magas.

A vm.min_free_kbytes beállítása az újraindítás túléléséhez

Annak érdekében, hogy a beállítás túlélje az újraindítást, és ne állítsa vissza az alapértelmezett értékeket újraindításkor, győződjön meg arról, hogy a sysctl beállítása tartós lesz, ha a kívánt új értéket a /etc/sysctl.conf fájlba helyezi.

Következtetés

Láttuk, hogy a hangolható vm.min_free_kbytes linux kernel módosítható, és lefoglalhatja a memóriát a rendszeren annak érdekében, hogy a rendszer stabilabb legyen, különösen nagy igénybevétel és nagy memóriakiosztás esetén. Az alapértelmezett beállítások kissé túl alacsonyak lehetnek, különösen nagy memóriájú rendszereknél, és gondosan növelni kell őket. Láttuk, hogy a beállítható memória megakadályozza az operációs rendszer gyorsítótárának a teljes memória használatát, és megakadályozza azt is, hogy egyes rosszindulatú műveletek az összes memóriát is felhasználják.