...

Kernel Samepage Merging: KSM for bedre virtualiseringsydeevne

KSM-virtualisering reducerer det fysiske RAM-behov ved, at Linux-kernen samler identiske hukommelsessider på tværs af VM’er og deler dem effektivt via »copy-on-write«. På den måde øger jeg VM-tætheden, afhjælper RAM-flaskehalse og holder Ydelse i balance.

Centrale punkter

Følgende hovedpunkter hjælper mig med hurtigt at få et overblik over KSM og anvende det målrettet:

  • Deduplikering Identiske hukommelsessider reducerer RAM-forbruget markant.
  • Copy-on-Write holder siderne læsbare sammen og adskiller dem først, når der foretages ændringer.
  • Finjustering ksmd-parametre afbalancerer CPU-belastningen og besparelserne.
  • NUMA-placering forhindrer unødvendige forsinkelser i værter med flere sokler.
  • Sikkerhed kræver selektiv deling i multi-tenant-miljøer.

Hvad er KSM? Grundlæggende principper og forløb

Med Kernel Samepage Merging Kernel-tråden ksmd gennemsøger regelmæssigt anonyme private sider, der er markeret som „mergeable“, og sammenlægger indhold, der er bit-identisk. Jeg drager fordel af, at mange virtuelle maskiner ofte har identiske biblioteker, programkoder eller OS-komponenter i hukommelsen. KSM markerer de sammenlagte sider som Kopiering ved skrivning, hvilket betyder, at alle gæster læser den samme fysiske side, indtil en af dem skriver. Først ved skriveadgang opretter kernen en separat side til denne proces, mens den oprindelige side fortsat deles. Vigtigt: KSM deduplicerer ikke filsystem- eller sidecache-sider, og jeg skal eksplicit frigive hukommelse til sammenlægningen.

Anvendelse i virtualiseringsmiljøer

I værter med mange lignende VM’er udfolder sig KSM den største effekt, fordi der ofte forekommer redundante sider. I KVM- og cloud-opsætninger sænker sammenlægningen den effektive RAM-belastning pr. gæst markant og øger dermed VM-tætheden pr. server. Erfaringer fra praksis viser op til 300 % flere gæstesystemer ved korrekt tuning uden mærkbar forringelse af responstiden. Hvis jeg kombinerer KSM med Overengagement i hukommelsen, udnytter jeg serverne bedre og bruger den tilgængelige RAM mere målrettet. Ved at dele identiske sider mindsker jeg risikoen for swap-spidsbelastninger og opnår en jævn Ydelseskurve på tværs af mange instanser.

Konfiguration under Linux og KVM

Jeg aktiverer KSM via CONFIG_KSM i kernen og styrer funktionen via sysfs under /sys/kernel/mm/ksm/. Der starter jeg scanningen (run), indstiller intensiteten (pages_to_scan, sleep_millisecs) og overvåger sidegevinsten (pages_sharing). I enterprise-distributioner bruger jeg tjenester som ksm og ksmtuned, der automatisk skruer op eller ned på baggrund af tærskelværdier for ledig RAM. For at opnå en mere detaljeret styring markerer jeg målrettet hukommelsesområder som sammenlægbare ved hjælp af madvise(MADV_MERGEABLE) eller prctl(PR_SET_MEMORY_MERGE). I dynamiske miljøer kombinerer jeg gerne KSM med Hukommelse i ballonfor at optimere RAM-tildeling og samtidig sikre fleksibiliteten.

Ydelse og tuning: den rette balance

Jeg vinder især der, hvor RAM udgør det egentlige flaskehals, og hvor CPU-kerner ellers ville forblive uudnyttede – så kommer KSM den samlede ydeevne, fordi jeg kører flere virtuelle maskiner sideløbende. ksmd-tråden bruger dog CPU-tid, hvorfor for aggressive scanningsparametre kan mindske fordelene. Jeg starter konservativt, måler pages_sharing og pages_scanned og overvåger latenstider under belastning, før jeg øger scanningshastigheden. Hvis der er tilstrækkelig ledig RAM, holder jeg ksmd mindre aktivt og strammer først tøjlerne, når der bliver mangel på værter. På den måde opretholder jeg et godt forhold mellem Lagringsgevinst og CPU-overhead.

Sikkerhed og isolation set ud fra et objektivt synspunkt

