NUMA Awareness a CPU Pinning pro dedikované servery

16 min čtení - 16. června 2026

hero section cover
Obsah
  • Povědomí o NUMA a CPU pinning pro dedikované servery
  • Jak funguje NUMA na serverech s více sokety
  • Kontrola topologie NUMA v systému Linux
  • Připojení CPU a zásady paměti
  • Výběr strategie podle pracovní zátěže
  • Nastavení BIOSu a jádra, která je třeba zkontrolovat
Sdílet

Jak zkontrolovat topologii NUMA a přiřadit pracovní zátěže Linuxu ke správným jádrům a paměti. Zahrnuje numactl, taskset, systemd, nastavení BIOSu a strategie specifické pro pracovní zátěže.

Povědomí o NUMA a CPU pinning pro dedikované servery

Na jakémkoli serveru s více sokety jsou dvě různé otázky: kde běží proces a kde se nachází jeho paměť. Jejich nesynchronizace je jedním z nejjednodušších způsobů, jak přijít o výkon. Znalost NUMA a CPU pinning jsou dva nástroje, které tento problém řeší. Tento příspěvek popisuje, jak NUMA funguje, jak ji zkontrolovat v systému Linux a jak správně přiřadit pracovní zátěž pro databáze, trénování AI a služby citlivé na latenci.

Jak funguje NUMA na serverech s více sokety

Uzel NUMA (Non-Uniform Memory Access) je skupina jader CPU svázaných s lokálním blokem RAM prostřednictvím vyhrazeného řadiče paměti. Na serveru se dvěma sokety jsou obvykle dva uzly. Jakékoli jádro může číst libovolnou adresu, ale lokální přístup trvá přibližně 80 ns, zatímco přenos mezi sokety přes Intel UPI nebo AMD Infinity Fabric trvá asi 130–150 ns. Na větších systémech s více sokety může nejhorší případ u uzlu překročit 250 ns.

Šířka pásma se řídí stejným vzorem. Systém Sapphire Rapids se dvěma sokety dokáže udržet rychlost kolem 600 GB/s, když jádra přistupují k lokální paměti, ale propojení mezi sokety je jen zlomkem této hodnoty, takže provoz, který jím prochází, rychle narazí na úzké hrdlo. Procesory s vysokým počtem jader to dělají podrobněji: Intel Sub-NUMA Clustering (SNC) a AMD Nodes Per Socket (NPS) rozdělují každý socket na více domén NUMA, takže „dvouprocesorová“ skříň může Linuxu snadno prezentovat čtyři nebo osm uzlů.

Bez podpory NUMA bude plánovač Linuxu bez problémů migrovat vlákno mezi sokety, zatímco jeho pracovní sada zůstane na původním uzlu. Každý následující přístup se stane vzdáleným. Viditelným příznakem je vysoké využití CPU při nízké skutečné propustnosti, protože jádra tráví čas čekáním na paměť. I/O zařízení to ještě zhoršují. GPU nebo NIC je připojeno ke konkrétnímu kořenu PCIe, který patří k jednomu uzlu NUMA. Pokud proces, který jej napájí, běží na druhém soketu, každý přenos DMA prochází propojovací sítí.

Kontrola topologie NUMA v systému Linux

Čtyři nástroje pokrývají téměř vše, co potřebujete:

  • lscpu pro rychlý přehled soketů a uzlů.
  • numactl --hardware pro souhrn paměti uzlů a matici vzdáleností mezi uzly.
  • numastat pro počítadla hit/miss na proces.
  • lstopo (z hwloc) pro hierarchii cache a lokalitu zařízení PCIe.

Začněte s numactl --hardware. Zobrazí se seznam jednotlivých uzlů, jader a paměti, které k nim patří, a matice vzdáleností. Hodnota 10 znamená lokální, 20+ znamená vzdálený. Pokud vidíte jediný uzel na počítači s více sokety, máte v BIOSu zapnuté prokládání uzlů (Node Interleaving) a skrývá se topologie, nejprve to opravte (viz níže).

