Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

NUMA(ニューマ)とは | 意味や読み方など丁寧でわかりやすい用語解説

NUMA(ニューマ)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

ノーマ (ノーマ)

英語表記

NUMA (ニューマ)

用語解説

NUMAとは、Non-Uniform Memory Access(不均一メモリアクセス)の略称であり、複数のプロセッサ(CPU)を搭載したコンピュータシステムにおけるメモリ管理アーキテクチャの一つである。従来のシステムでは、すべてのプロセッサが同じ速度でメインメモリにアクセスできるSymmetric Multi-Processing(SMP)が一般的であったが、プロセッサ数やコア数の増加に伴い、メモリへのアクセス集中が性能ボトルネックとなる問題が顕在化した。NUMAは、この問題に対処するために考案された技術であり、システム全体の処理能力、特に大規模なサーバシステムにおいてスケーラビリティを向上させることを目的としている。

NUMAアーキテクチャの基本的な考え方は、各プロセッサ、またはプロセッサグループが、それぞれに物理メモリの一部を「ローカルメモリ」として持つ点にある。これにより、プロセッサが自身のローカルメモリにアクセスする際には高速な処理が可能となる。しかし、他のプロセッサのローカルメモリ、すなわち「リモートメモリ」にアクセスする場合には、インターコネクトと呼ばれる専用の高速なバスを経由する必要があるため、ローカルメモリへのアクセスよりも若干の遅延が発生する。このアクセス速度の不均一性から「不均一メモリアクセス」という名称が付けられている。

この設計の最大の利点は、メモリへのアクセス競合を緩和し、システムのスケーラビリティを向上させることにある。各プロセッサが自身のメモリ空間を持つことで、共有メモリへのアクセス帯域幅の競合が減少し、より多くのプロセッサやメモリを効率的に利用できる。特に、データベースサーバや仮想化基盤、ハイパフォーマンスコンピューティング(HPC)など、大量のメモリと高い並列処理能力を必要とするシステムにおいて、NUMAは性能最適化に不可欠な要素となっている。一方で、プログラマやシステム管理者は、このメモリ特性を理解し、アプリケーションやOSの設定を最適化する必要があるため、システム構成やチューニングが複雑になるという側面も持つ。

詳細に説明すると、従来のSMPシステムでは、すべてのCPUが単一の共有メモリに接続され、メモリコントローラを介して均等にアクセスするユニフォームメモリアクセス(UMA)モデルを採用していた。このモデルは、CPUの数が少ない場合にはシンプルで効率的だったが、CPUの数が増え、各CPUの処理能力が向上するにつれて、メモリコントローラやメモリバスがボトルネックとなり、性能向上が頭打ちになるという「メモリウォール」問題に直面するようになった。さらに、各CPUが持つキャッシュメモリの一貫性(キャッシュコヒーレンシ)を保つためのコストも増大し、これもスケーラビリティの限界を早める要因となっていた。

NUMAアーキテクチャは、このSMPの限界を克服するために登場した。NUMAシステムは、複数の「NUMAノード」で構成される。各NUMAノードは、1つまたは複数のCPU(コア)と、それに直接接続された(ローカルな)メモリ、そしてノード間の通信を担うインターコネクトコントローラから成る。例えば、IntelのXeonプロセッサでは、各CPUがメモリコントローラを内蔵し、自身に接続されたDRAMモジュールをローカルメモリとして管理する。ノード間は、IntelであればQPI(QuickPath Interconnect)やUPI(Ultra Path Interconnect)のような高速なバスで接続されており、他のノードのメモリにもアクセスできるが、当然ながらレイテンシは大きくなる。

OSはNUMAアーキテクチャを認識し、プロセスやスレッドのスケジューリング、メモリ割り当てを行う際に、この不均一なメモリアクセス特性を考慮するように設計されている。これをNUMAアウェアネスと呼ぶ。具体的には、あるプロセスやスレッドが利用するメモリ領域を、そのプロセス/スレッドが動作するCPUと同じNUMAノード内のメモリに割り当てる「ファーストタッチポリシー」などの最適化が行われることが多い。これにより、リモートメモリへのアクセスを最小限に抑え、パフォーマンスを最大化しようとする。OSは、システムのNUMAトポロジを把握し、タスクの実行とメモリの配置を最適化するためのカーネル機能を提供する。

アプリケーション開発者もNUMAを意識したプログラミングを行うことで、より高い性能を引き出すことが可能になる。例えば、大規模なデータ構造を扱うアプリケーションでは、データを物理的にCPUに近いメモリノードに配置したり、特定のスレッドを特定のCPU(およびそのCPUが属するNUMAノード)に固定する「CPUアフィニティ」を設定したりすることで、リモートメモリへのアクセス頻度を減らし、キャッシュ効率を向上させることができる。データベースシステムでは、各データベースインスタンスやバッファプールを特定のNUMAノードに割り当てることで、メモリの局所性を高め、トランザクション処理性能を向上させるケースが見られる。

しかし、NUMAの特性を十分に活用するためには、システム管理者やアプリケーション開発者に一定の知識とノウハウが求められる。不適切なメモリ割り当てやスレッド配置は、かえって性能を低下させる原因にもなりうるからだ。例えば、すべてのデータが単一のNUMAノードに集中したり、複数のNUMAノードに分散されたデータに頻繁にアクセスする処理が多い場合、かえってボトルネックとなる可能性もある。そのため、性能監視ツールを用いてNUMAノード間のアクセス状況を詳細に分析し、システムやアプリケーションの構成を適切にチューニングすることが重要となる。近年では、多くのミドルウェアや仮想化ソフトウェアがNUMAアウェアネスを内蔵しており、自動的に最適化を図る機能を提供しているが、その内部動作を理解することは、より高度な性能要件に応える上で不可欠である。NUMAは、大規模で高性能なシステムを構築・運用する上で避けて通れない重要な概念であり、システムエンジニアを目指す者にとって、その理解は現代のサーバアーキテクチャを深く理解するための第一歩となる。

関連コンテンツ