Ydeevne

Hvad er vm.min_free_kbytes og hvordan man indstiller det?

Hvad er vm.min_free_kbytes og hvordan man indstiller det?
Hvad er vm.min_free_kbytes sysctl kan indstilles til Linux-kernen, og hvilken værdi skal den indstilles til?  Vi vil undersøge denne parameter, og hvordan den påvirker et kørende Linux-system i denne artikel.  Vi vil teste dens indvirkning på OS-sidens cache og mallocs, og hvad den systemfri kommando viser, når denne parameter er indstillet.  Vi vil lave nogle veluddannede gætter på ideelle værdier til denne tunable, og vi vil vise, hvordan man indstiller vm.min_free_kbytes permanent for at overleve genstarter.  Så lad os gå.

Hvordan vm.min_free_kbytes fungerer

Systemet kan have brug for hukommelsestildeling for at sikre, at selve systemet fungerer korrekt.  Hvis kernen tillader al hukommelse at blive allokeret, kan det kæmpe, når der er brug for hukommelse til regelmæssige operationer for at holde OS kørende.  Derfor giver kernen den tunbare vm.min_frie_kbytes.  Den tunable vil tvinge kernens hukommelsesmanager til at holde mindst X mængde ledig hukommelse.   Her er den officielle definition fra linux kerne dokumentation: “Dette bruges til at tvinge Linux VM til at holde et minimum antal kilobytes gratis.  VM bruger dette nummer til at beregne et vandmærke [WMARK_MIN] -værdi for hver zone med lavmem i systemet. Hver lowmem-zone får et antal reserverede gratis sider, der er proportionalt baseret på dens størrelse. Der kræves en vis minimal hukommelse for at tilfredsstille PF_MEMALLOC-allokeringer; Hvis du indstiller dette til lavere end 1024 KB, bliver dit system subtilt brudt og tilbøjeligt til at være blokeret under høje belastninger. Hvis du indstiller dette for højt, vil OOM straks OOM din maskine.“

Validerer vm.min_free_kbytes Fungerer

For at teste, at indstillingen af ​​min_free_kbytes fungerer som designet, har jeg oprettet en linux virtuel forekomst med kun 3.75 GB RAM.  Brug den gratis kommando nedenfor til at analysere systemet:

# gratis -m

Ser man på det gratis hukommelsesværktøj ovenfor ved hjælp af -m-flag for at få værdierne udskrevet i MB.  Den samlede hukommelse er 3.5 til 3.75 GB hukommelse.  Der bruges 121 MB hukommelse, 3.3 GB hukommelse er ledig, 251 MB bruges af buffercachen.  Og 3.3 GB hukommelse er tilgængelig.

Nu skal vi ændre værdien af ​​vm.min_free_kbytes og se, hvad indvirkningen er på systemhukommelsen.  Vi gentager den nye værdi til det virtuelle proc-filsystem for at ændre kerneparameterværdien som nedenfor:

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

Du kan se, at parameteren blev ændret til 1.5 GB ca. og har trådt i kraft.  Lad os nu bruge ledig kommando igen for at se eventuelle ændringer, der genkendes af systemet.

# gratis -m

Den ledige hukommelse og buffercachen er uændret af kommandoen, men mængden af ​​hukommelse vises som ledig er reduceret fra 3327 til 1222 MB.  Hvilket er en omtrentlig reduktion af ændringen i parameteren til 1.5 GB min ledig hukommelse.

Lad os nu oprette en 2 GB datafil og derefter se, hvad det at læse filen i buffercachen gør med værdierne.  Sådan oprettes en 2 GB datafil i 2 linjer med bash-script nedenfor.  Scriptet genererer en tilfældig 35 MB-fil ved hjælp af dd-kommandoen og kopierer den derefter 70 gange til en ny datafil produktion:

# dd hvis = / dev / tilfældig af = / root / d1.txt-antal = 1000000
# for i i 'seq 1 70'; gør ekko $ i; kat / rod / d1.txt >> / root / data_file; Færdig

Lad os læse filen og ignorere indholdet ved at læse og omdirigere filen til / dev / null som beskrevet nedenfor:

# cat data_file> / dev / null

Okay, hvad der er sket med vores systemhukommelse med dette sæt manøvrer, lad os kontrollere det nu:

# gratis -m

Analyse af resultaterne ovenfor.  Vi har stadig 1.8 GB ledig hukommelse, så kernen har beskyttet et stort stykke hukommelse som reserveret på grund af vores min_free_kbytes-indstilling.  Buffercachen har brugt 1691 MB, hvilket er mindre end den samlede størrelse af vores datafil, som er 2.3 GB.  Tilsyneladende hele datafil kunne ikke gemmes i cachen på grund af manglen på ledig hukommelse, der kan bruges til buffercachen.  Vi kan validere, at hele filen ikke er gemt i cachen, men timing af de gentagne forsøg på at læse filen. Hvis den blev cachelagret, ville det tage en brøkdel af et sekund at læse filen.  Lad os prøve det.

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

