Vad Är Swappiness på Linux? (och Hur man Ändrar Det)

0
345
subin-ch/Shutterstock.kom

Linux swappiness värde har ingenting att göra med hur mycket RAM-minne som används innan byta börjar. Det är en allmänt redovisade och allmänt misstag. Vi förklarar vad det egentligen är.

Krossa Myter Om Swapiness

Att byta är en teknik där data i RAM (Random Access Memory) är skrivet till en särskild plats på hårddisken—antingen en swap-partition eller en swap-fil—för att frigöra RAM-minne.

Linux har en inställning som kallas swappiness värde. Det finns en hel del förvirring om vad den här inställningen styr. Den vanligaste felaktig beskrivning av swappiness är att det sätter en gräns för RAM-användning, och när mängden använt RAM-träffar som tröskelvärde, byta börjar.

Detta är en missuppfattning som har upprepats så ofta att det är nu fått visdom. Om (nästan) alla andra säger att det är precis hur swappiness fungerar, varför ska du tro oss när vi säger att det inte är?

Enkla. Vi kommer att bevisa det.

RAM-minnet är uppdelat I Zoner

Linux inte tänka på ditt RAM-minne som en enda stor homogen minne. Det anser det vara indelade i ett antal olika regioner som kallas för zoner. Vilka zoner som finns på din dator beror på om det är 32-bitars eller 64-bitars. Här är en förenklad beskrivning av zoner på en x86-arkitektur dator.

  • DMA (Direct Memory Access): Detta är den låga 16 MB minne. Zonen har fått sitt namn eftersom, för länge sedan, det fanns datorer som bara kunde göra direct memory access till detta område av det fysiska minnet.
  • Direct Memory Access 32: Trots sitt namn, Direct Memory Access 32 (DMA32) är en zon som endast finns i 64-bitars Linux. Det är den låga 4 GB minne. Linux körs på 32-bitars datorer kan endast göra DMA till den här mängden RAM-minne (om de inte använder physical address extension (PAE) kernel), vilket är hur den zon som fick sitt namn. Även om, på 32-bitars datorer, det kallas HighMem.
  • Normal: På 64-bitars datorer, normal minne är alla RAM-minne över 4 GB (på ett ungefär). På 32-bitars maskiner, det är RAM mellan 16 MB och 896 MB.
  • HighMem: Denna finns endast i 32-bitars Linux-datorer. Det är allt RAM ovan 896 MB, inklusive RAM 4 GB på tillräckligt stora maskiner.

Den SIDSTORLEK Värde

RAM fördelas på sidorna, som är en fast storlek. Att storleken bestäms av kärnan vid uppstart genom att upptäcka och optimering av datorn. Vanligtvis sidstorlek på en Linux-dator som är 4 Kb.

Du kan se din sida storlek med hjälp av getconf kommando:

getconf PAGESIZE

Zoner som Är kopplade till Noder

Zoner som är kopplade till noder. Noder är kopplade till en Central Processing Unit (CPU). Kärnan kommer att försöka allokera minne för en process som körs på en PROCESSOR från den nod som är förknippade med att CPU.

Begreppet noder knyts till Processorer ger blandade minne typer installeras i-specialist multi-CPU-datorer med Non-Uniform Memory Access arkitektur.

Det är mycket high-end. Den genomsnittliga Linux-dator kommer att ha en enda nod, som kallas nod noll. Alla zoner hör till noden. För att se noder och zoner i din dator, titta in i /proc/buddyinfo fil. Vi kommer att använda mindre att göra så:

mindre /proc/buddyinfo

Detta är resultatet från en 64-bitars dator denna artikel har forskat på:

Nod 0, zon DMA 1 1 1 0 2 1 1 0 1 1 3
Nod 0, zon DMA32 2 67 58 19 8 3 3 1 1 1 17

Det är en inre nod, noden noll. Denna dator endast har 2 GB RAM, så det är ingen “Normal” zon. Det finns bara två zoner, DMA och DMA32.

Varje kolumn representerar antalet tillgängliga sidor av en viss storlek. Till exempel, för DMA32 zon, för att läsa från vänster:

  • 2: Det är 2 av 2^(0*SIDSTORLEK) delar av minnet.
  • 67: Det finns 67 2^(1*PAGE_SIZE) delar av minnet.
  • 58: 58 2^(2*SIDSTORLEK) bitar av tillgängligt minne.
  • Och så vidare, hela vägen upp till…
  • 17: Det är 17 2^(512*SIDSTORLEK) bitar.

