...

Kernel Samepage Merging: KSM för bättre virtualiseringsprestanda

KSM-virtualisering minskar det fysiska RAM-behovet genom att Linux-kärnan sammanför identiska minnessidor mellan virtuella maskiner och delar dem effektivt med hjälp av ”copy-on-write”. På så sätt ökar jag VM-tätheten, lindrar RAM-flaskhalsar och håller Prestanda i balans.

Centrala punkter

Följande nyckelbudskap hjälper mig att snabbt förstå KSM och använda det på ett målinriktat sätt:

  • Deduplicering Identiska minnessidor minskar RAM-användningen avsevärt.
  • Copy-on-Write håller sidorna läsbara tillsammans och separerar dem först när ändringar görs.
  • Finjustering ksmd-parametrarna balanserar CPU-belastningen och besparingarna.
  • NUMA-plats förhindrar onödiga fördröjningar i värddatorer med flera socklar.
  • Säkerhet kräver selektiv delning i miljöer med flera användare.

Vad är KSM? Grunder och förfarande

Med Kernel Samepage Merging Kernel-tråden ksmd genomsöker regelbundet anonyma privata sidor som markerats som „mergeable“ och slår samman innehåll som är identiskt på bitnivå. Jag drar nytta av att många virtuella maskiner ofta har identiska bibliotek, programkoder eller operativsystemskomponenter i minnet. KSM markerar de sammanslagna sidorna som Kopiering vid skrivning, vilket innebär att alla gäster läser samma fysiska sida tills någon skriver. Först vid skrivåtkomst skapar kärnan en egen sida för denna process, medan den ursprungliga sidan förblir delad. Viktigt: KSM deduplicerar inte filsystem- eller sidcache-sidor, och jag måste uttryckligen frigöra minne för sammanslagningen.

Användning i virtualiseringsmiljöer

I värddatorer med många liknande virtuella maskiner utvecklas KSM den största effekten, eftersom redundanta sidor förekommer ofta. I KVM- och molnmiljöer minskar sammanslagningen den effektiva RAM-belastningen per gäst avsevärt och ökar därmed VM-tätheten per server. Erfarenhetsrapporter från praktiken nämner upp till 300 % fler gästsystem vid korrekt inställning, utan märkbara försämringar av svarstiden. Om jag kombinerar KSM med Överengagemang i minnet, utnyttjar jag servrarna bättre och använder det tillgängliga minnet mer effektivt. Genom att dela identiska sidor minskar jag risken för swap-toppar och får en jämn Effektkurva genom många instanser.

Konfiguration under Linux och KVM

Jag aktiverar KSM via CONFIG_KSM i kärnan och styr beteendet via sysfs under /sys/kernel/mm/ksm/. Där startar jag skanningen (run), ställer in intensiteten (pages_to_scan, sleep_millisecs) och observerar sidvinster (pages_sharing). I företagsdistributioner använder jag tjänster som ksm och ksmtuned, som automatiskt skalar upp eller ner utifrån tröskelvärden för ledigt RAM-minne. För detaljerad styrning markerar jag minnesområden med madvise(MADV_MERGEABLE) eller prctl(PR_SET_MEMORY_MERGE) specifikt som sammanfogbara. I dynamiska miljöer kombinerar jag gärna KSM med Ballongflygning i minnetför att optimera RAM-tilldelning att dessutom bibehålla flexibiliteten.

Prestanda och tuning: den rätta balansen

Jag vinner framför allt där RAM-minnet utgör den verkliga flaskhalsen och CPU-kärnorna annars skulle förbli outnyttjade – då utmärker sig KSM den totala prestandan, eftersom jag kör fler virtuella maskiner parallellt. Ksmd-tråden tar dock upp CPU-tid, vilket innebär att alltför aggressiva skanningsparametrar kan minska fördelarna. Jag börjar försiktigt, mäter pages_sharing och pages_scanned och observerar latenser under belastning innan jag ökar skanningshastigheten. Om det finns tillräckligt med ledigt RAM-minne håller jag ksmd mindre aktivt och drar först åt tyglarna när värdarna börjar ta slut. På så sätt upprätthåller jag en bra balans mellan Lagringsvinst och CPU-överbelastning.

Säkerhet och isolering ur ett sakligt perspektiv

