NUMA-minne avgör för stora databasservrar hur nära trådarna arbetar i förhållande till det minne som behövs och i vilken utsträckning fördröjningar påverkar svarstider och genomströmning. Jag anpassar CPU-tilldelning, minnesplacering och arbetsbelastningens storlek på ett målinriktat sätt, minskar åtkomst från avlägsna platser och uppnår därmed en tillförlitlig, planerbar Prestanda.
Centrala punkter
- Topologi förstå: ta hänsyn till noder, kärnor, RAM och interconnect på ett målinriktat sätt.
- Policys Välj lämpligt alternativ: Strict, Preferred, Interleave beroende på arbetsbelastningsmålet.
- affinitet Implementera: Koppla trådar, IRQ:er och minne lokalt.
- Virtuella datorer Per nod: placera vCPU och RAM i en NUMA-nod.
- Övervakning Genomföra: Mäta fjärravläsningar, P99-latens och nodbelastning.
Att förstå NUMA-topologi
Jag inleder varje optimering med att Topologi: Hur många NUMA-noder finns det, hur är kärnorna fördelade, hur är RAM-minnet anslutet till socklarna och hur kostsamma är åtkomstoperationer över nätverket. Lokal minnesåtkomst tar betydligt mindre tid än åtkomst över nodgränserna, därför undviker jag onödiga Fjärrkontroll-metoder. Stora databasservrar gynnas av att jag planerar arbetsbelastningen så att trådar och data stannar kvar på samma nod. Om den aktiva datamängden inte ryms i en enda nod planerar jag fördelningen medvetet istället för att överlåta den till standardbeteendet. På så sätt håller jag Fördröjning låg och möjliggör en jämn genomströmning även vid hög belastning.
Välj rätt inställningar för BIOS och hårdvara
Jag kontrollerar i BIOS att Nodinterleaving är inaktiverad för att NUMA-separationen ska bibehållas. Jag fördelar minneskanalerna symmetriskt per sockel och är noga med konfigurationen (1DPC vs. 2DPC) så att klockfrekvensen och bandbredden inte sjunker i onödan. Funktioner som C-tillstånd och när det gäller latensmål ställer jag in de aggressiva energisparlägena mer konservativt, så att kärnorna inte hela tiden behöver vakna. SMT/Hyper-Threading Jag utvärderar detta utifrån den specifika arbetsbelastningen: För starkt minnesberoende OLTP-arbetsbelastningar begränsar jag antalet samtidigt aktiva SMT-trådar per kärna för att minska cachebelastningen och variabiliteten. Jag kontrollerar dessutom att PCIe-enheter (NIC:er, NVMe) är lokalt anslutna per sockel, så att deras IRQ:er och att DMA-vägarna inte går tvärs över interconnecten. Den som lägger en grundlig grund här skapar den bas på vilken policyer och affiniteter kan få full effekt.
Att välja rätt minnespolicyer
Valet av Policy styr från vilken nod kärnan ska allokera minne och hur fallback-lösningarna ska se ut. Strict sätter strikta gränser och avbryter allokeringar om målnoden inte har utrymme; detta prioriterar Effekt om flexibilitet. ”Preferred” prioriterar en viss nod, men faller tillbaka på andra vid brist och erbjuder därmed en medelväg. Interleave fördelar sidor enligt round-robin-metoden över flera noder, vilket kan vara lämpligt för mycket stora datamängder med jämn belastning. För många databaser är en lokal strategi med Preferred eller Strict oftast det bästa alternativet Val.
| Policy | Beteende | Typisk användning | Fördelar | Risker |
|---|---|---|---|---|
| Strikt | Hämtar endast lagringsutrymme från målnoden, annars uppstår ett fel | Latentzkritiska Databaser med tydlig planering av knutar | Så lokalt som möjligt Tillträden, förutsägbara fördröjningar | Tilldelningen kan misslyckas om noden är full |
| Föredraget | Föredragen nod, fallback till andra möjlig | Allmänt Arbetsbelastning med varierande belastning | Bra närhet med rimlig flexibilitet | Ökad andel distansarbete vid brist |
| Interleave | Round-robin över flera noder | Mycket stora, med många användningsområden Uppgifter | Fördelad belastning på flera noder | Sämre täckning, potentiellt högre fördröjning |
Trådar, CPU-affinitet och minnesbindning
Jag kopplar trådar till kärnorna i målnoden, allokerar minne med numactl och anpassar IRQ:er så att Uppgifter förbli lokalt. Denna kombination av CPU-affinitet och minnesbindning minskar kostsamma fjärravläsningar och ger en jämnare fördelning av körtiderna. För detaljerad kontroll använder jag policyer på process- eller trådnivå och håller buffertpoolen så nära de aktiva arbetartrådarna som möjligt. Den som vill fördjupa sig ytterligare hittar praktiska steg för att CPU-affinitet, som kan tillämpas direkt på produktiva värddatorer. På så sätt säkerställer jag en konsekvent Fördröjningar även när systemet är hårt belastat.
Prioritera lokala Hotsets
Jag identifierar Hotsets från Arbetsbelastning och placera dem strikt lokalt, medan ”kalla” data får placeras mer flexibelt. Genom denna prioritering håller jag mig nära nodens RAM-minne när det gäller kärnvägar. Om belastningen ökar skalar lösningen smidigt, eftersom de resurskrävande vägarna fortsätter att köras lokalt. Utan denna ordning börjar latenskurvan glida iväg så snart trådar i större utsträckning hämtar data över flera noder. En tydlig Bindning förhindrar just detta beteende på ett tillförlitligt sätt.
Sammanföra lagrings- och nätverks-NUMA
Jag organiserar NIC:er och NVMe-Jag tilldelar enheterna specifikt till socklarna och dirigerar deras IRQ:er till lokala kärnor. Jag ser till att Receive-/Transmit-Steering (RSS/RPS/XPS) är konsekvent per nod, så att paket bearbetas där databastrådarna också körs. För NVMe använder jag flera köer per kärna och kopplar fast IO-trådar lokalt, så att logg- och datavägar inte pendlar via interconnecten. För replikering separerar jag nätverksvägar per nod, så att inkommande WAL-/Redo-strömmar hamnar lokalt. På så sätt förblir IO– och CPU-vägarna är kongruenta, och databasen slösar inte bort cykler på onödiga kopior över hela minnesnätverket.
Planera virtuella maskiner utifrån nodstorlek
Jag dimensionerar virtuella maskiner så att antalet vCPU:er och RAM-minnet ryms i en fysisk NUMA-nod, eftersom det minskar Fördröjning och interconnect-trafik. Wide VM:er som är större än en nod sprider oundvikligen minnesåtkomsterna och förlorar därmed förutsägbarheten. Om en VM måste vara större planerar jag vNUMA explicit och ser till att fördelningen över noderna blir symmetrisk. På värdsidan undviker jag överteckning vid latenskrävande arbetsbelastningar och reserverar det lokala minnet per virtuell maskin. En snabb översikt över den fysiska nodstrukturen ges av „Planera NUMA-noder“, vilket underlättar beslut om VM-storlek och Fel förhindrar att den hamnar på fel plats.
Beakta inställningarna för hypervisorn
Jag kontrollerar hur hypervisorn presenterar vNUMA och håller reda på tilldelningen av vCPU-grupper till fysiska Kärnor Konsekvent. Dessutom ser jag till att virtuella maskinens NUMA-topologi stämmer överens med värdmaskinens, så att schemaläggaren kan förbli lokal. Jag håller minnesreservationer och anti-affinitetsregler så begränsade som möjligt, men så strikta som nödvändigt. Hög VM-täthet på ett sockel föredrar jag att ersätta med en fördelning nära noderna. På så sätt säkerställer jag Fjärrkontroll-Minimera antalet åtkomstförsök och se till att IO-vägarna förblir stabila.
Container- och orkestreringsövningar
I behållare placerar jag cpuset-Gränser som är konsekventa: Processorer och tillhörande minnesmasker (cpuset.cpus, cpuset.mems) hör ihop. Systemd-Slices och Units tilldelas fasta CPU-affiniteter så att kärnan verkligen kan genomdriva minnesprioriteringen. I orkestreringslagren planerar jag poddar/tjänster nära noden, använder jag topologibedömningar och statisk CPU-tilldelning för att förhindra att en arbetsbelastning pendlar mellan noder. Jag deklarerar Huge Pages explicit per pod/container och håller deras storlek och antal per nod stabilt. Viktigt: Jag kopplar infrastruktur- och sidoprocesser (loggning, sidecars, säkerhetskopiering) till andra kärnor eller till och med till den motsatta NUMA-noden för att inte störa databasens hotsets.
NUMA-balansering och optimering av operativsystemet
Automatisk NUMA-balansering kan lokala Tillträden förbättra när arbetsbelastningar flyttas eller faserna förändras kraftigt. Jag använder det målmedvetet, men håller ett öga på om det stör mer än det hjälper att flytta sidor fram och tillbaka. Fastlagda processer med tydlig affinitet drar ofta större nytta av manuellt inställda policyer än av ständiga omfördelningar. Jag granskar kärnparametrar, IRQ-styrning och transparenta Huge Pages i respektive sammanhang för databasen och plattformen. Som utgångspunkt hjälper detta mig NUMA-balansering-En guide för att steg för steg testa inställningarna och spridning att minska fördröjningarna.
Använda Huge Pages på ett målinriktat sätt
Jag använder Huge Pages för att minska antalet TLB-missar och stora Minnehantera områdena mer effektivt. För databasserver reserverar jag sidorna i förväg, tilldelar dem till noder och kontrollerar om instansen faktiskt använder dem. Jag inaktiverar ofta Transparent Huge Pages vid latensmål och ställer in statiska Huge Pages så att allokeringen förblir deterministisk. Avgörande är dock närheten till NUMA-noden; Huge Pages förstärker en bra strategi, men ersätter den inte. Den som ignorerar detta vinner knappast något. Effekt och riskerar biverkningar vid paging.
Dimensionering av databaser: Bufferpool och arbetsvolym
Jag planerar den aktiva arbetsvolymen så att buffertpoolen, lås- och planeringscacherna samt de mest efterfrågade tabeller passar in i en nod. Vid mycket stora instanser delar jag upp tjänster eller shards mellan noderna, istället för att sträcka ut en enorm monolitisk instans över alla noder. För OLTP-fall håller jag buffertpoolen per nod kompakt och prioriterar lokala träfffrekvenser. För OLAP-skanningar kan interleave vara lämpligt i särskilda fall, när datamängden är enorm och jämnt fördelad. Utan denna disciplin växer Interconnect-Trafiken och tär på reserverna just när belastningstoppar uppstår.
Databasspecifika knep
Jag tar hänsyn till motorns process- och trådmodell: PostgreSQL använder processer, därför kör jag huvudinstansen, Autovacuum och Checkpointer separat för varje nod och håller shared_buffers lokalt per shard. Vid MySQL/InnoDB jag sorterar bufferpoolinstanser på noder och anpassa IO-trådar och loggskrivare lokalt. SQL Server drar nytta av anpassad Soft-NUMA och en tilldelning som fördelar schemaläggare och minnesgrupper längs de fysiska noderna. Oracle-Jag konfigurerar instanser med lokala Large Pages och segmenterar arbets- och IO-servrarna mellan noderna. Generellt sett minskar jag allokatorns (t.ex. jemalloc) arenakonflikter genom NUMA-medvetna arenor och ser till att Låshanterare och se till att latch-hotspots förblir lokala genom att utföra partitionering och sharding längs noderna.
Uppföljning: Nyckeltal som spelar roll
Jag mäter fjärravläsningar, trafik mellan noder, sidfel per nod och P99-Fördröjning de relevanta sökningarna. Dessutom övervakar jag CPU-utnyttjandet per nod, NUMA-miss-förhållanden och andelen lokala minnesåtkomsthändelser. Denna översikt visar om policyn fungerar eller om trådar på ett okontrollerat sätt hämtar data från avlägsna sidor. Jag korrelerar toppar med schemaläggarens beslut, migreringshändelser och allokeringsfel. Det är först dessa mätvärden som bekräftar att Policy inte bara i laboratoriet, utan även på lång sikt i produktionssystemet.
Teststrategi och införande
Jag testar stegvis: Först mikrobänkmarker för att Bandbredd och latens per nod, sedan realistiska arbetsbelastningar med kalla och varma cacher. Jag ökar belastningsnivåerna stegvis, mäter P95/P99/P99,9 och observerar fördelningen, inte bara medelvärdena. Jag dokumenterar varje ändring (policy, affiniteter, Huge Pages, IRQ-styrning) och jämför A/B under identiska förutsättningar. Innan lanseringen definierar jag Kriterier för avbokning och en återställningsplan så att jag snabbt kan återgå till den tidigare konfigurationen vid regressioner. Ett kort soak-test under kontinuerlig belastning täcker Drift och migrationer som förblir osynliga på kort sikt.
Steg-för-steg-anvisning
Först registrerar jag Topologi: Antal noder, kärntilldelning, minneskanaler och interconnect. Därefter fastställer jag målbelastningen per nod och kontrollerar om hotsets passar in. I nästa steg ställer jag in CPU-affinitet, IRQ-styrning och minnesbindning på process- eller trådnivå. Sedan aktiverar eller inaktiverar jag NUMA-balansering beroende på arbetsbelastningens dynamik och reserverar vid behov Huge Pages per nod. Slutligen verifierar jag resultatet med repeterbara belastningstester och övervakar Nyckeltal i kontinuerlig drift.
Praktiska exempel och hinder
En OLTP-instans med många korta transaktioner får mätbara fördelar om jag ställer in arbetartrådar och buffertpoolen på en Nod ange och ställa in Strict eller Preferred. Ett datalager med breda sökningar kan dra nytta av Interleave om data används mycket jämnt och noderna utnyttjas väl. VM:er blir märkbart svårare att planera så snart de växer över nodgränserna och hypervisorn tilldelar minne på ett förskjutet sätt. Jag ser ofta att en enda „bred“ VM överbelastar interconnecten och därmed också saktar ner angränsande VM:er. Dessa effekter försvinner så snart jag går över till lokal Tilldelning och återgår till en ren vNUMA-konfiguration.
Felscenarier och antimönster
Med Strikt ökar jag risken för att allokeringar misslyckas och att OOM-killer träder in. Därför håller jag ledigt utrymme på målnoden, övervakar misslyckade försök och definierar reservlösningar (t.ex. riktad storleksjustering utanför högtrafikperioderna). Transparent Huge Pages i alltid-läget orsakar i latensvägar Defragmentering och stall – jag använder statiska bokningar eller aktiverar THP madvise. Automatisk NUMA-balansering kan flytta sidor fram och tillbaka vid varierande belastning; om jag upptäcker mönster av sidhopp återställer jag inställningarna manuellt. I virtuella maskiner är Ballongflygning och minneskomprimering är ett hot mot förutsägbarheten; jag inaktiverar dessa funktioner för kritiska databaser. Live-migreringar mellan noder planerar jag endast under avbrottsfönster, eller så flyttar jag först data på databassidan så att interconnecten inte blir överbelastad i andra hand.
Kapacitetsplanering och tillväxt
Jag planerar en per nod Reserv Jag använder 10–20 % för belastningstoppar, Autovacuum/Compaction och periodiska underhållsjobb. Om datamängden ökar skalar jag först ut längs noderna (shards/tjänster) istället för att blint utöka hela buffertpoolen. Jag förhindrar en smygande „smygtillväxt“ genom strikta gränsvärden per nod och varningssignaler så snart lokala träfffrekvenser sjunker eller andelen fjärranslutningar ökar. I prognoserna för de kommande kvartalen tar jag inte bara hänsyn till datavolymen, utan även Transaktionsfrekvenser och förändrade åtkomstfördelningar, eftersom dessa ofta förskjuter hotsets snabbare än det rena minnesbehovet. På så sätt förblir plattformen stabil – och utbyggnader sker på ett kontrollerat sätt utan att NUMA-lokaliteten äventyras.
Kort balansräkning
Jag optimerar stora databasservrar genom att NUMA-Att på ett smidigt sätt sammanföra topologi, policyer och arbetsbelastningens storlek. Lokal lagringstilldelning ger de avgörande millisekunderna, medan oplanerade fjärråtkomster ökar P99-latensen. I framtiden planerar jag virtuella maskiner så att de passar in i noder eller utnyttjar vNUMA på ett tydligt sätt. Jag använder operativsysteminställningar, affiniteter och Huge Pages på ett målinriktat sätt, kontrollerar deras effekt och rullar ut ändringar endast med hjälp av mätpunkter. Den som följer dessa steg uppnår den förväntade Effekt består av modern hårdvara och ser till att plattformarna fungerar snabbt och pålitligt även under hög belastning.


