NUMA Awareness a CPU Pinning pro dedikované servery
16 min čtení - 16. června 2026

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:
lscpupro rychlý přehled soketů a uzlů.numactl --hardwarepro souhrn paměti uzlů a matici vzdáleností mezi uzly.numastatpro 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ástroj | Ovládací prvky | Použití |
|---|---|---|
taskset | Pouze jádra CPU | Rychlé jednorázové přiřazení existujícího procesu |
numactl | Jádra procesoru a paměť | Spouštění pracovních úloh s přísnou lokalitou |
| systemd | Já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 --hardwarePoté spusťte aplikaci vázanou na tento uzel jak pro jádra, tak pro paměť:
numactl --cpunodebind=0 --membind=0 ./your_applicationU 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=0Znovu 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=0Př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ásada | Proč |
|---|---|---|
| Databáze (PostgreSQL, MySQL, SQL Server) | --cpunodebind + --membind | Velké sdílené vyrovnávací paměti, cesty dotazů citlivé na latenci |
| Cache v paměti (Redis, Memcached) | Vázání na jeden uzel | Vše je přístup k RAM, vzdálená latence se projeví okamžitě |
| Trénování a inferenční výpočty AI/ML | Vázání na uzel NUMA GPU | Zabraňuje přenosům tenzorů přes PCIe kořeny |
| Analytika (Spark, Elasticsearch) | --interleave=all | Velká pracovní sada vyžaduje šířku pásma napříč všemi uzly |
| API citlivé na latenci, obchodování | Přísná afinita pinů + IRQ | Př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 IRQ | Zajišť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 --hardwareV 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
lscpupo 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.

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

Máte dotazy nebo potřebujete vlastní řešení?
Flexibilní možnosti
Globální dosah
Okamžité nasazení
Flexibilní možnosti
Globální dosah
Okamžité nasazení