Men egentligen är den enda anledningen till att vi tittar på att denna information är att se förhållandet mellan noder och zoner.

Fil-Sidor och Anonyma Sidor

Minnet kartläggning använder uppsättningar av sidtabellposter att registrera vilka sidor i minnet används, och för vad.

Minne mappningar kan vara:

  • Fil stöds: Fil backas mappningar som innehåller data som har hämtats från en fil. Det kan vara någon typ av fil. Det viktiga att notera är att om systemet befrias detta minne och som behövs för att få denna information igen, det kan vara att läsa från filen en gång till. Men, om de uppgifter som har ändrats i minnet, dessa förändringar kommer att behöva skrivas till filen på hårddisken innan minnet kan befrias. Om det inte hända, ändringar kommer att förloras.
  • Anonym: Anonym minne är ett minne kartläggning med ingen fil eller enhet som stöder den. Dessa sidor kan innehålla minne begärt on-the-fly av program för att lagra data, eller för sådana saker som stack och heap. Eftersom det inte finns någon fil bakom denna typ av data, till en speciell plats, måste den ställas undan för förvaring av anonyma data. Denna plats är swap-partition eller byta fil. Anonym data skrivs att byta innan anonyma sidor är befriade.
  • Enheten stöds: Enheter behandlas genom att blockera enhetens filer som kan behandlas som om de vore filer. Data kan läsas från dem och skrivit till dem. En enhet som backas upp minnet kartläggning har data från en enhet som lagras i den.
  • Delat: Flera sidtabellposter som kan mappas till samma sida av RAM-minne. Att komma åt minnesplatserna genom någon av de mappningar som kommer att visa samma data. Olika processer kan kommunicera med varandra på ett mycket effektivt sätt genom att ändra data i dessa gemensamt tittade på minnesplatser. Gemensamt skrivbar mappningar är ett vanligt sätt för att uppnå hög prestanda inter-process kommunikation.
  • Kopia på skriva: Kopia på skriva är en lat fördelning teknik. Om en kopia av en resurs som redan finns i minnet begärs, för begäran är nöjd genom att returnera en kartläggning av befintliga resurser. Om en av de processer “dela” en resurs försöker skriva till den resursen måste vara riktigt replikeras i minnet för att ändringarna ska göras till den nya kopian. Så minnet tilldelning endast sker om den första skriv kommandot.

För swappiness, vi behöver bara bry oss med de två första i listan: fil-sidor och anonyma sidor.

Swappiness

Här är beskrivningen av swappiness från Linux documentation på GitHub:

“Denna kontroll används för att definiera hur aggressivt (sic) kommer kärnan att byta minne sidor. Högre värden kommer att öka aggressivitet, lägre värden minska mängden swap. Ett värde på 0 uppdrar åt kärnan att inte inleda byta tills den mängd gratis-och-fil-stödda sidor som är mindre än high water mark i en zon.

Standardvärdet är 60.”

Det låter som swappiness visar byta upp eller ner i intensitet. Intressant, det står att ställa swappiness till noll inte stänga swap. Det uppdrar åt kärnan inte att byta tills vissa villkor är uppfyllda. Men att byta fortfarande kan ske.

Låt oss gräva djupare. Här är den definition och standard värdet av vm_swappiness i kärnans källkod fil vmscan.c:

/*
* Från 0 .. 100. Större betyder mer swappy.
*/
int vm_swappiness = 60;

Den swappiness värdet kan variera från 0 till 100. Igen, kommentaren låter säkert som swappiness-värdet har betydelse för hur mycket tar byta plats med en större figur leder till mer byta.

Vidare i källkoden för filen, kan vi se att en ny variabel som heter swappiness tilldelas ett värde som returneras av funktionen mem_cgroup_swappiness(). Lite mer spårning genom källkoden kommer att visa att det värde som returneras av denna funktion är vm_swappiness. Så nu, den rörliga swappiness är satt till lika oavsett värde vm_swappiness var inställd på.

int swappiness = mem_cgroup_swappiness(memcg);

Och lite längre ner i samma källkodsfil, ser vi detta:

/*
* Med swappiness på 100, anonym och filen har samma prioritet.
* Denna skanning prioritet är i huvudsak den omvända IO kostnad.
*/
anon_prio = swappiness;
file_prio = 200 – anon_prio;

Det är intressant. Två distinkta värden härrör från swappiness. Den anon_prio och file_prio variabler hålla dessa värden. Som en ökar, andra minskar, och vice versa.