Da flere gæster deler en fysisk side, tager jeg højde for potentielle Sidekanaler, som kunne udlede oplysninger via timing eller adgangs mønstre. I følsomme multi-tenant-opsætninger deaktiverer jeg page-sharing selektivt for bestemte instanser eller værter. Til mindre følsomme arbejdsbelastninger med mange ensartede gæster er KSM derimod en pålidelig metode til at sænke omkostningerne og øge tætheden. Jeg dokumenterer beslutningen for hvert cluster og fører en undtagelsesliste for særligt kritiske VM’er. På den måde sikrer jeg Gennemsigtighed og minimerer sårbarhederne uden at gå på kompromis med effektivitetsgevinsten.

NUMA, Huge Pages og interaktion

På NUMA-systemer lægger jeg mærke til Opbevaringssted og lader KSM helst kun blive sammenføjet inden for en enkelt node, så adgangsforespørgsler ikke skal gå via langsomme stier. Det reducerer ventetiderne og holder båndbredden pr. socket høj. I kombination med Huge Pages reducerer jeg TLB-misses, men skal huske på, at store sider ændrer sandsynligheden for bitidentisk indhold. Nogle arbejdsbelastninger drager større fordel af Huge Pages, andre af deduplikering; jeg validerer dette med benchmarks. Målet er fortsat at maksimere den lokale adgang og Fjernlager for at undgå.

Overvågning og forståelse af nøgletal

Jeg vurderer effekten af KSM ved hjælp af få, men informative tællere: pages_sharing, pages_shared, pages_scanned, pages_unshared og full_scans. Hvis pages_sharing stiger stabilt, og CPU-belastningen er moderat, udvikler min opsætning sig i den ønskede retning. Hvis værdierne forbliver uændrede, tjekker jeg, om gæster overhovedet markerer hukommelse som »mergeable«. Derudover overvåger jeg host-swap, VM-latenser og IO-wait for at opdage bivirkninger i tide. Dashboards med tidsserier viser mig tendenser, så jeg Justeringer træffer beslutninger på grundlag af data.

Praktiske eksempler og besparelsespotentiale

I testklynger med snesevis af lignende Linux-VM’er kunne jeg takket være KSM til tider tocifrede besparelser i RAM målt i procentpoint og dermed en mærkbart højere tæthed. Java-workloads med mange identiske klasser og biblioteker gav særligt konsistente gevinster. Jo mere homogene gæsterne er, desto mere reduceres hukommelsesaftrykket; heterogene stakke leverer mindre, men stadig nyttige resultater. I kombination med korrekt konfigureret overcommit holder jeg omkostningerne pr. instans lave og kører flere tjenester på samme hardware. Således opstår der en klar Økonomisk effekt med en kvalitet, der kan planlægges.

KSM kontra alternativer: Afgrænsning og samspil

Jeg satser på en Portefølje Supplerende hukommelsesteknikker, der virker forskelligt afhængigt af målet. KSM fjerner redundans i RAM-indholdet, mens Ballooning dynamisk frigør hukommelse til gæster, og Huge Pages øger CPU-effektiviteten. Ingen af teknikkerne erstatter den anden; jeg kombinerer dem målrettet afhængigt af arbejdsbelastningsprofilen og tæthedsmålet. For begyndere kan følgende oversigt hjælpe med at træffe valget hurtigere. Som næste skridt er det værd at kigge på KVM og Xen i sammenligning med, for at Valg af platform at placere det på den rette plads.

Teknologi Opgave Fordel Ulempe Velegnet til
KSM Deduplisering af identiske RAM-sider Høj Besparelse på RAM ved lignende VM'er Ekstra belastning af CPU’en som følge af scanninger Mange ensartede gæster, KVM-værter
Hukommelse i ballon Dynamisk genvinding af gaslager Bedre Udnyttelse ved svingende arbejdsbelastninger Der skal være en ballonfører pr. gæst Blandede udnyttelsesprofiler
Store sider Større side-størrelser for færre TLB-fejl Højere CPU-effektivitet ved app'er, der kræver meget hukommelse Mindre sandsynlighed for deduplikering Databaser, JVM'er, in-memory-motorer
NUMA-pinning Tilknytning af VM'er til lokale lagringsknudepunkter konstant Forsinkelse og båndbredde Mindre fleksibilitet i planlægningen Hosts med flere sockets, arbejdsbelastninger, hvor latenstiden er afgørende

