Ik laat zien hoe NUMA-balanceringsserver op hostinghardware stroomlijnt geheugentoegang en vermindert latenties door processen en gegevens aan het juiste NUMA-knooppunt te binden. De beslissende factor is de Geheugentoegang optimaliseren door lokale toegang, taakplaatsing en gerichte paginamigratie naar Linux-hosts met veel cores.
Centrale punten
- NUMA verdeelt CPU's en geheugen in knooppunten; lokale toegang biedt laag Vertraging.
- Automatisch NUMA Balancing migreert pagina's en plaatst taken dicht bij het knooppunt.
- VM-grootte per knooppunt, anders is er een risico NUMA vernietigen.
- Gereedschap als numactl, lscpu, numad tonen Topologie en gebruik.
- AfstemmenC-states, Node Interleaving van, Enorme pagina's, affiniteiten.
Wat NUMA is - en waarom het telt voor hosting
NUMA verdeelt een multiprocessorsysteem in Knooppunt, die elk hun eigen CPU's en lokale geheugen bevatten, waardoor toegang in de buurt sneller is dan toegang op afstand. Terwijl UMA alle cores naar een gemeenschappelijk pad stuurt, voorkomt NUMA knelpunten door lokale geheugenkanalen per node. In hostingomgevingen met veel parallelle VM's telt elke milliseconde latency op, dus elke aanvraag heeft meetbaar voordeel. Als u meer achtergrondinformatie wilt, kunt u meer te weten komen over NUMA-architectuur. Voor mij staat één ding vast: als je nodes begrijpt en gebruikt, haal je meer bandbreedte uit dezelfde hardware.
Automatisch NUMA balanceren in de Linux kernel - hoe het werkt
De kernel scant periodiek delen van de adresruimte en „unmaps“ pagina's zodat een hintfout kan worden gemaakt. optimaal knooppunt zichtbaar. Als de fout optreedt, evalueert het algoritme of het de moeite waard is om de pagina te migreren of de taak te verplaatsen en vermijdt onnodige verplaatsingen. Migreren op fout brengt Gegevens dichter bij de uitvoerende CPU, terwijl de NUMA-plaatsing van taken processen dichter bij hun geheugen plaatst. De scanner verdeelt zijn werk stuk voor stuk zodat de overhead binnen de ruis van de normale belasting blijft. Dit resulteert in voortdurende fijnafstemming die de latentie verlaagt zonder dat er harde regels voor pinning nodig zijn.
Geheugentoegang optimaliseren: lokaal verslaat extern
Lokale toegang gebruikt de Geheugencontroller van je eigen node en minimaliseert de wachttijden voor de interconnect. Toegang op afstand kost cycli via QPI/UPI of Infinity Fabric en minimaliseert zo de effectieve toegangstijd. Bandbreedte. Hoge core aantallen verergeren dit effect omdat meer en meer cores concurreren om dezelfde verbindingen. Ik plan daarom zo dat actieve code en actieve data samenkomen op één node. Als je dit negeert, geef je procentpunten weg die de responstijd of time-out bepalen tijdens belastingspieken.
VM-groottes, NUMA trashing en host cropping
Ik dimensioneer VM's zo dat vCPU's en RAM in een NUMA-node passen om cross-node toegang te voorkomen. Vaak leveren 4-8 vCPU's per node goede prestaties. Slagingspercentages, afhankelijk van het platform en de cachehiërarchie. Grote pagina's helpen ook omdat de TLB efficiënter werkt en paginamigraties minder vaak voorkomen. Indien nodig stel ik CPU-affiniteit voor latentiekritische processen om threads te binden aan geschikte cores - zie voor meer informatie CPU-affiniteit. Als je VM's over nodes verdeelt, riskeer je NUMA trashing, d.w.z. een ping-pong van gegevens en threads.
Hulpmiddelen in de praktijk: numactl, lscpu, numad
Met „lscpu“ lees ik Topologie en NUMA-knooppunten, inclusief de toewijzing van de kernen. „numactl -hardware“ toont me geheugen per node en beschikbare afstanden, wat het makkelijker maakt om de paden te evalueren. De daemon „numad“ bewaakt het gebruik en past de affiniteiten dynamisch aan wanneer de belastingscentra bewegen. Voor vaste scenario's gebruik ik „numactl -cpunodebind/-membind“ om processen en geheugen expliciet vast te pinnen. Op deze manier combineer ik automatisch balanceren met gerichte specificaties en controleer ik het resultaat via „perf“, „numastat“ en „/proc“.
Hoe ik de impact meet: Kerncijfers en opdrachten
Ik beoordeel NUMA-Tuning altijd via Meetreeks, niet op gevoel. Drie indicatoren hebben hun waarde bewezen: Verhouding tussen lokale en externe paginaweergaven, migratiegraad en latentieverdeling (P95/P99).
- Systeemwijdnumastat„ toont lokale/externe toegang en gemigreerde pagina's per knooppunt.
- Procesgerelateerd: „/proc//numa_maps“ laat zien waar geheugen zich bevindt en hoe het is verdeeld.
- PlanningweergaveCpus_allowed_list„ en real “Cpus_allowed„ controleren of bindingen van toepassing zijn.
# Systeembrede weergave
numastat
numastat -m
# Procesgerelateerde distributie en bindingen
pid=$(pidof )
numastat -p "$pid"
cat /proc/"$pid"/numa_maps | head
cat /proc/"$pid"/status | grep -E 'Cpus_allowed_list|Mems_allowed_list'.
taskset -cp "$pid"
# Kernelteller voor NUMA-activiteit
grep -E 'numa|migrate' /proc/vmstat
# Trace events voor diepe analyses (voor korte tijd activeren)
echo 1 > /sys/kernel/debug/tracing/events/mm/enable
slaap 5; cat /sys/kernel/debug/tracing/trace | grep -i numa; echo 0 > /sys/kernel/debug/tracing/events/mm/enable
Ik vergelijk in elk geval A/BOngebonden vs. gebonden, automatisch balanceren aan/uit en verschillende VM slices. Het doel is een duidelijke vermindering in toegang op afstand en migratieruis, evenals strakkere P95/P99 latencies. Pas als de gemeten waarden stabiel beter zijn, zal ik de tuning overnemen.
BIOS- en firmware-instellingen die echt werken
Ik schakel „Node Interleaving“ uit in het BIOS zodat de NUMA-structuur zichtbaar blijft en de kernel lokale kan plannen. Verminderde C-states stabiliseren latency pieken omdat cores minder snel in diepe slaaptoestanden vallen, wat wake-up tijd bespaart. Ik wijs geheugenkanalen symmetrisch toe zodat elke node zijn maximale geheugencapaciteit kan benutten. Bandbreedte bereikt. Ik test prefetchers en RAS functies met werklastprofielen, omdat ze helpen of schaden afhankelijk van het toegangspatroon. Ik meet elke verandering ten opzichte van een basislijn en pas daarna neem ik de instelling permanent over.
Kernel- en sysctl-parameters die het verschil maken
Het fijn afstellen van de kernel helpt me, Overhead en Reactietijd van de balancer aan te passen aan de werklast. Ik begin met conservatieve standaardinstellingen en werk stap voor stap naar voren.
- kernel.numa_balancingAan/uit van automatisch balanceren. Ik laat het aanstaan voor bewegende ladingen; ik schakel het uit voor speciale diensten met alleen pinnen als test.
- kernel.numa_balancing_scan_delay_msWachttijd voor de eerste scan na het aanmaken van het proces. Selecteer groter als er veel kortstondige taken draaien; kleiner voor langlopende diensten die een snelle nabijheid vereisen.
- kernel.numa_balancing_scan_period_min_ms / _max_msBandbreedte van de scanintervallen. Smalle intervallen verhogen de reactiesnelheid, maar ook de CPU-belasting.
- kernel.numa_balancing_scan_size_mbVerhouding van de adresruimte per scan. Te groot genereert hint-fout stormen, te klein reageert traag.
- vm.zone_terugwinnen_modusAls geheugen schaars is, geeft de kernel de voorkeur aan local reclaim in plaats van remote alloc. Voor algemene hosting werklasten laat ik meestal 0; Voor strikt latency-gevoelige, lokale geheugenservices test ik voorzichtig hogere waarden.
- Transparante grote pagina's (THP): Onder „/sys/kernel/mm/transparent_hugepage/{enabled,defrag}“ stel ik meestal in op madvise en conservatieve defragmentatie. Harde „altijd“ profielen brengen TLB-voordelen met zich mee, maar riskeren stalls door het compacten.
- sched_migratie_kosten_nsKostenraming voor taakmigratie. Hogere waarden dempen de herverdeling van agressieve planners.
- cgroepen cpusetMet cpuset.cpus en cpuset.mems Ik scheid services netjes per knooppunt en zorg ervoor dat Eerste aanraking binnen de toegestane knooppunten blijft.
# Voorbeeld: conservatief maar responsief balanceren
sysctl -w kernel.numa_balancing=1
sysctl -w kernel.numa_balancing_scan_delay_ms=30000
sysctl -w kernel.numa_balancing_scan_period_min_ms=60000
sysctl -w kernel.numa_balancing_scan_period_max_ms=300000
sysctl -w kernel.numa_balancing_scan_size_mb=256
# Gebruik THP voorzichtig
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo defer > /sys/kernel/mm/transparent_hugepage/defrag
Het blijft belangrijk: Verander slechts één stelschroef per testronde en test het effect tegen dezelfde belastingskromme. Zo ontwar ik oorzaak en gevolg.
Positioneer werklasten op de juiste manier: Databases, caches, containers
Databases profiteren wanneer bufferpools lokaal blijven per NUMA-knooppunt en threads dicht bij hun heaps worden gebonden. In in-memory caches stel ik sharding in op Knooppunt om fetches op afstand te vermijden. Containerplatforms ontvangen limieten en verzoeken zodat pods niet over nodes heen springen. Voor geheugenreserveringen gebruik ik Huge Pages, wat het makkelijker maakt om hotsets op te slaan in Caches passen. De volgende tabel vat de strategieën en typische effecten in compacte vorm samen.
| Strategie | Gebruik | Verwacht effect | Tip |
|---|---|---|---|
| Eerste aanraking | Databases, JVM-heaps | Toewijzing lokale zijde | Initialisatie uitvoeren op doelknooppunt |
| Interleave | Breed verdeelde belasting | Gelijkmatige verdeling | Niet optimaal voor hotspots |
| Taak vastzetten | Latency-kritieke services | Constante latentie | Minder flexibel bij veranderingen in belasting |
| Automatisch balanceren | Gemengde werklasten | Dynamische nabijheid | Overheadkosten afwegen tegen winst |
| Enorme pagina's | Grote hopen, caches | Minder TLB missers | Plan schone reserveringen |
Virtualisatie: virtuele NUMA, scheduler en gastaanpassing
Virtual NUMA geeft de host topologie in een vereenvoudigde vorm door aan het gast besturingssysteem zodat first-touch en Allocator verstandig werken. Hypervisor schedulers letten op de nabijheid van knooppunten bij het verdelen van vCPU's en het migreren van VM's. Ik lijn zelden grote VM's uit over meerdere nodes, tenzij de werklast breed stroomt en profiteert van interleave. In de gast pas ik de heaps van JVM's of databases aan zodat ze lokaal blijven op zichtbare NUMA nodes. Kijk voor geheugenbeheer in de gast eens naar Virtueel geheugen, om de paginagrootte en het wisselen te beperken.
PCIe nabijheid: NVMe en NIC's op de juiste knooppunten
Indien mogelijk wijs ik NVMe SSD's en snelle NIC's toe aan het knooppunt waarop de Werkbelasting draait. Dit voorkomt dat I/O verzoeken de interconnect oversteken en latency toevoegen. Ik bind multiqueue NIC's aan core sets van een node met RSS/RPS zodat IRQ's lokaal blijven. Voor opslagstacks is het de moeite waard om de threadpools node voor node te splitsen. Als u hier aandacht aan besteedt, zult u P99-latenties merkbaar verminderen en ruimte creëren voor belastingspieken.
IRQ en wachtrijaffiniteit in de praktijk
Ik controleer eerst welke NUMA-knooppunt apparaten en pin IRQ's en wachtrijen op de juiste manier. Dit zorgt ervoor dat de locatie van gegevenspaden behouden blijft.
# Apparaat-naar-knooppunt mapping
cat /sys/class/net/eth0/device/numa_node
cat /sys/block/nvme0n1/device/numa_node
# Stel IRQ affiniteit specifiek in (voorbeeld: cores 0-7 van een node)
irq=
echo 0-7 > /proc/irq/$irq/smp_affinity_list
# NIC-wachtrijen aan cores binden (RPS/RFS)
voor q in /sys/class/net/eth0/queues/rx-*; do echo 0-7 > "$q"/rps_cpus; done
sysctl -w net.core.rps_sock_flow_entries=32768
voor q in /sys/class/net/eth0/queues/rx-*; doe echo 4096 > "$q"/rps_flow_cnt; done
# NVMe wachtrijaffiniteit verbeteren
echo 2 > /sys/block/nvme0n1/queue/rq_affinity
cat /sys/block/nvme0n1/queue/scheduler # "none" voorkeur
„Ik voer “irqbalance" uit met knooppuntbewustzijn of stel het in op Uitzonderingen voor hot-path interrupts. Het resultaat is stabielere latencies, minder cross-node IRQ hops en een meetbare toename in lokale I/O hits.
Statisch binden vs. dynamisch balanceren - de middenweg
Ik gebruik „taskset“ en cgroups om harde regels in te stellen wanneer deterministisch Latency telt. Ik laat automatische NUMA-balancering actief wanneer de belasting beweegt en ik adaptieve nabijheid nodig heb. Een mix werkt vaak het beste: harde pinnen voor hotpaths, meer open grenzen voor ondersteunend werk. Ik controleer regelmatig of migraties merkbaar toenemen, omdat dit duidt op slechte planning. Het doel blijft om data- en threadlocaties zo te kiezen dat migratie zeldzaam maar mogelijk blijft.
NUMA in containers en Kubernetes
Ik neem een container mee cpusets en Enorme pagina's op de lijn. Ik wijs pods/containers toe aan een NUMA-knooppunt door consistente CPU- en geheugenhoeveelheden op te slaan. In orkestraties stel ik beleid in dat de voorkeur geeft aan toewijzingen aan enkele knooppunten en dus de eerste aanraking respecteert.
- Container runtime: „-cpuset-cpus“ en „-cpuset-mems“ houden taken en geheugen bij elkaar; wijs grote pagina's toe als bronnen.
- Topologie/CPU-managerStrikte of voorkeurstoewijzingen zorgen ervoor dat gerelateerde kernen en geheugengebieden worden toegewezen.
- Gegarandeerde QoSVaste aanvragen/limieten minimaliseren herverdeling door de planner.
Ik heb bewust sidecars en hulpprocessen naar andere kernen gesplitst binnen van hetzelfde knooppunt zodat het hotpath ongestoord blijft maar niet in de cross-node race terechtkomt.
CPU-topologieën begrijpen: CCD/CCX, SNC en Cluster-op-Die
Huidige server-CPU's splitsen sockets op in Subdomeinen met zijn eigen caches en paden. Ik houd hier rekening mee bij het snijden van kernen/hopen:
- AMD EPYCCCD/CCX en „NUMA per socket“ (NPS=1/2/4) beïnvloeden hoe fijn NUMA wordt gesneden. Meer nodes (NPS=4) verhogen de lokaliteit, maar vereisen schone pinning.
- IntelSub-NUMA Clustering (SNC2/4) verdeelt LLC in clusters. Goed voor geheugengebonden belastingen, op voorwaarde dat het OS en de werklast node-bewust zijn.
- L3 NabijheidIk bind threads die dezelfde heaps gebruiken aan hetzelfde L3-cluster om coherentieverkeer en cross-cluster hops te besparen.
Deze opties werken als een vermenigvuldiger: als ze correct worden gebruikt, verhogen ze Locality Bovendien - verkeerd geconfigureerd, verhogen ze de fragmentatie en het verkeer op afstand.
Stapsgewijze introductie en rollback plan
Ik introduceer nooit „big bang“ NUMA tuning. Een veerkrachtige Plan voorkomt verrassingen:
- BasislijnHardwaretopologie, P50/P95/P99 latenties, doorvoer, numastat rate capture.
- HypotheseFormuleer een specifiek doel (bijv. toegang op afstand -30%, P99 -20%).
- Een stapVerander slechts één stelschroef (bijv. VM-cut, cpuset, THP-beleid, scanintervallen).
- KanarieTest op 5-10% van de vloot onder echte belasting, houd rollback gereed.
- WaarderingMeetwaarden vergelijken, regressievensters definiëren, neveneffecten loggen.
- UitrolRol as voor as uit en meet opnieuw na elke as.
- OnderhoudMeet elk kwartaal opnieuw (kernel-, firmware- en werklastupdates veranderen het optimum).
Dit zorgt ervoor dat verbeteringen reproduceerbaar zijn en in geval van een fout binnen enkele minuten kunnen worden teruggedraaid.
Veelgemaakte fouten - en hoe ze te vermijden
Een typische misstap is het activeren van node interleaving in het BIOS, wat de NUMA topologie verbergt en Evenwicht moeilijker. Even ongunstig: VM's met meer vCPU's dan een node biedt, plus onzuiver gereserveerde enorme pagina's. Sommige beheerders pinnen alles vast en verliezen zo alle flexibiliteit wanneer werklasten verschuiven. Anderen vertrouwen volledig op de kernel, hoewel harde hotspots duidelijke regels vereisen. Ik neem meetreeksen op, herken uitschieters in een vroeg stadium en pas de instellingen en beleidsregels stap voor stap aan.
- THP „altijd“ zonder controle: Ongepland compacten verstoort de latentie. Ik gebruik liever „madvise“ en reserveer grote pagina's specifiek.
- vm.zone_terugwinnen_modus te agressief: Local reclaim kan op het verkeerde moment meer kwaad dan goed doen. Eerst meten, dan slijpen.
- irqbalans blindNiet-kritieke IRQ's bewegen over nodes. Ik stel uitzonderingen of vaste maskers in voor hotpaths.
- Mengsel van interleave + hard pinningTegenstrijdig beleid zorgt voor pingpong. Ik kies voor een duidelijke lijn voor elke dienst.
- Onzuivere cpusetsContainers zien een knooppunt, maar wijzen geheugen toe aan andere knooppunten. Stel „cpuset.mems“ altijd consistent in met de CPU-set.
- Sub-NUMA functies geactiveerd maar niet gebruikt: Meer nodes zonder planning verhogen de fragmentatie. Alleen inschakelen na testen.
Kort samengevat
NUMA Balancing Server brengt processen en gegevens op een gerichte manier samen, waardoor lokale toegang frequenter en efficiënter wordt. Latencies korter worden. Met een geschikte VM-grootte, een schone BIOS-configuratie en tools zoals numactl wordt een duidelijke topologie gecreëerd die de kernel gebruikt. Virtuele NUMA, grote pagina's en affiniteiten vullen automatische balancering aan in plaats van het te vervangen. Door I/O-apparaten dicht bij nodes aan te sluiten en hotpaths te gebruiken, wordt dure toegang op afstand geëlimineerd. Op deze manier schaalt hostinghardware betrouwbaar en levert elke CPU-seconde meer op. laadvermogen.