Den læste fil tog næsten 20 sekunder, hvilket betyder, at det næsten helt sikkert ikke er alle cachede.

Lad os som en sidste validering reducere vm.min_free_kbytes for at give sidecache mere plads til at fungere, og vi kan forvente at se cachen fungere og filen læses meget hurtigere.

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

Med den ekstra hukommelse, der er tilgængelig til cache, faldt filens læsetid fra 20 sekunder før til .364 sekunder med det hele i cache.

Jeg er nysgerrig efter at gøre endnu et eksperiment.  Hvad der sker med malloc-opkald for at allokere hukommelse fra et C-program i lyset af denne virkelig høje vm.min_free_kbytes indstilling.  Vil det fejle malloc?  Vil systemet dø?  Nulstil først VM.min_free_kbytes indstilling til den virkelig høje værdi for at genoptage vores eksperimenter:

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

Lad os se igen på vores ledige hukommelse:

Teoretisk har vi 1.9 GB gratis og 515 MB tilgængelig.  Lad os bruge et stresstestprogram kaldet stress-ng for at bruge lidt hukommelse og se, hvor vi fejler.  Vi bruger vm-testeren og prøver at allokere 1 GB hukommelse.  Da vi kun har reserveret 1.5 GB på en 3.75 GB-system, jeg antager, at dette skal fungere.

# stress-ng --vm 1 --vm-bytes 1G - timeout 60s
stress-ng: info: [17537] forsendelse af svin: 1 vm
stress-ng: info: [17537] cache allocate: standard cache size: 46080K
stress-ng: info: [17537] vellykket kørsel afsluttet i 60.09'ere (1 min., 0.09 sekunder)
# stress-ng --vm 2 --vm-bytes 1G - timeout 60s
# stress-ng --vm 3 --vm-bytes 1G - timeout 60s

Lad os prøve det igen med flere arbejdere, vi kan prøve 1, 2, 3, 4 arbejdere, og på et tidspunkt skulle det mislykkes.  I min test bestod den med 1 og 2 arbejdere, men mislykkedes med 3 arbejdere.

Lad os nulstille VM.min_free_kbytes til et lavt tal og se om det hjælper os med at køre 3 hukommelsesstressorer med 1 GB hver på en 3.75 GB-system.

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

Denne gang kørte det uden fejl, jeg prøvede det to gange uden problemer.  Så jeg kan konkludere, at der er en adfærdsmæssig forskel ved at have mere hukommelse tilgængelig til malloc, når vm.min_free_kbytes-værdien er indstillet til en lavere værdi.

Standardindstilling for vm.min_frie_kbytes

Standardværdien for indstillingen på mit system er 67584, som er cirka 1.8% af RAM på systemet eller 64 MB. Af sikkerhedsmæssige årsager på et stærkt thrashed system ville jeg have en tendens til at øge det lidt måske til 128 MB for at give mulighed for mere reserveret ledig hukommelse, men ved gennemsnitlig brug synes standardværdien fornuftig nok.  Den officielle dokumentation advarer om at gøre værdien for høj.  At indstille det til 5 eller 10% af systemets RAM er sandsynligvis ikke den tilsigtede anvendelse af indstillingen og er for højt.

Indstilling af vm.min_free_kbytes for at overleve genstart

For at sikre, at indstillingen kan overleve genstarter og ikke gendannes til standardværdierne, når du genstarter, skal du sørge for at gøre sysctl-indstillingen vedvarende ved at placere den ønskede nye værdi i / etc / sysctl.conf-fil.

Konklusion

Vi har set, at vm.min_free_kbytes linux kernel tunable kan ændres og kan reservere hukommelse på systemet for at sikre, at systemet er mere stabilt, især under tung brug og tung hukommelsesallokering.  Standardindstillingerne kan være lidt for lave, især på systemer med høj hukommelse og bør betragtes som øget omhyggeligt.  Vi har set, at den hukommelse, der er reserveret af denne tunable, forhindrer OS-cachen i at bruge al hukommelsen og forhindrer også nogle malloc-operationer i at bruge al hukommelsen.

Sådan registreres og streames din gaming-session på Linux
Tidligere blev spil kun betragtet som en hobby, men med tiden oplevede spilindustrien en enorm vækst med hensyn til teknologi og antallet af spillere....
Bedste spil at spille med håndsporing
Oculus Quest introducerede for nylig den gode idé om håndsporing uden controllere. Med et stadigt stigende antal spil og aktiviteter, der udfører supp...
Sådan vises OSD-overlay i fuldskærms Linux-apps og -spil
Afspilning af fuldskærmsspil eller brug af apps i distraktionsfri fuldskærmstilstand kan afskære dig fra relevante systemoplysninger, der er synlige i...