NUMA最適化
このページは、2026-06-05の勉強会でチームが共有したNUMA最適化の基礎をまとめたものです。 担当: 渡邉。
これは何か
NUMA(Non-Uniform Memory Access)は、マルチプロセッサ・システムにおけるメモリ配置のアーキテクチャです。
各プロセッサが個別のローカルメモリを持ち、それに直接アクセスします。
| 方式 | 特徴 |
|---|---|
| UMA(Uniform Memory Access) | 全プロセッサが共通のメモリに同じ距離でアクセス |
| NUMA | プロセッサごとにローカルメモリがあり、アクセス距離が異なる |
なぜ重要か
- 近いメモリ(ローカル)にアクセスすれば速い。別ノードのメモリ(リモート)にアクセスすると遅い。
- そのため、ローカルメモリを有効に使えるようにスレッドを配置することが重要です。
- 配置を誤ると、リモートメモリアクセスが増えて遅くなります。
基本概念
ローカルメモリ・リモートメモリ
スレッドが使うメモリを、できるだけそのスレッドが動くプロセッサのローカル側に置くのが理想です。 同じメモリにアクセスするスレッドは、同じノードにまとめます。
プロセッサ・アフィニティ
特定のプロセッサ・コアへのスレッド/プロセスの割り当てを保持し続けることです。
- スレッドが使うメモリをローカルに保てる。
- ただし、OSの効率的なリソース管理を妨げる可能性があるため、慎重に設定します。
numactlコマンドで、NUMAポリシーを制御し、特定ノードでプロセスを動かせます。
ファーストタッチポリシー
OSが、そのメモリ領域に最初にアクセスしたプロセスにメモリを紐付ける仕組みです。
- NUMAを有効に使うには、初期化スレッドと実行スレッドを一致させる必要があります。
- つまり、データを使う実行スレッド自身に初期化させると、ローカルメモリに割り当たります。
大会との関係
- 2025年大会のルールでは「System-level tuning: NUMA topology optimization」が許可項目として挙げられていました(昨年のルール。今年は要確認)。
- マルチソケット/マルチNUMAノード環境では、CPU pinningとファーストタッチでメモリ局所性を上げられます。
最初に見るべき指標・設定
| 観点 | 見るもの | なぜ重要か |
|---|---|---|
| メモリ局所性 | ローカル/リモートアクセス比率 | リモートアクセスが多いと遅い |
| スレッド配置 | numactl、CPU affinity設定 | スレッドとメモリの距離を縮める |
| 初期化 | 初期化スレッドと実行スレッドの一致 | ファーストタッチで局所配置になるか |
注意点
- アフィニティ固定はOSのスケジューリングと衝突することがあるため、効果を測りながら設定します。
- NUMA最適化は環境構造(ソケット数・NUMAノード数)に強く依存します。