NUMA-teadlikkus ja CPU-pinning pühendatud serverite jaoks

16 min lugemine - 16. juuni 2026

hero section cover
Sisukord
  • NUMA-teadlikkus ja CPU-pinning pühendatud serverite puhul
  • Kuidas NUMA töötab mitme pesaga serverites
  • NUMA-topoloogia kontrollimine Linuxis
  • CPU-kinnitamine ja mälupoliitikad
  • Strateegia valimine töökoormuse järgi
  • Kontrollitavad BIOS-i ja tuuma seaded
Jaga

Kuidas kontrollida NUMA topoloogiat ja suunata Linuxi töökoormused õigetele tuumadele ja mällu. Käsitleb numactl, taskset, systemd, BIOS-seadeid ja töökoormusele spetsiifilisi strateegiaid.

NUMA-teadlikkus ja CPU-pinning pühendatud serverite puhul

Igal mitme pesaga serveril on protsessi käivitamine ja selle mälu asukoht kaks erinevat küsimust, ning nende sünkroniseerimise kaotamine on üks lihtsamaid viise jõudluse kaotamiseks. NUMA-teadlikkus ja CPU-pinning on kaks nuppu, mis selle probleemi lahendavad. See postitus käsitleb NUMA toimimist, selle kontrollimist Linuxis ning töökoormuste õiget pinningut andmebaaside, tehisintellekti koolituse ja latentsusele tundlike teenuste jaoks.

Kuidas NUMA töötab mitme pesaga serverites

NUMA (Non-Uniform Memory Access) sõlm on CPU-tuumade rühm, mis on seotud kohaliku RAM-plokiga spetsiaalse mälukontrolleri kaudu. Kahe pesaga serveril on tavaliselt kaks sõlme. Iga tuum saab lugeda mis tahes aadressi, kuid kohalik juurdepääs on umbes 80 ns, samas kui pistikupesaülene hüpe Inteli UPI või AMD Infinity Fabrici kaudu on umbes 130–150 ns. Suurematel süsteemidel, kus on rohkem pistikupesi, võib halvimal juhul sõlme aeg ületada 250 ns.

Läbilaskevõime järgib sama mustrit. Kahe pesaga Sapphire Rapids süsteem suudab säilitada umbes 600 GB/s, kui tuumad kasutavad kohalikku mälu, kuid pesadevaheline ühendus on sellest vaid murdosa, mistõttu selle läbiv liiklus tekitab kiiresti pudelikaela. Suure tuumade arvuga protsessorid muudavad selle veelgi detailsemaks: Inteli Sub-NUMA Clustering (SNC) ja AMD Nodes Per Socket (NPS) jagavad iga pesa mitmeks NUMA-domeeniks, nii et „kahe pesaga” seade võib Linuxile kergesti esitada neli või kaheksa sõlme.

Ilma NUMA-teadlikkuseta migreerib Linuxi ajastaja rõõmsalt niiti pesade vahel, samal ajal kui selle töökogum jääb algsele sõlme. Iga järgnev juurdepääs muutub kaugjuurdepääsuks. Nähtavaks sümptomiks on kõrge CPU-kasutus ja madal tegelik läbilaskevõime, sest tuumad veedavad oma aega mälu ootamisel. I/O-seadmed muudavad olukorra veelgi halvemaks. GPU või NIC on ühendatud konkreetse PCIe juurega, mis kuulub ühele NUMA-sõlme. Kui seda toitvat protsessi käitatakse teisel pesal, läbib iga DMA-ülekanne ühendusvõrgu.

NUMA-topoloogia kontrollimine Linuxis

Neli tööriista katavad peaaegu kõik vajalikud funktsioonid:

  • lscpu kiireks pistikupesa ja sõlme kokkuvõtteks.
  • numactl --hardware sõlmede mälu kogumahu ja sõlmedevahelise kauguse maatriksi jaoks.
  • numastat protsessipõhiste tabamuste/möödalaskmiste loendurite jaoks.
  • lstopo (hwloc-ist) vahemälude hierarhia ja PCIe-seadmete paiknemise jaoks.

Alustage numactl --hardware. See loetleb iga sõlme, sellele kuuluvad tuumad ja mälu ning kauguste maatriksi. Väärtus 10 tähistab lokaalsust, 20+ kaugust. Kui näed mitme pesaga seadmes ühteainsat sõlme, on su BIOS-is aktiveeritud sõlmede vaheldumine (Node Interleaving) ja see varjab topoloogiat; paranda see esmalt (vaata allpool).