Linux swappiness värde som faktiskt ställer in förhållandet mellan två värden.

Det Gyllene Snittet

Fil-sidor innehålla data som lätt kan hämtas om att minne frigörs. Linux kan bara läsa filen igen. Som vi har sett, om filen data som har ändrats i RAM-minnet, de förändringar som måste skrivas till filen innan den sidan kan befrias. Men, hursomhelst, fil sidan i RAM-minnet kan vara fylls genom att läsa data från filen. Så varför bry sig om att lägga till dessa sidor för att swap-partition eller byta fil? Om du behöver att data igen, du kan väl läsa det tillbaka från den ursprungliga filen istället för en redundant kopia i swap-utrymme. Så filen sidor lagras inte i swap. De är “lagrade” back i den ursprungliga filen.

Med anonyma sidor, det finns ingen underliggande filen i samband med de värden i minnet. Värdena på dessa sidor har varit dynamiskt kommit fram till. Du kan inte bara läsa dem tillbaka från en fil. Det enda sättet anonym sida minne värden som kan återvinnas är att lagra data någonstans innan att frigöra minne. Och det är vad swap innehar. Anonym sidor som du kommer att behöva för att referera igen.

Men observera att för både fil-sidor och för anonyma sidor, frigöra minne kan kräva en hårddisk skriva. Om filen sidan data eller anonyma sidan uppgifter som har ändrats sedan det var förra skrivs till filen eller att byta ett filsystem skriva krävs. För att hämta data kommer att kräva ett filsystem läsa. Båda typerna av sidan reclaim är kostsamt. Att försöka minska hårddisk input och output genom att minimera byta av anonym sidor bara ökar mängden hårddiskutrymme som indata och utdata som krävs för att hantera filen sidor som skrivs till, och läsa från filer.

Som du kan se från den sista kodavsnitt, det är två variabler. En som heter file_prio för “fil prioriteras”, och en som kallas anon_prio för “anonym prioritet”.

  • Den anon_prio variabeln är satt till Linux swappiness värde.
  • Den file_prio värde är satt till 200 minus anon_prio värde.

Dessa variabler innehålla värden som arbetar i tandem. Om båda är satt till 100, de är lika. För alla andra värden, anon_prio kommer att minska från 100 till 0, och file_prio kommer att öka från 100 till 200. De två värden som matas in i en komplicerad algoritm som avgör om Linux-kärna körs med en preferens för att återvinna (frigöra) fil-sidor eller anonyma sidor.

Du kan tänka file_prio systemets vilja att frigöra fil-sidor och anon_prio som systemet är villig att gratis anonyma sidor. Vad dessa värden inte ligger någon typ av trigger eller tröskelvärdet för när swap kommer att användas. Det är beslutat på annat håll.

Men, när minnet behöver frigöras, dessa två variabler—och förhållandet mellan dem—tas i beaktande av återvinning och byta algoritmer för att avgöra vilken sida typer företrädesvis i fråga för att frigöra. Och som dikterar huruvida tillhörande hårddisk aktivitet kommer att behandla filer för fil-sidor eller swap-utrymme för anonyma sidor.

När Inte Byta Faktiskt Klippa I?

Vi har konstaterat att Linux swappiness värdet anger en preferens för typ av minne sidor som kommer att skannas för eventuell reklamation. Det är bra, men något måste bestämma när växlingsutrymmet kommer att minska i.

Varje minne zon har en high water mark och en låg vatten-mark. Dessa är härledda värden. De procentsatser av RAM i varje zon. Det är dessa värden som används som swap utlösa tröskelvärden.

För att kontrollera vad dina höga och låga vattenmärken är, titta in i /proc/zoneinfo filen med kommandot:

mindre /proc/zoneinfo

Var och en av zonerna kommer att ha en uppsättning minne värden som mäts i sidor. Här är värdena för DMA32 zon på att testa maskinen. Lågvattenlinjen är 13966 sidor, och high water mark är 16759 sidor:

  • Under normala driftsförhållanden, när ledigt minne i en zon sjunker under zonen låg vatten-mark, byta algoritm börjar skanna sidor i minnet söker i minnet att det kan få tillbaka, med hänsyn till de relativa värdena i anon_prio och file_prio.
  • Om Linux swappiness värdet är satt till noll, byta uppstår när det sammanlagda värdet av fil-sidor och gratis sidor som är mindre än high water mark.

