Mikä on vm.min_free_kbytes ja miten se viritetään?

What Is Vm Min_free_kbytes

Mikä on vm.min_free_kbytes sysctl viritettävissä Linux -ytimelle ja mihin arvoon se pitäisi asettaa? Tässä artikkelissa tutkimme tätä parametria ja sen vaikutusta käynnissä olevaan linux -järjestelmään. Testaamme sen vaikutuksia käyttöjärjestelmän sivun välimuistiin ja malloc -tiedostoihin sekä mitä järjestelmän vapaa -komento näyttää, kun tämä parametri on asetettu. Teemme joitain perusteltuja arvauksia tämän viritettävän ihanteellisista arvoista ja näytämme kuinka asettaa vm.min_free_kbytes pysyvästi selviämään uudelleenkäynnistyksistä. Mennään siis.

Kuinka vm.min_free_kbytes toimii

Järjestelmä voi tarvita muistivarauksia järjestelmän asianmukaisen toiminnan varmistamiseksi. Jos ydin sallii kaiken muistin varaamisen, se saattaa joutua vaikeuksiin, kun se tarvitsee muistia säännöllisiin toimintoihin, jotta käyttöjärjestelmä toimisi sujuvasti. Siksi ydin tarjoaa viritettävät vm.min_free_kbytes. Säädettävä pakottaa ytimen muistinhallinnan pitämään vähintään X vapaata muistia. Tässä on virallinen määritelmä linux -ytimen dokumentaatio : Tätä käytetään pakottamaan Linux VM pitämään vähimmäismäärä kilotavuja vapaana. Virtuaalikone käyttää tätä numeroa vesileiman [WMARK_MIN] arvon laskemiseen järjestelmän jokaiselle matalavyöhykkeelle. Jokainen lowmem -alue saa useita varattuja ilmaisia ​​sivuja suhteessa sen kokoon. PF_MEMALLOC -varausten täyttämiseen tarvitaan vain vähän muistia; Jos asetat tämän alle 1024 kt, järjestelmäsi rikkoutuu hienovaraisesti ja altistuu umpikujalle suurilla kuormituksilla. Jos asetat tämän liian korkeaksi, koneesi käynnistyy välittömästi.



Validating vm.min_free_kbytes Works

Jotta voisin testata, että min_free_kbytes -asetus toimii suunnitellulla tavalla, olen luonut virtuaalisen linux -instanssin, jossa on vain 3,75 Gt RAM -muistia. Analysoi järjestelmä alla olevan ilmaisen komennon avulla:



#vapaa -m



Tarkastellaan yllä olevaa vapaata muistityökalua käyttämällä -m -lippua, jotta arvot tulostetaan Mt. Muistin kokonaismäärä on 3,5 - 3,75 Gt. Muistia käytetään 121 Mt, muistia on vapaana 3,3 Gt, puskurivälimuisti käyttää 251 Mt. Ja käytettävissä on 3,3 Gt muistia.

Nyt aiomme muuttaa vm.min_free_kbytes arvoa ja nähdä, mikä vaikutus on järjestelmän muistiin. Toistamme uuden arvon proc -virtuaalitiedostojärjestelmään muuttaaksemme ytimen parametrin arvon alla kuvatulla tavalla:

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



Näet, että parametri muutettiin noin 1,5 Gt: ksi ja on tullut voimaan. Käytämme nyt vapaa komento uudelleen nähdäksesi kaikki järjestelmän tunnistamat muutokset.

#vapaa -m

Vapaa muisti ja puskurivälimuisti eivät muutu komennolla, mutta muistin määrä näytetään muodossa saatavilla on pienennetty 3327: sta 1222 megatavuun. Tämä on likimääräinen vähennys parametrin muutoksesta 1,5 Gt: n vapaaseen muistiin.

Luodaan nyt 2 Gt: n datatiedosto ja katsotaan sitten, mitä tiedoston lukeminen puskurivälimuistiin tekee arvoille. Näin voit luoda 2 Gt: n datatiedoston kahdella rivillä bash -komentosarjaa alla. Skripti luo 35 megatavun satunnaistiedoston dd -komennolla ja kopioi sen sitten 70 kertaa uuteen tiedosto lähtö:

# dd if =/dev/random of =/root/d1.txt count = 1000000
# i: lle 'sarja 170'; toista $ i; kissa /root /d1.txt >> /root /data_file; tehty

Luetaan tiedosto ja ohitetaan sen sisältö lukemalla ja ohjaamalla tiedosto seuraavaan osoitteeseen /dev /null:

#kissatiedosto> /dev/tyhjä

Ok, mitä järjestelmämuistillemme on tapahtunut tämän liikkeen avulla, tarkistetaan se nyt:

#vapaa -m

Analysoidaan yllä olevat tulokset. Meillä on edelleen 1,8 Gt vapaata muistia, joten ydin on suojannut suuren osan muistista varattuna min_free_kbytes -asetuksemme vuoksi. Puskurivälimuisti on käyttänyt 1691 Mt, mikä on pienempi kuin datatiedostomme koko, joka on 2,3 Gt. Ilmeisesti koko tiedosto ei voitu tallentaa välimuistiin puskurivälimuistissa käytettävän muistin puutteen vuoksi. Voimme vahvistaa, että koko tiedostoa ei tallenneta välimuistiin, mutta ajoitamme tiedoston toistuvat lukemisyritykset. Jos se tallennetaan välimuistiin, tiedoston lukeminen kestää sekunnin murto -osan. Kokeillaan.