Konkreetsele protsessile numastat -p <PID> näitab, kuhu selle mälu tegelikult eraldatakse. Olulised on neli loendurit:

  • numa_hit: sihtsõlmes eraldatud mälu. Soovite, et see oleks kõrge.
  • numa_miss: sihtsõlm oli täis, eraldamine kandus mujale.
  • numa_foreign: teine sõlm üritas eraldada mälu kohapeal, kuid ei suutnud, mis viitab mälukoormusele.
  • other_node: leheküljed, mis on eraldatud muule sõlme kui see, kus protsess töötab. Kõrged väärtused siin on klassikaline märk halvast kinnitamisest.

GPU või NIC töökoormuste puhul käivitage lstopo-no-graphics ja vaadake, millise NUMA sõlme külge iga PCIe seade on ühendatud. Kui seadet juhtivad tuumad asuvad teises sõlmes, on see esimene asi, mida tuleb parandada.

CPU-kinnitamine ja mälupoliitikad

CPU-pinning (või CPU-affinity) seob protsessi kindlate tuumadega, nii et ajastaja ei saa seda migreerida. Sellest üksi ei piisa, sest Linux kasutab vaikimisi first-touch-mälu poliitikat: leheküljed eraldatakse sellele sõlme, mis neile esimesena kirjutab. Kui niit käivitub valel sõlmel enne kinnitamist, jääb selle mälu sinna. Tuleb kontrollida nii paigutust kui ka eraldamist.

Kolm tööriista katavad tavapärased juhtumid:

TööriistKontrollKasutamine
tasksetAinult CPU tuumadOlemasoleva protsessi kiire ühekordne sidumine
numactlCPU tuumad ja mäluTöökoormuste käivitamine rangelt lokaalselt
systemdCPU tuumad ja mälu, püsivTeenused, mis vajavad kinnitamist taaskäivituste vahel

numactl toetab nelja mälupoliitikat:

  • --membind=N: eralda ainult sõlmes N, ebaõnnestub, kui täis.
  • --preferred=N: eelistab sõlme N, vajadusel kasutab teisi.
  • --interleave=all: ringhääling sõlmede vahel ühtlase ribalaiuse jaotuse tagamiseks.
  • --localalloc: eraldada sõlmes, kus töötab CPU.

Töökoormuse kinnitamine ühele sõlme

Esmalt tuvasta, millised tuumad kuuluvad sinu sihtsõlme juurde:

numactl --hardware

Seejärel käivitage rakendus, mis on seotud selle sõlme mõlema tuuma ja mäluga:

numactl --cpunodebind=0 --membind=0 ./your_application

Juba töötava protsessi puhul kohandage CPU-affiniteeti käsuga taskset:

taskset -cp 0-7 <PID>

Et see säiliks ka pärast taaskäivitamist, seadistage see systemd-üksuses:

[Service]
CPUAffinity=0-7
NUMAPolicy=bind
NUMAMask=0

Laadige uuesti ja taaskäivitage:

sudo systemctl daemon-reload && sudo systemctl restart <service>

Kui teete käsitsi kinnitamist, lülitage välja tuuma automaatne tasakaalustaja, et see ei segaks teie paigutust:

sysctl -w kernel.numa_balancing=0

Lisage see /etc/sysctl.conf , et see püsiks. Seejärel kontrollige seda numastat -p <PID> mõne minuti jooksul tegeliku töökoormuse juures. Kui other_node jääb nullilähedaseks, toimib kinnitamine.

Strateegia valimine töökoormuse järgi

Õige poliitika sõltub sellest, kas teie töökoormusele on kasulikum madal latentsus või kogu sõlmede koondribalaius.

