Hogy vm.A min_free_kbytes működik
Memóriakiosztásra lehet szüksége a rendszernek a rendszer megfelelő működésének biztosítása érdekében. Ha a kern 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 zavartalan működése érdekében. Ezért a kern biztosítja a hangolható vm-t.min_ szabad_kbyte. A hangolás arra kényszeríti a kernel memóriakezelőjét, hogy legalább X mennyiségű szabad memóriát tartson meg. Itt van a hivatalos meghatározás a linux kernel dokumentáció: „Ezzel arra kényszerítik a Linux virtuális gépét, hogy minimális számú kilobájt szabadon maradjon. A virtuális gép ezt a számot használja a vízjel [WMARK_MIN] érték kiszámításához a rendszer minden alacsony memóriájú zónájához. Minden alacsonyabb szintű zóna számos lefoglalt ingyenes oldalt kap méretétől függően. A PF_MEMALLOC allokációk kielégítéséhez minimális memóriamennyiség szükséges; ha ezt 1024 KB-nál alacsonyabbra állítja, a rendszere finoman megszakad és nagy terhelés esetén holtpontra hajlamos. Ha ezt túl magasra állítja, azonnal OOM lesz a gépe.„
A vm érvényesítése.min_free_kbytes Works
Annak tesztelésére, hogy a min_free_kbytes beállítása megfelelően működik-e, létrehoztam egy linuxos virtuális példányt, csak 3.75 GB RAM. A rendszer elemzéséhez használja az alábbi ingyenes parancsot:
# szabad -m
Megtekintve a fenti szabad memória segédprogramot az -m jelzővel, hogy az értékeket MB-ban nyomtassák. A teljes memória 3.5–3.75 GB memória. 121 MB memória kerül felhasználásra, 3.3 GB memória szabad, 251 MB-ot használ a puffer gyorsítótár. És 3.3 GB memória áll rendelkezésre.
Most meg fogjuk változtatni a vm értékét.min_free_kbytes, és nézze meg, milyen hatással van a rendszer memóriájára. Visszhangozzuk az új értéket a proc virtuális fájlrendszerre, hogy megváltoztassuk a kernel paraméter értékét az alábbiak szerint:
# echo 1500000> / proc / sys / vm / min_free_kbyte# sysctl vm.min_ szabad_kbyte
Láthatja, hogy a paraméter 1-re változott.Körülbelül 5 GB, és életbe lépett. Most használjuk a ingyenes parancsot újra a rendszer által felismert változások megtekintéséhez.
# szabad -m
A szabad memóriát és a puffer gyorsítótárat a parancs nem változtatja meg, de a memória mennyiségét a elérhető 3327-ről 1222 MB-ra csökkent. Ami hozzávetőlegesen csökkenti a paraméter változását 1-re.5 GB perc szabad memória.
Most hozzunk létre egy 2 GB-os adatfájlt, majd nézzük meg, hogy a puffer gyorsítótárba való beolvasás mit tesz az értékekkel. Így hozhat létre 2 GB-os adatfájlt az alábbi bash szkript 2 sorában. A szkript egy 35 MB-os véletlenszerű fájlt generál a dd paranccsal, majd 70-szer másolja át egy újba adatfájl Kimenet:
# dd, ha = / dev / véletlenszerű = / root / d1.txt szám = 1000000# az i-re '1 70. szekvencia'; do echo $ i; macska / gyökér / d1.txt >> / root / data_file; Kész
Olvassuk el a fájlt, és hagyjuk figyelmen kívül a tartalmat úgy, hogy elolvassuk és átirányítjuk a fájlt a / dev / null fájlba az alábbiak szerint:
# cat data_file> / dev / nullOk, mi történt a rendszer memóriájával ezzel a manőverkészlettel, ellenőrizzük most:
# szabad -m
A fenti eredmények elemzése. Még mindig van 1.8 GB szabad memória, így a kernel lefoglalt egy nagy memóriaterületet a min_free_kbytes beállítás miatt. A puffer gyorsítótár 1691 MB-ot használt fel, ami kisebb, mint az adatfájlunk teljes mérete, amely 2.3 GB. Nyilván az egész adat_fájl nem sikerült tárolni a gyorsítótárban, mivel nem volt rendelkezésre álló memória a puffer gyorsítótár számára. Ellenőrizhetjük, hogy a teljes fájlt nem tároljuk-e a gyorsítótárban, de időzítjük a fájl olvasásának ismételt kísérleteit. Ha gyorsítótárban van, akkor a fájl elolvasása másodperc töredékét veszi igénybe. Próbáljuk ki.
# time cat data_file> / dev / null# time cat data_file> / dev / null
Az olvasott fájl csaknem 20 másodpercet vett igénybe, ami azt jelenti, hogy szinte biztos, hogy nem minden tárolt.
Végső validálásként csökkentsük a vm értéket.min_free_kbyte, 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ájlolvasás sokkal gyorsabb lesz.
# echo 67584> / proc / sys / vm / min_free_kbyte# time cat data_file> / dev / null
# time cat data_file> / dev / null
A fájlok gyorsítótárazásához rendelkezésre álló extra memóriával a fájl olvasási ideje az előző 20 másodpercről az előzőre csökkent .364 másodperc, mindez gyorsítótárban.
Kíváncsi vagyok egy újabb kísérlet elvégzésére. Mi történik a malloc-hívásokkal, hogy memóriát foglaljon le egy C programból, szemben ezzel az igazán magas vm-mel.min_free_kbytes beállítás. Megbukik-e a mallocon? Meg fog halni a rendszer? Először állítsa vissza a vm-et.A min_free_kbytes nagyon magas értékre állítva folytathatja kísérleteinket:
# echo 1500000> / proc / sys / vm / min_free_kbytesNézzük újra szabad memóriánkat:
Elméletileg van 1.9 GB szabad és 515 MB szabad. Használjunk stressz-ng nevű stresszteszt programot annak érdekében, hogy használjunk némi memóriát és megnézzük, hol bukunk meg. Használjuk a vm tesztelőt, és megpróbálunk lefoglalni 1 GB memóriát. Mivel csak 1-et foglaltunk.5 GB a 3-on.75 GB-os rendszer, azt hiszem, ennek működnie kell.
# stress-ng --vm 1 --vm-byte 1G - 60-as időkorlátstress-ng: info: [17537] disznók diszpécsere: 1 vm
stress-ng: info: [17537] cache kiosztás: alapértelmezett cache méret: 46080K
stress-ng: info: [17537] sikeres futás teljesítve 60-ban.09s (1 perc, 0.09 mp)
# stress-ng --vm 2 --vm-bájt 1G - 60-as időkorlát
# stress-ng --vm 3 --vm-bájt 1G - 60-as időkorlát
Próbáljuk meg újra több dolgozóval, megpróbálhatunk 1, 2, 3, 4 dolgozót, és valamikor meghiúsulhat. A tesztem során 1 és 2 dolgozóval teljesített, de 3 munkásnál nem sikerült.
Állítsuk vissza a vm-et.min_free_kbyte alacsony számra, és nézze meg, hogy ez segít-e 3 memória stresszor futtatásában, egyenként 1 GB-mal egy 3-ason.75 GB-os rendszer.
# echo 67584> / proc / sys / vm / min_free_kbyte# stress-ng --vm 3 --vm-bájt 1G - 60-as időkorlát
Ezúttal hiba nélkül sikeresen futott, két alkalommal kipróbáltam problémamentesen. Tehát arra a következtetésre juthatok, hogy van egy viselkedési különbség abban, hogy több memória áll rendelkezésre a malloc számára, amikor a vm.A min_free_kbytes értéket alacsonyabbra állítjuk.
Alapértelmezett beállítás a vm számára.min_ szabad_kbyte
A rendszerem alapértelmezett értéke 67584, ami körülbelül 1.A rendszer RAM-jának 8% -a vagy 64 MB. Biztonsági okokból egy erősen összeomlott rendszeren hajlamos vagyok kissé növelni azt 128 MB-ig, hogy fenntartottabb szabad memória álljon rendelkezésre, azonban átlagos használat esetén az alapértelmezett érték elég értelmesnek tűnik. A hivatalos dokumentáció arra figyelmeztet, hogy az érték túl magas legyen. Ha a rendszer RAM-jának 5 vagy 10% -át állítja be, valószínűleg nem a beállítás rendeltetése, és túl magas.
Beállítás vm.min_free_kbyte az újraindítás túlélése érdekében
Annak biztosítása érdekében, hogy a beállítás túlélje az újraindítást, és az újraindításkor ne állítsa vissza az alapértelmezett értékeket, ügyeljen arra, hogy a sysctl beállítást tartósan állítsa be a kívánt új érték beírásával az / etc / sysctl fájlba.conf fájl.
Következtetés
Láttuk, hogy a vm.min_free_kbytes linux kernel módosítható és lefoglalhatja a memóriát a rendszeren annak biztosítása érdekében, hogy a rendszer stabilabb legyen, különösen nagy igénybevétel és nehéz memóriaallokációk idején. Az alapértelmezett beállítások kissé túl alacsonyak lehetnek, különösen a nagy memóriájú rendszereken, és gondosan meg kell fontolni őket. Láttuk, hogy az e hangolás által lefoglalt memória megakadályozza, hogy az operációs rendszer gyorsítótár az egész memóriát felhasználja, és néhány malloc műveletnél megakadályozza az összes memória felhasználását.