NUMA-tudatosság és CPU-pinning dedikált szerverek esetében

16 perc olvasás - 2026. június 16.

hero section cover
Tartalomjegyzék
  • NUMA-tudatosság és CPU-pinning dedikált szerverek esetében
  • Hogyan működik a NUMA a többaljzatos szervereken
  • A NUMA-topológia ellenőrzése Linuxon
  • CPU-pinning és memória-szabályok
  • Stratégia kiválasztása a munkaterhelés alapján
  • Ellenőrizendő BIOS- és kernel-beállítások
Megosztás

Hogyan lehet ellenőrizni a NUMA-topológiát, és hogyan lehet a Linux-munkafolyamatokat a megfelelő magokhoz és memóriához rendelni. A cikk kitér a numactl, a taskset, a systemd, a BIOS-beállítások és a munkafolyamat-specifikus stratégiákra.

NUMA-tudatosság és CPU-pinning dedikált szerverek esetében

Bármely többmagos szerveren az, hogy hol fut egy folyamat, és hol található a memóriája, két különböző kérdés, és ezek szinkronizálásának elmulasztása az egyik legegyszerűbb módja annak, hogy a teljesítmény romoljon. A NUMA-tudatosság és a CPU-pinning a két eszköz, amely ezt orvosolja. Ez a bejegyzés bemutatja, hogyan működik a NUMA, hogyan lehet ellenőrizni Linuxon, és hogyan lehet helyesen rögzíteni a munkaterheléseket adatbázisok, AI-képzés és késleltetésérzékeny szolgáltatások esetében.

Hogyan működik a NUMA a többaljzatos szervereken

A NUMA (Non-Uniform Memory Access) csomópont egy CPU-magokból álló csoport, amely egy dedikált memóriavezérlőn keresztül kapcsolódik a helyi RAM-blokkhoz. Egy kétaljzatos szerveren általában két csomópont található. Bármelyik mag bármelyik címet elolvashatja, de a helyi hozzáférés nagyjából 80 ns, míg az Intel UPI-n vagy az AMD Infinity Fabric-en keresztül történő aljzatok közötti átvitel körülbelül 130–150 ns. Nagyobb, több aljzattal rendelkező rendszereken a legrosszabb esetben a csomópont meghaladhatja a 250 ns-ot.

A sávszélesség ugyanazt a mintát követi. Egy kétaljzatos Sapphire Rapids rendszer körülbelül 600 GB/s sebességet tud fenntartani, amikor a magok a helyi memóriát érik el, de az aljzatok közötti kapcsolat ennek csak töredéke, így a rajta átmenő forgalom gyorsan szűk keresztmetszetté válik. A nagy magszámú processzorok ezt finomabbá teszik: az Intel Sub-NUMA Clustering (SNC) és az AMD Nodes Per Socket (NPS) technológiái minden aljzatot több NUMA-tartományra osztanak, így egy „két aljzatos” gép könnyen négy vagy nyolc csomópontot jeleníthet meg a Linux számára.

NUMA-tudatosság nélkül a Linux ütemezője boldogan migrál egy szálat az aljzatok között, miközben a munkakészlete az eredeti csomóponton marad. Minden további hozzáférés távoli lesz. A látható tünet a magas CPU-kihasználtság alacsony tényleges átviteli sebességgel, mert a magok az idejüket a memóriára várakozással töltik. Az I/O-eszközök ezt még tovább rontják. A GPU vagy a NIC egy adott PCIe gyökérhez van csatlakoztatva, amely egy NUMA csomóponthoz tartozik. Ha az azt tápláló folyamat a másik aljzaton fut, minden DMA-átvitel átmegy az összekötőn.

A NUMA-topológia ellenőrzése Linuxon

Négy eszközzel szinte mindenre kiterjedhet:

  • lscpu a socketek és csomópontok gyors áttekintéséhez.
  • numactl --hardware a csomópontok memóriájának összegeihez és a csomópontok közötti távolságmátrixhoz.
  • numastat a folyamatonkénti találati/hibás találati számlálókhoz.
  • lstopo (a hwloc-ból) a cache-hierarchia és a PCIe-eszközök lokalitása.