Praktisk aktivering og værts-playbooks

På host-niveau tager jeg en pragmatisk tilgang: Jeg starter ksm/ksmtuned og indstiller standardværdier, der har vist sig at fungere godt i praksis. Eksempel:

Aktiver #-tjenester (afhænger af distributionen)
systemctl enable --now ksm ksmtuned

Manuel justering af # (træder i kraft med det samme, indtil genstart)
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 styrer jeg delingen for hver enkelt VM. Som standard markerer QEMU gæste-RAM som »mergeable«. For særligt følsomme VM'er deaktiverer jeg delingen eksplicit:

 

På den måde følger jeg en klar linje: bred implementering på servere med ensartede arbejdsbelastninger, målrettede undtagelser for særlige tilfælde.

Finjustering af KSM-parametrene i detaljer

  • run: 0 = slået fra, 1 = aktiv, 2 = slået fra og fjern sammenkædning af allerede sammenkædede sider. Jeg bruger kun „2“ til målrettede tests eller når jeg sikkert vil slå deling fra igen før vedligeholdelsesvinduer.
  • sider_der_skal_scannes: Hvor mange sider der kontrolleres pr. cyklus. Højere værdier fremskynder identificeringen af identiske sider, men øger CPU-belastningen.
  • sleep_millisecs: Pause mellem cyklusser. Længere pauser reducerer overhead, men det tager længere tid, før besparelsesplateauet nås.
  • merge_across_nodes: På NUMA-værter indstiller jeg dette til 0, så sammenlægning kun finder sted inden for en enkelt NUMA-node. Det sikrer lokalitet.
  • use_zero_pages: Hvis denne funktion er aktiveret, deler processer nul-sider effektivt med kernel-nul-siden. Dette giver „sikre“ besparelser uden COW-omkostninger.

Med ksmtuned justerer jeg dynamisk ud fra RAM-tærskler. Så snart den ledige hukommelse bliver knap, øger ksmtuned scanningshastigheden (Npagen-Boost); falder belastningen, reducerer det indsatsen igen. Det resulterer i en adaptiv, „åndende“ konfiguration uden manuelle indgreb.

Interaktion med THP, Huge Pages og ballooning (dybdegående)

Gennemsigtige store sider (THP) og Store sider optimerer CPU-effektiviteten, mens KSM reducerer redundansen i RAM. Her tager jeg højde for:

  • KSM arbejder med almindelige 4-KB-sider. THP-sider (oftest 2 MB) kan ikke dedupliceres. Jo mere THP griber ind, desto mindre »foder« har KSM.
  • Til latenskritiske eller CPU-afhængige arbejdsbelastninger foretrækker jeg THP/Huge Pages. Til værter med begrænset RAM og homogene VM’er prioriterer jeg KSM.
  • Ballooning supplerer KSM: Balloon-driveren frigiver ledig gaslagerplads til værten. KSM reducerer samtidig behovet ved at konsolidere identiske sider. Tilsammen udjævner jeg spidsbelastninger og forhindrer forhastet swapping.

Jeg træffer min beslutning på baggrund af empiriske data: Benchmark-tests med og uden THP/Huge Pages samt aktiv KSM viser mig, hvilken kombination der giver den bedste samlede omkostnings-ydelses-forhold.

Sikkerhedsmodeller og moderne CPU-funktioner

I miljøer med streng adskillelse af klienter slår jeg konsekvent deling pr. VM/host fra. Det minimerer indirekte informationskanaler via delte sider og forenkler compliance-kontroller. Moderne Lagringskryptering På vært/gæst-niveau (f.eks. pr. VM-nøgle) forhindrer dette i praksis, at KSM kan foretage en meningsfuld sammenlægning mellem gæster, da identisk indhold ikke længere findes bit for bit i den fysiske RAM. I sådanne klynger undgår jeg aggressiv scanning og holder ksmd ret passivt for ikke at lade CPU-ressourcerne køre i tomgang.

For mindre følsomme, men homogene stacks beholder jeg KSM som standard. Jeg dokumenterer politikken for hvert cluster: „Standard til, undtagelser via nosharepages“ eller „Standard fra, deling kun for definerede puljer“ – begge dele er gyldige, så længe det implementeres på en gennemsigtig og reproducerbar måde.

