本文へスキップ

非一様メモリアクセス(NUMA)とは何でしょうか?

非一様メモリアクセス(NUMA)

非一様メモリアクセス(NUMA)は、マルチプロセッサシステムで使用されるコンピュータメモリ設計であり、メモリアクセス時間はプロセッサに対するメモリ位置によって異なります。NUMAアーキテクチャでは、各プロセッサは独自のローカルメモリを有します。他のプロセッサに接続されたメモリにもアクセス可能ですが、そのアクセスは相互接続や他のプロセッサを経由する必要があるため速度が低下し、追加のレイテンシや帯域幅の競合が生じます。

NUMAは、従来型の対称型マルチプロセッシング(SMP)システムにおけるスケーラビリティの限界に対処するために開発されました。SMPシステムでは、すべてのプロセッサが単一のメモリプールを共有します。NUMAは、各プロセッサに近い位置にメモリをグループ化することで、特に多数の中央処理装置(CPU)やコアを備えたシステムにおいて、メモリアクセス効率と全体的なパフォーマンスを向上させます。

NUMA向けに最適化された現代のオペレーティングシステムやアプリケーションは、データを演算を実行するプロセッサのローカル領域に配置する形でメモリを割り当てることが可能です。これによりレイテンシを最小限に抑え、スループットを向上させます。NUMAは、膨大なメモリと演算リソースを必要とするサーバー、高性能コンピューティング(HPC)システム、およびエンタープライズワークロードにおいて広く採用されています。

NUMAはどのように機能するのでしょうか?

NUMAシステムでは、アーキテクチャは複数のノードに分割されています。各ノードには、1つ以上のプロセッサ(またはCPUソケット)と専用のメモリが含まれます。これらのノードは相互接続されており、プロセッサがローカルメモリとリモートメモリの両方にアクセスできるようにしています。

ローカルメモリ(物理的に同一ノードに接続されたメモリ)へのアクセスは高速で、レイテンシも低くなります。プロセッサがリモートメモリ(異なるノード上に存在するメモリ)にアクセスする場合、ノード間の相互接続経路による追加のレイテンシが発生します。このレイテンシの差こそが、NUMAの「非一様性」を定義する要素です。

現代のNUMAシステムは、システムファームウェア、オペレーティングシステム、およびアプリケーションがNUMAを意識していることに依存しています。NUMAを意識したソフトウェアは、タスクとそのメモリを同じノード上で近くに配置するよう、メモリの割り当てやプロセスのスケジューリングを試みます。これにより、ノード間のメモリトラフィックが削減され、パフォーマンスが最適化されます。

NUMAは通常、サーバーや高性能コンピューティングプラットフォームなど、2つ以上のCPUソケットを備えたシステムに実装されます。各ソケットには専用のメモリコントローラーとローカルDRAM(ダイナミックランダムアクセスメモリ)が搭載されており、Intel®Ultra Interconnect(UPI)AMD Fabricなどのシステム間接続技術によってソケットが相互接続され、必要に応じてリモートメモリへのアクセスが可能となります。

NUMAとシステムアーキテクチャ設計

現代化されたデータセンターや 企業インフラにおいてマルチソケットシステムが普及するにつれ、NUMAがシステムアーキテクチャに及ぼす影響を理解することが極めて重要です。ハードウェアベンダーはサーバーマザーボードやCPU相互接続をNUMAトポロジーを考慮して設計し、プロセッサとメモリバンク間の最適なデータパスを確保しています。これはアプリケーションのパフォーマンスに直接影響を与え、特に複数のコアやソケットに水平方向にスケールするワークロードにおいて顕著です。

設計上の考慮事項には、メモリ配置ルール、BIOSレベルのNUMA構成設定、およびコンポーネントの物理レイアウトも含まれます。システムアーキテクトは、アプリケーションがメモリおよび演算リソースとどのように相互作用するかを考慮し、ハードウェアの能力が十分に活用されるようにする必要があります。最適化が不十分なハードウェア構成は、過剰なリモートメモリアクセスやレイテンシの増加など、非効率的なNUMA動作を引き起こす可能性があります。

NUMAシステム向けソフトウェア最適化