Pro konkrétní proces numastat -p <PID> rozebírá, kde je jeho paměť skutečně alokována. Důležité jsou čtyři počítadla:

  • numa_hit: paměť alokovaná na zamýšleném uzlu. Chcete, aby tato hodnota byla vysoká.
  • numa_miss: zamýšlený uzel byl plný, alokace se přesunula jinam.
  • numa_foreign: jiný uzel se pokusil o lokální alokaci, ale neuspěl, což naznačuje tlak na paměť.
  • other_node: stránky alokované na jiném uzlu, než kde běží proces. Vysoké hodnoty zde jsou klasickým znakem špatného pinningu.

U pracovních zatížení GPU nebo NIC spusťte lstopo-no-graphics a podívejte se, ke kterému uzlu NUMA je připojeno každé zařízení PCIe. Pokud jsou jádra řídící zařízení na jiném uzlu, je to první věc, kterou je třeba opravit.

Připojení CPU a zásady paměti

Připojení CPU (nebo CPU affinity) váže proces ke konkrétním jádrům, takže plánovač jej nemůže přesunout. To samo o sobě nestačí, protože Linux ve výchozím nastavení používá zásadu paměti „first-touch“: stránky jsou alokovány na tom uzlu, který do nich jako první zapíše. Pokud se vlákno spustí na nesprávném uzlu předtím, než je připnuto, jeho paměť tam zůstane. Je třeba řídit jak umístění, tak alokaci společně.

Tři nástroje pokrývají běžné případy:

NástrojOvládací prvkyPoužití
tasksetPouze jádra CPURychlé jednorázové přiřazení existujícího procesu
numactlJádra procesoru a paměťSpouštění pracovních úloh s přísnou lokalitou
systemdJádra procesoru a paměť, trvaléSlužby, které vyžadují fixaci napříč restarty

numactl podporuje čtyři zásady paměti:

  • --membind=N: alokovat pouze na uzlu N, selhání v případě zaplnění.
  • --preferred=N: upřednostnit uzel N, v případě potřeby přejít na ostatní.
  • --interleave=all: round-robin napříč uzly pro rovnoměrné rozložení šířky pásma.
  • --localalloc: alokovat na libovolném uzlu, na kterém běží CPU.

Připnutí pracovní zátěže k jednomu uzlu

Nejprve zjistěte, která jádra patří k vašemu cílovému uzlu:

numactl --hardware

Poté spusťte aplikaci vázanou na tento uzel jak pro jádra, tak pro paměť:

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

U již spuštěného procesu upravte afinitu CPU pomocí taskset:

taskset -cp 0-7 <PID>

Aby se nastavení zachovalo i po restartu, nastavte jej v jednotce systemd:

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

Znovu načtěte a restartujte:

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

Při ručním přiřazování vypněte automatické vyvažování jádra, aby nebránilo vašemu umístění:

sysctl -w kernel.numa_balancing=0

Přidejte to do /etc/sysctl.conf , aby se nastavení uložilo. Poté ověřte pomocí numastat -p <PID> během několika minut reálného zatížení. Pokud other_node zůstane blízko nuly, fixace funguje.

Výběr strategie podle pracovní zátěže

Správná politika závisí na tom, zda vašemu pracovnímu zatížení více vyhovuje nízká latence, nebo souhrnná šířka pásma napříč všemi uzly.