Kezdje a numactl --hardware. Ez felsorolja az egyes csomópontokat, a hozzájuk tartozó magokat és memóriákat, valamint a távolságmátrixot. A 10-es érték helyi, a 20 feletti érték távoli. Ha egy többaljzatos gépen egyetlen csomópontot lát, akkor a BIOS-ban engedélyezve van a Node Interleaving, és elrejti a topológiát; ezt először javítsa ki (lásd alább).

Egy adott folyamat esetében a numastat -p <PID> részletezi, hogy a memóriája valójában hol van allokálva. Négy számláló számít:

  • numa_hit: a tervezett csomóponton allokált memória. Ez legyen magas.
  • numa_miss: a tervezett csomópont tele volt, a kiosztás máshova került.
  • numa_foreign: egy másik csomópont megpróbálta helyben allokálni, de nem sikerült, ami memóriahiányra utal.
  • other_node: a folyamat futási helyétől eltérő csomóponton allokált oldalak. A magas értékek itt a rossz rögzítés klasszikus jelei.

GPU- vagy NIC-terhelések esetén futtassa a lstopo-no-graphics parancsot, és nézze meg, hogy az egyes PCIe-eszközök melyik NUMA-csomóponthoz vannak csatlakoztatva. Ha az eszközt vezérlő magok egy másik csomóponton vannak, akkor ezt kell először kijavítani.

CPU-pinning és memória-szabályok

A CPU-pinning (vagy CPU-affinity) egy folyamatot konkrét magokhoz köt, így a ütemező nem tudja áthelyezni. Ez önmagában nem elég, mert a Linux alapértelmezés szerint first-touch memóriapolitikát használ: az oldalakat azon a csomóponton osztja ki, amelyik először ír rájuk. Ha egy szál a rögzítés előtt rossz csomóponton indul el, a memóriája ott marad. A elhelyezést és a kiosztást együtt kell szabályozni.

Három eszköz fedezi a gyakori eseteket:

EszközVezérlőkHasználata
tasksetCsak CPU-magokMeglévő folyamat gyors, egyszeri összekapcsolása
numactlCPU-magok és memóriaSzigorú lokalitású munkaterhelések indítása
systemdCPU-magok és memória, állandóÚjraindítások között rögzítésre szoruló szolgáltatások

numactl négy memória-politikát támogat:

  • --membind=N: csak az N csomóponton allokál, ha az megtelt, hibaüzenetet ad.
  • --preferred=N: előnyben részesíti az N csomópontot, szükség esetén másokra vált.
  • --interleave=all: körkörös elosztás a csomópontok között az egyenletes sávszélesség-elosztás érdekében.
  • --localalloc: allokálás azon a csomóponton, amelyiken a futó CPU található.

A munkaterhelés egy csomóponthoz való rögzítése

Először azonosítsa, mely magok tartoznak a célcsomóponthoz:

numactl --hardware

Ezután indítsa el az alkalmazást úgy, hogy mind a magok, mind a memória ahhoz a csomóponthoz legyen kötve:

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

Már futó folyamat esetén állítsa be a CPU-affinitást a taskset:

taskset -cp 0-7 <PID>

Ahhoz, hogy az újraindítás után is megmaradjon, állítsa be a systemd egységben:

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

Töltse be újra és indítsa újra:

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

Ha manuálisan rögzíti, kapcsolja ki a kernel automatikus kiegyensúlyozóját, hogy ne akadályozza az elhelyezést:

sysctl -w kernel.numa_balancing=0

Adja hozzá a /etc/sysctl.conf hogy megmaradjon. Ezután ellenőrizze a numastat -p <PID> néhány percnyi valós terhelés mellett. Ha other_node a nullához közel marad, akkor a rögzítés hatékony.

Stratégia kiválasztása a munkaterhelés alapján

A megfelelő politika attól függ, hogy a munkaterhelésnek inkább az alacsony késleltetés vagy az összes csomóponton átnyúló összesített sávszélesség kedvez-e.

MunkaterhelésIrányelvMiért
Adatbázisok (PostgreSQL, MySQL, SQL Server)--cpunodebind + --membindNagy megosztott pufferek, késleltetésérzékeny lekérdezési útvonalak
Memóriában tárolt gyorsítótár (Redis, Memcached)Egycsomópontos kötésMinden RAM-hozzáférés, a távoli késleltetés azonnal megjelenik
AI/ML képzés és következtetésKapcsolódás a GPU NUMA csomópontjáhozElkerüli a tenzorok PCIe-gyökerek közötti átvitelét
Analitika (Spark, Elasticsearch)--interleave=allA nagy munkakészlethez sávszélességre van szükség az összes csomóponton
Késleltetésérzékeny API-k, kereskedésSzigorú pin + IRQ affinitásA kiszámíthatóság fontosabb, mint a csúcsátviteli sebesség
Hálózatigényes (RoCEv2, InfiniBand)Pin a NIC NUMA csomópontjához, dedikált magok az IRQ-k számáraAz interrupt-feldolgozás helyi marad, és nem zavarja az alkalmazás szálakat