Så du kan se att du inte kan använda Linux swappiness värde för att påverka byta beteende med avseende på RAM-användning. Det bara inte fungerar så.

Vad Ska Swapiness Vara Inställd På?

Detta beror på hårdvara, arbetsbelastning, hårddisk typ, och oavsett om din dator är en stationär dator eller en server. Detta är givetvis inte kommer att bli en one size fits all typ av inställning.

Och du måste komma ihåg att byta är inte bara används som en mekanism för att frigöra RAM-minne när du har ont om minne. Swap är en viktig del av ett väl fungerande system, och utan den förnuftiga minneshantering blir mycket svårt för Linux för att uppnå.

Ändra Linux swappiness värde har en omedelbar effekt; du behöver inte starta om. Så kan du göra små justeringar och övervaka effekterna. Helst skulle du göra detta under en period av dagar, med olika typer av aktivitet på din dator, för att försöka hitta den som är närmast en idealisk miljö som du kan.

Dessa är några punkter att tänka på:

  • Försöker att “inaktivera swap” genom att ställa in Linux swappiness värde noll helt enkelt flyttar swap-associerade hårddisk aktivitet till fil-relaterade hårddisk aktivitet.
  • Om du har åldrande, mekaniska hårddiskar, kan du prova med att minska Linux swappiness värde att flytta bort från anonym sida återvinning och minska swap-partition churn. Naturligtvis, när du slår ner en inställning, den andra inställningen ökar. Minska byta churn är sannolikt att öka filsystemet churn. Men din dator kan bli lyckligare av att gynna den ena metoden framför den andra. Verkligen, det enda sättet att säkert veta är att prova och se.
  • För gemensamt ändamål servrar, till exempel databas-servrar, kan du få vägledning från leverantörer av programvara för databas. Mycket ofta dessa program har sina egna ändamål designade cache-minne och management-rutiner som att du skulle vara bättre att förlita sig på. Den mjukvara kan tyda på en Linux swappiness värde enligt maskinens specifikation och arbetsbelastning.
  • För den genomsnittliga användaren med någorlunda senaste hårdvara? Lämna det som det är.

Hur Linux Swappiness Värde

Innan du ändrar din swappiness värde, du behöver veta vad som är dess nuvarande värde. Om du vill minska den lite, frågan är lite mindre än vad? Du kan ta reda på det med detta kommando:

cat /proc/sys/vm/swappiness

För att konfigurera swappiness värde, använd kommandot sysctl:

sudo sysctl vm.swappiness=45

Det nya värdet används direkt, ingen omstart krävs.

I själva verket, om du inte startar om, det swappiness värde kommer att återvända till sina förvalda värdet av 60. När du är klar med att experimentera och har beslutat om det nya värdet du vill använda, kan du göra det ihållande mellan omstarter genom att lägga till /etc/sysctl.conf-fil. Du kan använda vilken editor du föredrar. Använd följande kommando för att redigera filen med nano-redaktör:

sudo nano /etc/sysctl.conf

När nano öppnas bläddra till längst ned i filen och lägg till den här raden. Vi använder 35 som permanent swappiness värde. Du bör ersätta det värde som du vill använda.

vm.swappiness=35

För att spara dina ändringar och avsluta från nano, tryck “Ctrl+T”, tryck på “Enter” och tryck på “Ctrl+Z.”

Minne för Hantering av Komplexa

Minneshantering är komplicerat. Och det är därför, för den genomsnittlige användaren, är det oftast bättre att lämna det upp till kärnan.

Det är lätt att tro att du är använda mer RAM-minne än vad du är. Verktyg som top och gratis kan ge fel intryck. Linux kommer att använda gratis RAM för en rad olika ändamål, såsom disk-cachning. Detta artificiellt höjer de “används” minne figur och minskar den “fria” minne figur. I själva verket, RAM-minne som används som disk-cache är flaggade som både “används” och “tillgängliga”, eftersom det kan återvinnas som helst, mycket snabbt.

För den oinvigde som kan se ut som växlingsutrymme inte fungerar, eller att swappiness värde måste förändras.

Som alltid, djävulen finns i detaljerna. Eller, i detta fall, demonen. Kärnan swap-demonen.

LÄS NÄSTA

  • “Som iphone Har Stående Läge?
  • “Kommer Windows-10 Fungerar på Min Dator?
  • “Där Du Kan Strömma Din Favorit Christmas Special
  • “Hur du skriver Ut Foton i Windows 10
  • “Hur att Spåra Bestånd med Google Kalkylark