# aika kissan data_tiedosto> /dev /null
# aika kissan data_tiedosto> /dev /null

Tiedoston lukeminen kesti lähes 20 sekuntia, mikä tarkoittaa, että se ei varmasti ole kaikki välimuistissa.

Lopullisena vahvistuksena pienennämme vm.min_free_kbytejä, jotta sivun välimuistilla on enemmän tilaa toimia, ja voimme odottaa näkevän välimuistin toimivan ja tiedoston lukemisen nopeutuvan.

# echo 67584>/proc/sys/vm/min_free_kbytes
# aika kissan data_tiedosto> /dev /null
# aika kissan data_tiedosto> /dev /null

Kun tallennustilassa on ylimääräistä muistia, tiedoston lukuaika laski 20 sekunnista 0,364 sekuntiin, ja kaikki oli välimuistissa.

Olen utelias tekemään toisen kokeen. Mitä tapahtuu malloc -puheluille C -ohjelman muistin varaamiseksi tämän todella korkean vm.min_free_kbytes -asetuksen edessä. Epäonnistuko se mallocissa? Kuoleeko järjestelmä? Palauta ensin vm.min_free_kbytes -asetus todella korkeaksi, jotta voimme jatkaa kokeilujamme:

#heitti pois 1500000 > /prosenttia/sys/vm/min_free_kbyytes

Katsotaanpa jälleen vapaata muistiamme:

Teoriassa meillä on vapaana 1,9 Gt ja 515 Mt. Käytämme stressitestiohjelmaa nimeltä stress-ng, jotta voimme käyttää muistia ja nähdä, missä epäonnistumme. Käytämme vm -testeriä ja yritämme varata 1 Gt muistia. Koska olemme varanneet vain 1,5 Gt 3,75 Gt: n järjestelmässä, tämän pitäisi toimia.

# stress-ng --vm 1 --vm-tavua 1G-aikakatkaisu 60s
stressi: info:[17537]sian lähettäminen:1vm
stressi: info:[17537]välimuisti varaa: välimuistin oletuskoko: 46080K
stressi: info:[17537]onnistunut ajo suoritettusisään60.09s(1min,0,09kuiva)
# stress-ng --vm 2 --vm-tavua 1G-aikakatkaisu 60s
# stress-ng --vm 3 --vm-tavua 1G-aikakatkaisu 60s

Yritetään uudelleen useamman työntekijän kanssa, voimme kokeilla 1, 2, 3, 4 työntekijää ja jossain vaiheessa sen pitäisi epäonnistua. Testissäni se läpäisi 1 ja 2 työntekijää, mutta epäonnistui 3 työntekijän kanssa.

Palautetaan vm.min_free_kbytes pieneen määrään ja katsotaan, auttaako se meitä käyttämään kolmea muistitason stressitekijää, joista kukin on 1 Gt 3,75 Gt: n järjestelmässä.

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

Tällä kertaa se toimi onnistuneesti ilman virhettä, kokeilin sitä kaksi kertaa ilman ongelmia. Joten voin päätellä, että käyttäytymisessä on eroa siitä, että mallocille on saatavilla enemmän muistia, kun vm.min_free_kbytes arvo on asetettu pienemmäksi.

Vm.min_free_kbytes oletusasetus

Järjestelmäni asetuksen oletusarvo on 67584, joka on noin 1,8% järjestelmän RAM -muistista tai 64 Mt. Turvallisuussyistä raskaasti kaatuneessa järjestelmässä haluaisin lisätä sitä hieman ehkä 128 Mt: iin, jotta vapaata muistia voidaan varata enemmän, mutta keskimääräisellä käytöllä oletusarvo vaikuttaa riittävän järkevältä. Virallinen dokumentaatio varoittaa arvon nostamisesta liian suureksi. Sen asettaminen 5 tai 10%: iin järjestelmän RAM -muistista ei todennäköisesti ole asetuksen tarkoitus ja se on liian korkea.

Asetetaan vm.min_free_kbytes selviämään uudelleenkäynnistyksestä

Varmistaaksesi, että asetus selviytyy uudelleenkäynnistyksistä eikä sitä palauteta oletusarvoihin uudelleenkäynnistyksen yhteydessä, muista tehdä sysctl -asetuksesta pysyvä lisäämällä haluttu uusi arvo /etc/sysctl.conf -tiedostoon.

Johtopäätös

Olemme nähneet, että viritettävää vm.min_free_kbytes linux -ydintä voidaan muokata ja se voi varata muistia järjestelmään, jotta järjestelmä olisi vakaampi erityisesti raskaan käytön ja raskaiden muistien varausten aikana. Oletusasetukset voivat olla hieman liian alhaiset, etenkin korkean muistin järjestelmissä, ja niitä on harkittava suurentamalla huolellisesti. Olemme nähneet, että tämän viritettävän muistin varaama käyttö estää käyttöjärjestelmän välimuistin käyttämästä koko muistia ja estää myös joidenkin malloc -toimintojen käyttämästä koko muistia.