NUMAがその性能を最大限に発揮するためには、ソフトウェアが基盤となるメモリトポロジーを認識するよう設計されるか、少なくとも設定される必要があります。LinuxやWindows Serverなどのオペレーティングシステムは、カーネルレベルでのNUMAサポートを備えており、プロセッサアフィニティ、メモリバインディング、NUMA対応スケジューリングなどの機能を実現します。これらの仕組みにより、スレッドが頻繁に使用するメモリ領域へのアクセスが高速なCPU上でスケジューリングされることが保証されます。

アプリケーション開発者やシステム管理者は、NUMA固有のAPIやチューニング手法を活用することで、さらにパフォーマンスを向上させることが可能です。OpenMPやMPIなどの並列プログラミングフレームワークは、スレッド配置やメモリの局所性を制御する手段を提供します。企業向けワークロードやHPCワークロードにおいては、このレベルの最適化により、特に大容量メモリを搭載したマルチソケットシステム上で動作する場合、メモリレイテンシを大幅に低減し、スループットを向上させることが可能です。

NUMAのユースケースと利点

NUMAは、高い並列性と大規模なメモリ使用量を必要とするワークロードにおいて、パフォーマンス上の利点を提供します。ノード間メモリアクセスを削減し、利用可能な帯域幅をより効果的に活用することで、NUMAはスケーラビリティを向上させ、マルチソケットアーキテクチャにおけるボトルネックの解消に貢献します。

高性能コンピューティング (HPC)

高性能コンピューティングにおいては、科学シミュレーション、モデリング、および大規模データ分析のワークロードは、複数のCPUソケット間におけるメモリアクセス遅延を低減することで、NUMAの恩恵を受けます。

仮想化プラットフォーム

ハイパーバイザーと仮想マシンは、NUMA対応スケジューリングを利用するよう最適化することが可能です。これにより、仮想CPUとそのメモリが同一の物理ノード上に配置されることが保証されます。

インメモリデータベース

NUMAは、大量のデータを直接RAMに保存するデータベースシステムにおいて、低遅延のメモリアクセスを維持するのに役立ちます。

大規模エンタープライズアプリケーション

NUMAは、複数のコアにまたがる大規模なメモリ空間へのアクセスを必要とする、企業向けソフトウェア(例:基幹業務システム(ERP)など)の応答性とスループットを向上させます。

よくあるご質問

  1. NUMAクラスタリングとは何ですか?
    NUMAクラスタリングとは、NUMA対応システム内においてプロセッサとメモリをノードまたはクラスタに組織化する手法を指します。各クラスタは独自のローカルメモリを有し、同一クラスタ内のプロセッサはそのメモリに低遅延でアクセスできます。この構成により共有メモリリソースへの競合が軽減され、パフォーマンスとスケーラビリティが向上します。
  2. NUMAトポロジーとは何でしょうか?
    NUMAトポロジーとは、システム内でCPU、メモリ、および相互接続が物理的・論理的にどのように配置されているかを記述するものです。どのプロセッサがどのメモリ領域に接続されているか、またノード間でアクセスがどのように行われるかを定義します。システムのトポロジーを理解することは、メモリ割り当てとアプリケーションのパフォーマンスを最適化するのに役立ちます。
  3. NUMAは仮想化において重要でしょうか?
    はい、NUMAは仮想マシンに対して最適なメモリとCPUの配置を確保する上で重要な役割を果たします。ハイパーバイザーがNUMAを意識している場合、仮想CPUとその関連メモリを同じ物理ノード内に保持することができ、これによりレイテンシを低減し、パフォーマンスの低下を回避できます。
  4. システム上でNUMAを有効にするにはどうすればよいですか?
    NUMAサポートは、現代のサーバープラットフォームでは通常デフォルトで有効になっています。場合によっては、システムBIOSまたはUEFI設定で有効化する必要があるかもしれません。有効化されると、システムは最適化されたスケジューリングとメモリ割り当てのために、NUMAトポロジーをオペレーティングシステムに公開します。
  5. ソフトウェアがNUMAに対応していない場合、どのような問題が発生しますか?
    ソフトウェアがNUMAに対応していない場合、ノード間でメモリに非効率的にアクセスする可能性があり、その結果、レイテンシの増加やパフォーマンスの低下を招きます。これは、特に高負荷環境下において、大規模なメモリプールを持つマルチソケットシステムにおいてボトルネックとなる可能性があります。