NUMA-tudatosság és CPU-pinning dedikált szerverek esetében
16 perc olvasás - 2026. június 16.

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:
lscpua socketek és csomópontok gyors áttekintéséhez.numactl --hardwarea csomópontok memóriájának összegeihez és a csomópontok közötti távolságmátrixhoz.numastata 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öz | Vezérlők | Használata |
|---|---|---|
taskset | Csak CPU-magok | Meglévő folyamat gyors, egyszeri összekapcsolása |
numactl | CPU-magok és memória | Szigorú lokalitású munkaterhelések indítása |
| systemd | CPU-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 --hardwareEzutá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_applicationMá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=0Tö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=0Adja 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és | Irányelv | Miért |
|---|---|---|
| Adatbázisok (PostgreSQL, MySQL, SQL Server) | --cpunodebind + --membind | Nagy 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és | Minden RAM-hozzáférés, a távoli késleltetés azonnal megjelenik |
| AI/ML képzés és következtetés | Kapcsolódás a GPU NUMA csomópontjához | Elkerüli a tenzorok PCIe-gyökerek közötti átvitelét |
| Analitika (Spark, Elasticsearch) | --interleave=all | A nagy munkakészlethez sávszélességre van szükség az összes csomóponton |
| Késleltetésérzékeny API-k, kereskedés | Szigorú pin + IRQ affinitás | A 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ára | Az 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 --hardwareEbben 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
lscpuaz ú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.

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.

Kérdése van, vagy egyedi megoldásra van szüksége?
Rugalmas lehetőségek
Globális elérés
Azonnali telepítés
Rugalmas lehetőségek
Globális elérés
Azonnali telepítés