Prestatie

Wat is vm.min_free_kbytes en hoe het af te stemmen?

Wat is vm.min_free_kbytes en hoe het af te stemmen?
Wat is vm.min_free_kbytes sysctl afstembaar voor linux-kernel en op welke waarde moet deze worden ingesteld??  In dit artikel zullen we deze parameter en de invloed ervan op een draaiend Linux-systeem bestuderen.  We zullen de impact ervan testen op de OS-paginacache en op mallocs en wat de system free-opdracht laat zien wanneer deze parameter is ingesteld.  We zullen een aantal gefundeerde gissingen doen over ideale waarden voor deze afstembare en we zullen laten zien hoe vm . in te stellen.min_free_kbytes permanent om reboots te overleven.  Dus laten we gaan.

Hoe vm.min_free_kbytes werkt

Geheugentoewijzingen kunnen door het systeem nodig zijn om een ​​goede werking van het systeem zelf te garanderen.  Als de kernel toestaat dat al het geheugen wordt toegewezen, kan het moeilijk zijn om geheugen nodig te hebben voor normale bewerkingen om het besturingssysteem soepel te laten werken.  Daarom biedt de kernel de afstembare vm.min_free_kbytes.  De afstembare zal de geheugenbeheerder van de kernel dwingen om ten minste X hoeveelheid vrij geheugen te behouden.   Hier is de officiële definitie van de linux kernel documentatie: “Dit wordt gebruikt om de Linux VM te dwingen een minimum aantal kilobytes vrij te houden.  De VM gebruikt dit nummer om een ​​watermerk [WMARK_MIN]-waarde te berekenen voor elke lowmem-zone in het systeem. Elke lowmem-zone krijgt een aantal gereserveerde gratis pagina's, proportioneel op basis van de grootte. Er is een minimale hoeveelheid geheugen nodig om te voldoen aan de PF_MEMALLOC-toewijzingen; als u dit instelt op lager dan 1024 KB, zal uw systeem op subtiele wijze kapot gaan en bij hoge belasting vatbaar zijn voor een impasse. Als u dit te hoog instelt, wordt uw machine onmiddellijk OOM.“

Vm . valideren.min_free_kbytes Werkt

Om te testen of de instelling van min_free_kbytes werkt zoals ontworpen, heb ik een virtuele Linux-instantie gemaakt met slechts 3.75 GB RAM.  Gebruik de gratis opdracht hieronder om het systeem te analyseren:

# gratis -m

Kijkend naar het gratis geheugenhulpprogramma hierboven met de vlag -m om de waarden in MB te laten afdrukken.  Het totale geheugen is 3.5 tot 3.75 GB geheugen.  121 MB geheugen wordt gebruikt, 3.3 GB geheugen is vrij, 251 MB wordt gebruikt door de buffercache.  En 3.Er is 3 GB geheugen beschikbaar.

Nu gaan we de waarde van vm . veranderen.min_free_kbytes en kijk wat de impact is op het systeemgeheugen.  We zullen de nieuwe waarde naar het virtuele bestandssysteem proc herhalen om de waarde van de kernelparameter als volgt te wijzigen:

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

U kunt zien dat de parameter is gewijzigd in 1.ongeveer 5 GB en is van kracht geworden.  Laten we nu de gebruiken vrij commando opnieuw om eventuele wijzigingen te zien die door het systeem worden herkend.

# gratis -m

Het vrije geheugen en de buffercache blijven ongewijzigd door de opdracht, maar de hoeveelheid geheugen wordt weergegeven als beschikbaar is teruggebracht van 3327 naar 1222 MB.  Dat is een geschatte reductie van de verandering in de parameter tot 1.5 GB min. vrij geheugen.

Laten we nu een gegevensbestand van 2 GB maken en dan kijken wat het lezen van dat bestand in de buffercache doet met de waarden.  Hier leest u hoe u een gegevensbestand van 2 GB kunt maken in 2 regels bash-script hieronder:.  Het script genereert een willekeurig bestand van 35 MB met de opdracht dd en kopieert het 70 keer naar een nieuwe data bestand uitgang:

# dd if=/dev/random of=/root/d1.aantal txt = 1000000
# voor i in 'seq 1 70'; doe echo $i; kat /root/d1.txt >> /root/data_bestand; gedaan

Laten we het bestand lezen en de inhoud negeren door het bestand te lezen en om te leiden naar /dev/null zoals hieronder:

# cat data_file > /dev/null

Oké, wat is er met ons systeemgeheugen gebeurd met deze reeks manoeuvres, laten we het nu controleren:

# gratis -m

De resultaten hierboven analyseren.  We hebben nog 1.8 GB vrij geheugen, dus de kernel heeft een groot deel van het geheugen beschermd als gereserveerd vanwege onze instelling min_free_kbytes.  De buffercache heeft 1691 MB gebruikt, wat minder is dan de totale grootte van ons gegevensbestand dat 2 . is.3 GB.  Blijkbaar de hele data bestand kon niet in de cache worden opgeslagen vanwege het gebrek aan beschikbaar geheugen om te gebruiken voor de buffercache.  We kunnen valideren dat het hele bestand niet in de cache is opgeslagen, maar de herhaalde pogingen om het bestand te lezen timen. Als het in de cache was opgeslagen, zou het een fractie van een seconde duren om het bestand te lezen.  Laten we het proberen.

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