Eftersom flera gäster delar en fysisk sida tar jag hänsyn till potentiella Sidokanaler, som skulle kunna utläsa information utifrån tidsmönster eller åtkomstmönster. I känsliga multitenant-miljöer inaktiverar jag siddelning selektivt för vissa instanser eller värdar. För mindre känsliga arbetsbelastningar med många likartade gäster är KSM däremot en pålitlig metod för att sänka kostnaderna och öka densiteten. Jag dokumenterar beslutet per kluster och för en undantagslista för särskilt kritiska virtuella maskiner. På så sätt säkerställer jag Öppenhet och minska sårbarheten utan att offra effektivitetsvinsterna.

NUMA, Huge Pages och interaktion

På NUMA-system är jag uppmärksam på Förvaringsplats och låter KSM helst endast slås samman inom en nod, så att åtkomst inte sker via långsamma vägar. Detta minskar latensen och håller bandbredden per socket hög. I kombination med Huge Pages minskar jag TLB-missar, men måste tänka på att stora sidor förändrar sannolikheten för bitidentiskt innehåll. Vissa arbetsbelastningar drar större nytta av Huge Pages, andra mer av deduplicering; jag validerar detta med prestandatester. Målet är fortfarande att maximera den lokala åtkomsten och Fjärrminne som ska undvikas.

Att förstå övervakning och nyckeltal

Jag utvärderar effekten av KSM med hjälp av ett fåtal, men meningsfulla mätvärden: pages_sharing, pages_shared, pages_scanned, pages_unshared och full_scans. Om pages_sharing ökar stadigt och CPU-belastningen håller sig på en måttlig nivå, går min konfiguration i rätt riktning. Om värdena förblir oförändrade kontrollerar jag om gästerna överhuvudtaget markerar minnet som ”mergeable”. Jag övervakar dessutom host-swap, VM-latenser och IO-wait för att upptäcka biverkningar i tid. Dashboards med tidsserier visar mig trender, så att jag Justeringar fattar beslut utifrån data.

Praktiska exempel och besparingspotential

I testkluster med dussintals liknande Linux-VM:er kunde jag tack vare KSM i vissa fall tvåsiffriga besparingar i RAM-utnyttjande uttryckt i procentenheter och därmed märkbart högre densitet. Java-arbetsbelastningar med många identiska klasser och bibliotek gav särskilt konsekventa vinster. Ju mer homogena gästerna är, desto mer minskar minnesavtrycket; heterogena stackar ger mindre, men ändå användbara resultat. I kombination med korrekt konfigurerad överbeläggning håller jag kostnaderna per instans låga och kör fler tjänster på samma hårdvara. På så sätt skapas en tydlig Ekonomisk effekt med förutsägbar kvalitet.

KSM kontra alternativ: Avgränsning och samverkan

Jag satsar på en Portfölj kompletterande minnestekniker som fungerar på olika sätt beroende på målet. KSM eliminerar redundans i RAM-minnet, medan Ballooning dynamiskt återvinner minne till gästerna och Huge Pages förbättrar CPU-effektiviteten. Ingen teknik ersätter den andra; jag kombinerar dem målmedvetet beroende på arbetsbelastningsprofil och densitetsmål. För nybörjare kan följande översikt hjälpa till att snabbare fatta ett val. Som nästa steg är det värt att ta en titt på KVM och Xen i jämförelse med, för att Val av plattform placera på rätt plats.

Teknik Uppgift Fördel Nackdel Lämplig för
KSM Deduplicering av identiska RAM-sidor Hög RAM-besparing för liknande virtuella maskiner Extra belastning på processorn till följd av skanningar Många likartade gäster, KVM-värdar
Ballongflygning i minnet Dynamisk återvinning av gaslager Bättre Användning vid varierande arbetsbelastning Det krävs en ballongförare per gäst Blandade utnyttjandeprofiler
Stora sidor Större sidstorlekar för färre TLB-missar Högre CPU-effektivitet vid minneskrävande appar Mindre sannolikhet för deduplicering Databaser, JVM:er, in-memory-motorer
NUMA-pinning Koppling av virtuella maskiner till lokala lagringsnoder konstant Fördröjning och bandbredd Mindre flexibilitet vid schemaläggningen Värddatorer med flera socklar, arbetsbelastningar där latensen är avgörande