Pracovní zátěžZásadaProč
Databáze (PostgreSQL, MySQL, SQL Server)--cpunodebind + --membindVelké sdílené vyrovnávací paměti, cesty dotazů citlivé na latenci
Cache v paměti (Redis, Memcached)Vázání na jeden uzelVše je přístup k RAM, vzdálená latence se projeví okamžitě
Trénování a inferenční výpočty AI/MLVázání na uzel NUMA GPUZabraňuje přenosům tenzorů přes PCIe kořeny
Analytika (Spark, Elasticsearch)--interleave=allVelká pracovní sada vyžaduje šířku pásma napříč všemi uzly
API citlivé na latenci, obchodováníPřísná afinita pinů + IRQPředvídatelnost je důležitější než špičková propustnost
Náročné na síť (RoCEv2, InfiniBand)Pin k NUMA uzlu NIC, vyhrazená jádra pro IRQZajišťuje lokální zpracování přerušení mimo dosah vláken aplikací

Konkrétně pro pracovní zatížení GPU spusťte lstopo , abyste zjistili, na kterém uzlu NUMA se GPU nachází, a poté spusťte proces trénování nebo inferenční proces s numactl --cpunodebind=N --membind=N pro ten samý N. Jedná se o jeden z nejjednodušších způsobů, jak dosáhnout zlepšení na GPU serveru s více sokety, protože výchozí umístění plánovače je často nesprávné.

U HPC a MPI úloh, které pokrývají oba sokety, přiřaďte každý rank k jedinému uzlu pomocí localalloc namísto prokládání všeho. Každý rank získá lokální paměť a paralelismus probíhá na úrovni ranku.

Jedna praktická poznámka: pokud přiřazujete k jedinému uzlu, nechte na něm 2–4 GB volného místa. Uzel běžící téměř na plnou kapacitu spustí uvolňování paměti, což vás stojí latenci, kterou jste se snažili ušetřit.

Nastavení BIOSu a jádra, která je třeba zkontrolovat

Výstup nástroje je přesný pouze do té míry, do jaké to umožňuje topologie firmwaru. Několik nastavení, která je třeba ověřit:

  • Node Interleaving: deaktivujte. Pokud je tato funkce povolena, BIOS prezentuje veškerou paměť jako jeden plochý pool a zcela skrývá NUMA před operačním systémem. numactl --hardware V takovém případě se na zařízení s více sokety zobrazí jeden uzel.
  • Sub-NUMA Clustering (Intel) nebo Nodes Per Socket (AMD): zapněte na procesorech s vysokým počtem jader, pokud chcete jemnější lokalitu. Potvrdí se lscpu po restartu.
  • vm.zone_reclaim_mode: u většiny produkčních serverů nastavte na 0. Hodnota jiná než nula agresivně uvolňuje lokální paměť namísto přidělování na dálku, což může vyhnat užitečnou stránkovou cache.
  • kernel.numa_balancing: nechte zapnuté pro všeobecné pracovní zátěže, vypněte při ručním přiřazování. Automatický vyvažovač bude migrovat stránky a vlákna způsobem, který je v rozporu s vaší politikou.

Pokud provádíte ladění NUMA na fyzickém hardwaru, kde máte kontrolu nad BIOSem, parametry jádra a afinitou IRQ, můžete použít všechny výše uvedené možnosti bez nutnosti obcházet abstrakce hypervizoru. To je hlavní důvod, proč je tento druh práce snazší na dedikovaném hardwaru než ve virtuálních strojích v cloudu.

Pro dedikované servery s více sokety a plným root přístupem viz dedikované servery FDC.

Blog

Tento týden byly představeny

Další články
Vyladěné profily pro optimalizaci pracovní zátěže linuxových serverů

Vyladěné profily pro optimalizaci pracovní zátěže linuxových serverů

Jak vybrat, použít a přizpůsobit vyladěné profily pro GPU, databáze a linuxové servery s velkou šířkou pásma, s příklady a tipy pro nasazení Ansible.

16 min čtení - 9. června 2026

Linux OOM Killer Tuning for VPS: Praktický průvodce

12 min čtení - 8. června 2026

Další články
background image

Máte dotazy nebo potřebujete vlastní řešení?

icon

Flexibilní možnosti

icon

Globální dosah

icon

Okamžité nasazení

icon

Flexibilní možnosti

icon

Globální dosah

icon

Okamžité nasazení