numactl - NUMA CPU・メモリバインディング チートシート
numactl は **NUMA(Non-Uniform Memory Access)**ポリシーをプロセスで制御。マルチソケットサーバーでは、1 つ CPU ソケット(ノード)に接続メモリはそのソケットからアクセスが高速で、別ノードのメモリはスロー。ノード間ジャンプするプロセスはレイテンシー罰を払う。numactl は プロセスを特定 NUMA ノードにバインド — CPU とメモリを同ノードにピンして — データベース・HPC ジョブのようなメモリバウンドワークロードのパフォーマンスを大幅向上可能。
インストール
| プラットフォーム | コマンド |
|---|
| Debian/Ubuntu | sudo apt install numactl |
| Fedora/RHEL | sudo dnf install numactl |
| Arch Linux | sudo pacman -S numactl |
| 確認 | numactl --version |
トポロジー検査
| コマンド | 表示内容 |
|---|
numactl --hardware(-H) | NUMA ノード、ノード毎 CPU・メモリ・距離 |
numactl --show(-s) | 現在プロセスの NUMA ポリシー |
numastat | ノード毎メモリ割り当てヒット/ミス統計 |
lscpu | CPU-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 | ノード毎割り当て効率監視 |
taskset | CPU アフィニティ(NUMA メモリポリシーなし) |
cpupower | CPU 周波数/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 はメモリをリモートノードから提供中 — バインディングが正確に修正するもの。
リソース