Praktisk aktivering och värdhandböcker

På värdnivå har jag en pragmatisk inställning: Jag startar ksm/ksmtuned och anger standardvärden som har visat sig fungera bra i drift. Exempel:

Aktivera #-tjänster (beroende på distribution)
systemctl enable --now ksm ksmtuned

Manuell inställning av # (träder i kraft omedelbart, gäller fram till omstart)
echo 1 > /sys/kernel/mm/ksm/run
echo 1000 > /sys/kernel/mm/ksm/pages_to_scan
echo 50 > /sys/kernel/mm/ksm/sleep_millisecs

I libvirt styr jag delningen för varje virtuell maskin. Som standard markerar QEMU gäst-RAM som sammanfogbart. För särskilt känsliga virtuella maskiner inaktiverar jag delningen uttryckligen:

 

På så sätt håller jag en tydlig linje: bred aktivering på värddatorer med homogena arbetsbelastningar, riktade undantag för särskilda fall.

Finjustering av KSM-parametrarna i detalj

  • kör: 0 = av, 1 = aktiv, 2 = av och ta bort redan sammanflätade sidor. Jag använder „2“ endast för specifika tester eller när jag vill återställa delningen på ett säkert sätt före underhållsfönster.
  • sidor_att_skanna: Hur många sidor som kontrolleras per cykel. Högre värden påskyndar sökningen efter identiska sidor, men ökar samtidigt belastningen på processorn.
  • sleep_millisecs: Paus mellan cyklerna. Längre pauser minskar overheadkostnaden, men det tar längre tid innan besparingsnivån stabiliseras.
  • merge_across_nodes: För NUMA-värdar ställer jag in detta på 0, så att sammanslagning endast sker inom en NUMA-nod. Detta bevarar lokaliteten.
  • use_zero_pages: Om denna funktion är aktiverad delar processer noll-sidor effektivt med kärnans noll-sida. Detta ger „säkra“ besparingar utan COW-kostnader.

Med ksmtuned justerar jag dynamiskt utifrån RAM-tröskelvärden. Så snart det börjar bli ont om ledigt minne ökar ksmtuned skanningshastigheten (Npagen-Boost); när belastningen minskar sänker det hastigheten igen. Detta ger en adaptiv, „andande“ konfiguration utan manuella ingrepp.

Interaktion med THP, Huge Pages och ballooning (fördjupning)

Transparenta stora sidor (THP) och Stora sidor optimerar CPU-effektiviteten, medan KSM minskar redundansen i RAM-minnet. Jag tar hänsyn till följande:

  • KSM arbetar med vanliga 4 KB-sidor. THP-sidor (oftast 2 MB) kan inte dedupliceras. Ju mer THP används, desto mindre material har KSM att arbeta med.
  • För latenskritiska eller CPU-bundna arbetsbelastningar låter jag THP/Huge Pages ta över. För värddatorer med begränsat RAM-minne och homogena virtuella maskiner prioriterar jag KSM.
  • Ballooning kompletterar KSM: Balloon-drivrutinen återlämnar ledigt gasminne till värden. Samtidigt minskar KSM behovet genom att konsolidera identiska sidor. Tillsammans jämnar jag ut toppbelastningar och förhindrar förhastad swapping.

Jag fattar beslut utifrån empiriska data: Prestandatester med och utan THP/Huge Pages samt med aktivt KSM visar mig vilken kombination som ger bäst kostnadseffektivitet totalt sett.

Säkerhetsmodeller och moderna CPU-funktioner

I miljöer med strikt åtskillnad mellan klienter stänger jag konsekvent av delning per VM/värd. Detta minimerar sidledes informationsflöden genom delade sidor och förenklar efterlevnadskontroller. Moderna Lagringskryptering På värd-/gästnivå (t.ex. per VM-nyckel) förhindrar detta i praktiken att KSM kan sammanfoga data mellan gäster på ett meningsfullt sätt, eftersom identiskt innehåll inte längre finns bit för bit i det fysiska RAM-minnet. I sådana kluster undviker jag aggressiv skanning och låter ksmd vara passivt för att inte slösa bort CPU-resurser i onödan.