TöökoormusPoliitikaMiks
Andmebaasid (PostgreSQL, MySQL, SQL Server)--cpunodebind + --membindSuured jagatud puhvrid, latentsusele tundlikud päringuteed
Mälusisene vahemälu (Redis, Memcached)Ühe sõlme sidumineKõik toimub RAM-i kaudu, kaugviivitus ilmneb kohe
AI/ML koolitus ja järeldamineSeos GPU NUMA-sõlmeVäldib tensorite ülekandeid PCIe juurte kaudu
Analüütika (Spark, Elasticsearch)--interleave=allSuur töökogum vajab ribalaiust kõigis sõlmedes
Viivitusele tundlikud API-d, kauplemineRange pin + IRQ afiinsusEnnustatavus on olulisem kui tippvõimsus
Võrgumahukas (RoCEv2, InfiniBand)Pin NIC-i NUMA-sõlme, pühenda tuumad IRQ-deleHoia katkestuste töötlemine kohalikul tasandil ja eemal rakenduse niitidest

Spetsiaalselt GPU töökoormuste jaoks käivita lstopo et leida, millisel NUMA-sõlmel GPU asub, seejärel käivita treening- või järeldusprotsess numactl --cpunodebind=N --membind=N selle sama N jaoks. See on üks lihtsamaid viise mitme pesaga GPU-serveris, kuna vaikimisi paigutus ajastajas on sageli vale.

Mõlemat pesa hõlmavate HPC- ja MPI-töökoormuste puhul kinnita iga rida ühe sõlme külge käsuga localalloc selle asemel, et kõike vaheldumisi paigutada. Iga rida saab kohaliku mälu ja paralleelsus toimub rea tasandil.

Üks praktiline märkus: kui kinnitate ühe sõlme külge, jätke sellele 2–4 GB vaba ruumi. Peaaegu täis töötav sõlm käivitab mälu vabastamise, mis maksab teile latentsust, mida te püüdsite säästa.

Kontrollitavad BIOS-i ja tuuma seaded

Tööriista väljund on vaid nii täpne, kui on püsivara poolt avaldatud topoloogia. Mõned seaded, mida tuleb kontrollida:

  • Node Interleaving: lülitage see välja. Kui see on sisse lülitatud, kuvab BIOS kogu mälu üheainsa tasase mälupoolina ja peidab NUMA operatsioonisüsteemilt täielikult. numactl --hardware Sellisel juhul kuvatakse mitme pesaga seadmel üks sõlm.
  • Sub-NUMA klastrite moodustamine (Intel) või sõlmed pesa kohta (AMD): lülitage sisse suure tuumade arvuga protsessoritel, kui soovite täpsemat paikalisust. Kinnitab lscpu pärast taaskäivitamist.
  • vm.zone_reclaim_mode: seadke enamiku tootmisserverite puhul väärtuseks 0. Mitte-nullväärtus taastab agressiivselt kohaliku mälu, selle asemel et eraldada seda kaugelt, mis võib eemaldada kasuliku lehekülje vahemälu.
  • kernel.numa_balancing: jäta sisse üldotstarbeliste töökoormuste jaoks, lülita välja, kui teed käsitsi kinnitamist. Automaatne tasakaalustaja migreerib lehti ja niite viisil, mis on vastuolus sinu poliitikaga.

Kui teete NUMA-häälestust bare metal-keskkonnas, kus kontrollite BIOS-i, tuumaparametreid ja IRQ-affiniteeti, saate rakendada kõiki eespool nimetatud meetmeid ilma hüperviisori abstraktsioone vältimata. See on peamine põhjus, miks selline töö on pühendatud riistvaral lihtsam kui pilve virtuaalmasinates.

Täieliku juuripääsuga mitme pesaga spetsiaalsete serverite kohta vaadake FDC spetsiaalseid servereid.

Blogi

Sel nädalal esile tõstetud

Rohkem artikleid
Timmitud profiilid Linuxi serverite töökoormuse optimeerimiseks

Timmitud profiilid Linuxi serverite töökoormuse optimeerimiseks

Kuidas valida, rakendada ja kohandada häälestatud profiile GPU, andmebaasi ja suure ribalaiusega Linuxi serverite jaoks, koos näidete ja Ansible'i kasutuselevõtunippidega.

16 min lugemine - 9. juuni 2026

Linux OOM Killer Tuning for VPS: Praktiline juhend

12 min lugemine - 8. juuni 2026

Rohkem artikleid
background image

Kas teil on küsimusi või vajate kohandatud lahendust?

icon

Paindlikud võimalused

icon

Ülemaailmne haare

icon

Kohene kasutuselevõtt

icon

Paindlikud võimalused

icon

Ülemaailmne haare

icon

Kohene kasutuselevõtt