Egnethed i forhold til arbejdsbyrde og anti-mønstre

KSM udmærker sig ved ensartede arbejdsbelastninger med mange instanser (f.eks. mange identiske app-servere, JVM-baserede tjenester, agenter). Følgende drager mindre fordel heraf:

  • Stærkt varierende, kortvarige allokeringer (f.eks. mange små buffere, der ændres hurtigt), da sandsynligheden for COW er stor.
  • Komprimerede, krypterede eller pseudotilfældige data – der forekommer næsten ingen identiske sider.
  • Store in-memory-databaser med aggressiv sidegenbrug, når data ændrer sig hurtigt. Her opvejer fordelene ved Huge Pages/THP ofte ulemperne.

I container-farme kan KSM også fungere, forudsat at processerne markerer lagerpladsen som »mergeable«. I praksis fokuserer jeg dog primært på virtuelle maskiner (VM'er), fordi QEMU der allerede sætter de nødvendige madvise-flags.

Fejlfinding og typiske snublesten

  • Deling af sider stagnerer: Jeg tjekker, om QEMU/VM’er virkelig opretter sammenfletbar hukommelse (ingen »nosharepages«-direktive i libvirt-XML’en), og om ksmd kører. Hvis der ikke sker noget, er arbejdsbelastningen sandsynligvis for heterogen.
  • CPU-belastning for høj: Jeg øger værdien for `sleep_millisecs` og/eller sænker værdien for `pages_to_scan`. Derudover kan jeg deaktivere NUMA-overskridende sammenlægning for at indsnævre søgeområdet.
  • Uventede spidsbelastninger: Jeg undersøger, om der er en sammenhæng mellem COW-hændelser og belastningsspidser. I sådanne tilfælde sænker jeg scanningsfrekvensen eller udelukker de berørte VM’er midlertidigt fra delingen.
  • Overcommit eskalerer til swap: KSM er ikke en erstatning for kapacitetsplanlægning. Jeg sørger altid for at have en reserve af ledig RAM og justerer ksmd kun som en buffer, ikke som en nødløsning.

Planlægning, dimensionering og automatisering

For at opnå forudsigelige resultater definerer jeg målværdier for hver enkelt host:

  • Headroom: En fast procentuel buffer af ledig RAM, under hvilken ksmtuned bliver mere aggressiv. På den måde flytter jeg deduplikeringen til perioder, hvor der er et reelt behov.
  • Retfærdighed: Når arbejdsbelastningen er uensartet, opdeler jeg puljerne (f.eks. efter projekt/miljø), så ensartede virtuelle maskiner kan drage fordel af hinanden, uden at de uensartede „udvander“ fordelene.
  • Grænseværdier: Jeg fastsætter grænser for de maksimale scanningshastigheder og kontrollerer regelmæssigt, om besparelserne retfærdiggør CPU-forbruget.

Inden for automatisering betragter jeg KSM som en gentagelig, versionsstyret vejledning (f.eks. Systemd-drop-ins eller Cloud-Init-snippets). På den måde sikrer jeg, at nye værter tages i brug med det samme sæt parametre, og at afvigelser hurtigt bliver opdaget.

Oversigt til administratorer

Jeg bruger KSM, når værter kører mange lignende virtuelle maskiner, og RAM er den begrænsende faktor. Her giver deduplikering den største gevinst, mens jeg nøje styrer CPU-forbruget via ksmtuned og sysfs-parametre. I NUMA-opsætninger holder jeg sammenlægningen lokal, kombinerer KSM med ballooning og huge pages og måler effekten via pages_sharing samt latensmetrikker. For følsomme gæster deaktiverer jeg delingen målrettet og dokumenterer undtagelser på en gennemsigtig måde. På den måde øger jeg tæthed, sikre hurtige reaktionstider og reducere euroomkostningerne pr. instans på lang sigt.

Aktuelle artikler

Linux-server med visualiserede nøgletal for tryk-stall-information i datacentret
Administration

Linux PSI til præcis ydeevneanalyse og overvågning

Linux PSI (Pressure Stall Information) viser, i hvor høj grad CPU, hukommelse og I/O bremser dit system. Find ud af, hvordan du aktiverer PSI og bruger det til præcis overvågning af ydeevnen.