För mindre känsliga men homogena stackar behåller jag KSM som standard. Jag dokumenterar policyn för varje kluster: „Standardinställning på, undantag via nosharepages“ eller „Standardinställning av, delning endast för definierade pooler“ – båda alternativen är giltiga så länge de implementeras på ett transparent och reproducerbart sätt.

Lämplighet för arbetsbelastning och anti-mönster

KSM utmärker sig vid enhetliga arbetsbelastningar med många instanser (t.ex. många identiska app-servrar, JVM-baserade tjänster, agenter). Följande drar mindre nytta av det:

  • Starkt varierande, kortvariga allokeringar (t.ex. många små buffertar som ändras snabbt), eftersom sannolikheten för COW är hög.
  • Komprimerade, krypterade eller pseudorandomiserade data – identiska sidor förekommer sällan.
  • Stora in-memory-databaser med aggressiv sidåtervinning när data förändras snabbt. Här överväger ofta fördelarna med Huge Pages/THP.

I containerfarmar kan KSM också fungera, förutsatt att processer markerar lagringsutrymmen som ”mergeable”. I praktiken fokuserar jag dock främst på virtuella maskiner (VM) när det gäller KSM, eftersom QEMU där redan sätter de nödvändiga madvise-flaggorna.

Felsökning och typiska stötestenar

  • delningen av sidor stagnerar: Jag kontrollerar om QEMU/VM:er verkligen skapar sammanfogbart minne (ingen nosharepages-direktiv i libvirt-XML) och om ksmd körs. Om det förblir oförändrat är arbetsbelastningen förmodligen för heterogen.
  • CPU-belastningen är för hög: Jag ökar sleep_millisecs och/eller minskar pages_to_scan. Dessutom kan jag inaktivera sammanslagning över NUMA-gränserna för att minska sökområdet.
  • Oväntade toppar i latensen: Jag kontrollerar om COW-händelser korrelerar med belastningstoppar. I sådana fall sänker jag skanningsfrekvensen eller utesluter tillfälligt berörda virtuella maskiner från delningen.
  • Överbeläggning eskalerar till swap: KSM är inget substitut för kapacitetsplanering. Jag ser alltid till att ha en reserv av ledigt RAM-minne och justerar ksmd endast som en buffert, inte som en nödlösning.

Planering, dimensionering och automatisering

För att kunna planera resultaten definierar jag målvärden för varje värd:

  • Headroom: En fast procentuell buffert av ledigt RAM-minne, under vilken ksmtuned börjar agera mer aggressivt. På så sätt skjuter jag upp dedupliceringen till perioder då det verkligen behövs.
  • Rättvisa: Vid ojämn arbetsbelastning delar jag upp poolerna (t.ex. efter projekt/miljö) så att likartade virtuella maskiner kan dra nytta av varandra utan att olikartade „försvagar“ dem.
  • Gränsvärden: Jag sätter gränser för maximala skanningshastigheter och kontrollerar regelbundet om besparingarna motiverar CPU-användningen.

Inom automatisering ser jag KSM som en repeterbar, versionshanterad handbok (t.ex. Systemd-drop-ins eller Cloud-Init-snippets). På så sätt säkerställer jag att nya värddatorer tas i drift med identiska parametrar och att avvikelser snabbt upptäcks.

Sammanfattning för administratörer

Jag använder KSM, när värddatorer kör många liknande virtuella maskiner och RAM-minnet är den begränsande faktorn. Då ger deduplicering den största effekten, medan jag noggrant styr CPU-kostnaden med hjälp av ksmtuned och sysfs-parametrar. I NUMA-konfigurationer håller jag sammanslagningen lokal, kombinerar KSM med ballooning och huge pages och mäter effekten via pages_sharing samt latensmått. För känsliga gästsystem stänger jag av delningen på ett målinriktat sätt och dokumenterar undantag på ett transparent sätt. På så sätt ökar jag täthet, säkerställa snabba svarstider och sänka eurokostnaderna per instans på lång sikt.

Aktuella artiklar

Linux-server med visualiserade nyckeltal för tryckstagnation i datacentret
Administration

Linux PSI för noggrann prestandaanalys och övervakning

Linux PSI (Pressure Stall Information) visar i vilken utsträckning CPU, minne och I/O bromsar ner ditt system. Lär dig hur du aktiverar PSI och använder det för noggrann prestandaövervakning.