# NUMAメモリ配置 ## 定義 UMA(Uniform Memory Access)は、複数CPUが共有システムバスを介してメモリにアクセスし、すべてのメモリへのアクセスレイテンシが一定になるメインメモリアーキテクチャである。これに対しNUMA(Non-Uniform Memory Access)は、メモリアーキテクチャの一部になったCPUインターコネクトを使い、メインメモリへのアクセス時間がCPUからの相対的な距離によって変わるアーキテクチャである。CPUが自身に直接メモリバスで接続されたDRAMにアクセスするのはローカルメモリ(1ホップ)、他のCPUとCPUインターコネクトを介してアクセスするのはリモートメモリ(2ホップ以上)と呼ばれ、リモートメモリの方がアクセスレイテンシが高い。個々のCPUに接続されているメモリのバンクはメモリノード(ノード)と呼ばれる。OSはプロセッサから得られる情報に基づきメモリノードのトポロジを意識している場合があり、パフォーマンスを上げるためにできる限りローカルメモリを使うメモリの局所性を尊重したメモリの配置とスレッドのスケジューリングを行う。numastat(8)はnuma_hit(適切なノードでのアロケーション成功)、numa_miss/numa_foreign(望ましいノードでできなかったアロケーション)などの統計でNUMA配置の成否を示し、numactl(8)の--membindと--physcpubindでプロセスを特定のNUMAノード・CPUに明示的にバインドできる。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] §7.3.1.2, §7.5.6, §7.6.4) ## 横断的知見 (このセクションは複数ソースの突き合わせで得られる知見を蓄積する。現時点では本概念に触れたソースが1件のため、蓄積を今後の ingest に委ねる。) ## 未解決の問い - kernel.numa_balancing(自動NUMAページバランシング)は、Netflixの旧カーネル(3.13前後)ではCPU消費が過大になるため無効化された(Source: 本章§7.6.1)。numa_balancing_scan_size_mb等のパラメータが追加された現行カーネルでは、この判断はどの程度覆るか。ワークロード別の指針はあるか。 - [[NUMA対応CPUピニング]]で扱われるGPU推論基盤のCPUピニングと、本概念のnumactl --membindによるメモリバインドは、GH200のようなCPU-GPU統合メモリアーキテクチャでどこまで同じ最適化原理が通用するか。 - NUMAノード数が多い(4ノード以上)システムでは、ローカルメモリ優先のスケジューリングとワークロードの負荷分散のどちらを優先すべきトレードオフが生じるか。 ## 関連 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] — 本概念の原典解説(図7-3, 図7-4)。 - [[NUMA対応CPUピニング]] — GPU推論基盤におけるNUMA対応CPUピニングの応用例。 - [[詳解 システム・パフォーマンス 第2版]] — 書籍ハブ。 ## 出典 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] §7.3.1.2, §7.5.6, §7.6.1, §7.6.4