コンテンツにスキップ

numactl - NUMA CPU・メモリバインディング チートシート

numactl - NUMA CPU・メモリバインディング チートシート

numactl は **NUMA(Non-Uniform Memory Access)**ポリシーをプロセスで制御。マルチソケットサーバーでは、1 つ CPU ソケット(ノード)に接続メモリはそのソケットからアクセスが高速で、別ノードのメモリはスロー。ノード間ジャンプするプロセスはレイテンシー罰を払う。numactl は プロセスを特定 NUMA ノードにバインド — CPU とメモリを同ノードにピンして — データベース・HPC ジョブのようなメモリバウンドワークロードのパフォーマンスを大幅向上可能。

インストール

プラットフォームコマンド
Debian/Ubuntusudo apt install numactl
Fedora/RHELsudo dnf install numactl
Arch Linuxsudo pacman -S numactl
確認numactl --version

トポロジー検査

コマンド表示内容
numactl --hardware-HNUMA ノード、ノード毎 CPU・メモリ・距離
numactl --show-s現在プロセスの NUMA ポリシー
numastatノード毎メモリ割り当てヒット/ミス統計
lscpuCPU-to-ノード マップ(NUMA ノード CPU)
# 何個 NUMA ノード・どの CPU/メモリが各ノード属するか確認
numactl --hardware

プロセスバインディング

コマンド効果
numactl --cpunodebind=0 --membind=0 ./appノード 0 の CPU とメモリで実行
numactl -N 1 -m 1 ./app短形式:ノード 1 CPU + メモリ
numactl --physcpubind=0-7 ./app特定 CPU コア にバインド
numactl --membind=0,1 ./appノード 0・1 からのメモリ許可
numactl --interleave=all ./appすべてのノード間でメモリ広がる(ラウンドロビン)

メモリポリシー

ポリシーフラグ意味
Bind--membind=NODESこれらノードからのみ割り当て(満杯で失敗)
Preferred--preferred=NODEノード優先、必要なら代替
Interleave--interleave=NODESノード間ラウンドロビン(帯域幅)
Local--localallocスレッド実行ノードで割り当て

どれを使うか

ゴールポリシー
レイテンシー機密、1 ノード収まる--cpunodebind=N --membind=N(共存)
帯域幅バウンド、大足跡--interleave=all
ほぼ 1 ノード、稀にこぼれ--preferred=N
カーネルをローカルに決めさせ--localalloc

一般的なワークフロー

# データベースをノード 0 に固定してクロスノードメモリレイテンシー回避
numactl --cpunodebind=0 --membind=0 postgres -D /data

# 帯域幅集約分析:メモリをすべてノード間広げ
numactl --interleave=all ./analytics-job

# リアルタイムプロセス用特定コア予約
numactl --physcpubind=8-15 --membind=1 ./rt-app

# 実行セットアップがどのポリシー使うか確認
numactl --show

関連チューニングツール

ツール役割
numactlプロセス毎 NUMA CPU/メモリポリシー設定
numastatノード毎割り当て効率監視
tasksetCPU アフィニティ(NUMA メモリポリシーなし)
cpupowerCPU 周波数/governor チューニング
kernel numa_balancing自動 NUMA バランシング(/proc/sys/kernel

numactl と cpupower ペア使用。numastat でバインディングが実際にクロスノードミスを低減したか確認。

勝利検証

# Before/after:バインディング後に numa_miss / numa_foreign が低下するか監視
numastat -p $(pgrep -n app)

高い numa_miss / numa_foreign はメモリをリモートノードから提供中 — バインディングが正確に修正するもの。

リソース