Het lezen van het bestand duurde bijna 20 seconden, wat betekent dat het vrijwel zeker niet allemaal in de cache is opgeslagen.

Laten we als laatste validatie de vm . verlagen.min_free_kbytes om de paginacache meer ruimte te geven om te werken en we kunnen verwachten dat de cache werkt en dat het lezen van het bestand veel sneller gaat.

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

Met het extra geheugen dat beschikbaar is voor caching, daalde de leestijd van het bestand van 20 seconden eerder naar .364 seconden met alles in cache.

Ik ben benieuwd om nog een experiment te doen.  Wat gebeurt er met malloc-oproepen om geheugen toe te wijzen vanuit een C-programma in het licht van deze echt hoge vm.min_free_kbytes instelling.  Zal het mislukken van de malloc?  Zal het systeem sterven??  Reset eerst de vm.min_free_kbytes instellen op de echt hoge waarde om onze experimenten te hervatten:

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

Laten we nog eens kijken naar ons gratis geheugen:

Theoretisch hebben we 1.9 GB gratis en 515 MB beschikbaar.  Laten we een stresstestprogramma gebruiken genaamd stress-ng om wat geheugen te gebruiken en te zien waar we falen.  We zullen de vm-tester gebruiken en proberen 1 GB geheugen toe te wijzen.  Aangezien we maar 1 . hebben gereserveerd.5 GB op een 3.75 GB systeem, ik denk dat dit zou moeten werken.

# stress-ng --vm 1 --vm-bytes 1G --time-out 60s
stress-ng: info:  [17537] varkens verzenden: 1 vm
stress-ng: info:  [17537] cache toewijzen: standaard cachegrootte: 46080K
stress-ng: info:  [17537] succesvolle run voltooid in 60.09s (1 min, 0.09 seconden)
# stress-ng --vm 2 --vm-bytes 1G --time-out 60s
# stress-ng --vm 3 --vm-bytes 1G --time-out 60s

Laten we het opnieuw proberen met meer werkers, we kunnen 1, 2, 3, 4 werkers proberen en op een gegeven moment zou het moeten mislukken.  In mijn test slaagde het met 1 en 2 arbeiders, maar faalde met 3 arbeiders.

Laten we de vm . resetten.min_free_kbytes naar een laag aantal en kijk of dat ons helpt 3 geheugenstressoren met elk 1 GB op een 3.75GB systeem.

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

Deze keer liep het zonder fouten, ik heb het twee keer zonder problemen geprobeerd.  Dus ik kan concluderen dat er een gedragsverschil is om meer geheugen beschikbaar te hebben voor malloc, wanneer de vm.min_free_kbytes waarde is ingesteld op een lagere waarde.

Standaardinstelling voor vm.min_free_kbytes

De standaardwaarde voor de instelling op mijn systeem is 67584, wat ongeveer 1 . is.8% RAM op het systeem of 64 MB. Om veiligheidsredenen op een zwaar afgeranseld systeem zou ik de neiging hebben om het een beetje te verhogen, misschien tot 128 MB om meer gereserveerd vrij geheugen mogelijk te maken, maar voor gemiddeld gebruik lijkt de standaardwaarde verstandig genoeg.  De officiële documentatie waarschuwt voor het te hoog maken van de waarde.  Het instellen op 5 of 10% van het systeem-RAM is waarschijnlijk niet het beoogde gebruik van de instelling en is te hoog.

vm . instellen.min_free_kbytes om reboots te overleven

Om ervoor te zorgen dat de instelling het opnieuw opstarten kan overleven en niet wordt hersteld naar de standaardwaarden bij het opnieuw opstarten, moet u ervoor zorgen dat de sysctl-instelling blijvend is door de gewenste nieuwe waarde in de /etc/sysctl.conf bestand.

Conclusie

We hebben gezien dat de vm.min_free_kbytes linux-kernel afstembare kan worden gewijzigd en kan geheugen op het systeem reserveren om ervoor te zorgen dat het systeem stabieler is, vooral tijdens zwaar gebruik en zware geheugentoewijzingen.  De standaardinstellingen zijn misschien iets te laag, vooral op systemen met veel geheugen, en moeten worden overwogen om voorzichtig te worden verhoogd.  We hebben gezien dat het geheugen dat door deze tunable is gereserveerd, voorkomt dat de OS-cache al het geheugen gebruikt en ook voorkomt dat sommige malloc-bewerkingen ook al het geheugen gebruiken.

Top Oculus App Lab-games
Als je eigenaar bent van een Oculus-headset, moet je op de hoogte zijn van sideloading. Sideloading is het proces van het installeren van niet-winkeli...
Top 10 spellen om te spelen op Ubuntu
Het Windows-platform is een van de dominante platforms voor gaming geweest vanwege het enorme percentage games dat tegenwoordig wordt ontwikkeld om Wi...
5 beste arcade-spellen voor Linux
Tegenwoordig zijn computers serieuze machines die worden gebruikt om te gamen. Als je de nieuwe hoge score niet kunt halen, weet je wat ik bedoel. In ...