Kifejezetten GPU-terhelések esetén futtassa lstopo parancsot, hogy meghatározza, melyik NUMA csomóponton található a GPU, majd indítsa el a képzési vagy következtetési folyamatot a numactl --cpunodebind=N --membind=N ugyanazon N-hez. Ez az egyik legkönnyebben elérhető előny egy több aljzatú GPU-kiszolgálón, mivel az alapértelmezett ütemező elhelyezése gyakran helytelen.

A mindkét aljzatot átfogó HPC és MPI terhelések esetében rögzítse az egyes rangokat egyetlen csomóponthoz a localalloc parancs segítségével egyetlen csomóponthoz, ahelyett, hogy mindent összefonna. Minden rang helyi memóriát kap, és a párhuzamosság a rang szintjén valósul meg.

Egy gyakorlati megjegyzés: ha egyetlen csomóponthoz rendeli, hagyjon rajta 2–4 GB szabad helyet. A szinte teljes kapacitással futó csomópont visszanyerést vált ki, ami megdrágítja azt a késleltetést, amit megpróbált megtakarítani.

Ellenőrizendő BIOS- és kernel-beállítások

Az eszköz kimenete csak annyira pontos, amennyire a firmware feltárja a topológiát. Néhány beállítás, amelyet ellenőrizni kell:

  • Node Interleaving: tiltsa le. Ha engedélyezve van, a BIOS az összes memóriát egyetlen lapos poolként jeleníti meg, és teljesen elrejti a NUMA-t az operációs rendszer elől. numactl --hardware Ebben az esetben egy többaljzatos gépen egy csomópontot jelenít meg.
  • Sub-NUMA Clustering (Intel) vagy Nodes Per Socket (AMD): engedélyezze a magas magszámú processzorokon, ha finomabb lokalitást szeretne. Az újraindítás után lscpu az újraindítás után.
  • vm.zone_reclaim_mode: a legtöbb termelési szerveren állítsa 0-ra. A nullától eltérő érték agresszíven visszanyeri a helyi memóriát a távoli allokáció helyett, ami hasznos oldalkészletet távolíthat el.
  • kernel.numa_balancing: hagyja bekapcsolva általános célú terhelések esetén, kapcsolja ki, ha manuálisan rögzít. Az automatikus kiegyensúlyozó a szabályzattal ütköző módon fogja áttelepíteni az oldalakat és a szálakat.

Ha NUMA-hangolást futtat bare metal rendszeren, ahol Ön irányítja a BIOS-t, a kernel paramétereit és az IRQ-affinitást, akkor a fenti beállításokat a hipervisor absztrakciók megkerülése nélkül alkalmazhatja. Ez a fő oka annak, hogy ez a fajta munka dedikált hardveren könnyebb, mint a felhőalapú virtuális gépeken.

Teljes root hozzáféréssel rendelkező, több processzoros dedikált szerverek esetén tekintse meg az FDC dedikált szervereit.

Blog

Kiemelt ezen a héten

További cikkek
Beállított profilok a Linux-szerverek munkaterhelésének optimalizálásához

Beállított profilok a Linux-szerverek munkaterhelésének optimalizálásához

Hogyan válasszon, alkalmazzon és szabjon testre hangolt profilokat GPU-, adatbázis- és nagy sávszélességű Linux-kiszolgálókhoz, példákkal és Ansible telepítési tippekkel.

16 perc olvasás - 2026. június 9.

Linux OOM Killer Tuning for VPS: Egy gyakorlati útmutató

12 perc olvasás - 2026. június 8.

További cikkek
background image

Kérdése van, vagy egyedi megoldásra van szüksége?

icon

Rugalmas lehetőségek

icon

Globális elérés

icon

Azonnali telepítés

icon

Rugalmas lehetőségek

icon

Globális elérés

icon

Azonnali telepítés