NUMAアーキテクチャを理解する方法
マルチコアやマルチCPUのセットアップについて話すと、サーバーオタクの深淵に踏み込むような気分になることもありますが、正直なところ、ハイエンドワークステーションをいじったり、スレッド数の多いアプリから最大限のパフォーマンスを引き出そうとしている人にも関係のある話です。CPUを積み重ねたり、高価なマルチソケットマザーボードにアップグレードしたりすると、特にメモリパフォーマンスに関して、奇妙な状況に陥ることがあります。システムが思ったほど速く動作しなかったり、CPUにコアが山積みになっているにもかかわらず、タスクが予想よりも長くかかったりするかもしれません。実は、ここでの隠れた原因の一つは、メモリレイテンシとNUMA(Non-Uniform Memory Access)です。NUMAとは、CPUに対するRAMの位置によって、「すべてのRAMが同じように高速ではない」という意味です。
マルチCPU構成で動作が重いと感じたら、OSのメモリ処理方法を詳しく調べてみる価値があります。NUMAの基本的な考え方は、OSがデータを必要とするCPUに近い場所にデータを割り当てるようにすることです。これにより、コアが遠く離れた場所に保存されたデータを待つ必要がなくなり、パフォーマンスを大幅に低下させる可能性があります。しかし、システムが正しく構成されていない場合、あるいはメモリが最適化されていない場合、意図せず全体の速度を低下させてしまう可能性があります。少し奇妙に思えるかもしれませんが、構成によっては、CPUコアを追加するよりもNUMAの方が大きな違いを生むことがあります。だからこそ、NUMAを理解し、調整することが実際に重要になるのです。
NUMA のメモリレイテンシ問題を修正または改善する方法
BIOS設定を確認する – NUMAが有効になっていることを確認する
当たり前のことのように思えるかもしれませんが、まずはマザーボードのBIOSまたはUEFIファームウェアを確認してください。マザーボードによってはNUMAまたはメモリインターリーブを切り替えるオプションが搭載されている場合もありますが、これらはデフォルトで無効になっているか、「自動」に設定されていることがよくあります。 – システムを再起動し、BIOSに入ります(通常は起動中にDelまたは を押しますF2)。 – 「詳細」 > 「CPU構成」などの設定項目を探します。 – NUMA、メモリインターリーブ、または「メモリモード」というラベルの付いたオプションを探します。NUMAが有効になっているか、可能な場合は「自動」に設定されていることを確認します。 – 設定を保存して再起動します。この手順により、OSはマルチソケットシステムを認識し、それに応じてメモリを管理できるようになります。一部のマザーボードでは、NUMAを明示的に有効にしないと、メモリがフラットで均一なプールとして扱われ、パフォーマンス上のメリットが損なわれる可能性があります。
Windows または Linux ツールを実行して NUMA トポロジを確認する
起動後、OSがシステムを意図したとおりに認識しているかどうかを確認することをお勧めします。 – Windowsでは、「タスクマネージャー」 > 「パフォーマンス」タブ> 「メモリ」を使用します。複数のNUMAノード(通常はCPUソケットごとに1つ)が表示されます。 – 詳細については、Hyper-Vセットアップの場合と同様にNode.js、またはPowerShellコマンドを実行してください。 – Linuxでは、を実行してシステムが認識するNUMAノードの数を確認します。これは、OSがCPUとローカルメモリの両方を正しく認識しているかどうかを診断するのに役立ちます。目標は、OSがメモリレイアウトを明確に認識していることを確認することです。そうでない場合は、チューニングやBIOSの修正が必要になる可能性があります。Get-VMHost | Select-Object NumNodesnumactl --hardware
オペレーティング システムの設定またはコマンドを使用してメモリの局所性を最適化する
Linuxでは、などのツールを使用してメモリ割り当てに影響を与えることができますnumactl。たとえば、プロセスまたはメモリを特定のNUMAノードに明示的にバインドすると、レイテンシを軽減できます。
numactl --membind=0 myprogram
これにより、プロセスとそのメモリはNUMAノード0(例えばソケット0)に強制的に配置されます。Windowsでは、タスクマネージャーやサードパーティ製ツールを使ってアフィニティや適切なプロセス配置を設定することで改善する場合があります。場合によっては、BIOS変更後に再起動するだけで競合が解消され、OSがメモリを適切に割り当てられるようになります。
RAMの構成と物理レイアウトを確認する
RAMモジュールが均等に配置されていなかったり、どのモジュールがどのCPUソケットに属しているかが不明瞭だったりすると、パフォーマンスが低下します。マルチソケット構成の場合、マザーボードのマニュアルに従って、ソケットごとにRAMをペアで取り付けるのが最適です。RAMの不均等な配置やバランスの悪さは、システムが特定のワークロードに最適ではないインターリーブモードをデフォルトに設定する原因となります。
また、高性能コンピューティングや特殊なレンダリングといった高負荷のワークロードは、NUMAとメモリレイテンシの影響をより強く受けることにもご注意ください。普段使いやゲーマーであれば、それほど大きな違いはないでしょうが、パワーユーザーの場合は、これらの設定を微調整することで、パフォーマンスや安定性をさらに向上できる場合があります。
まとめ
- BIOS/UEFI をチェックして、NUMA またはメモリインターリーブが有効になっていることを確認します。
- システム情報ツールを使用して、OS が複数の NUMA ノードを認識していることを確認します。
- NUMA 対応のコマンドまたは設定を使用して、プロセスとメモリの配置を改善します。
- マザーボードのガイダンスに基づいて、ソケット間で RAM モジュールのバランスをとります。
- 最適化されていない NUMA セットアップでは、モンスター CPU であっても予期しない速度低下が発生する可能性があることに注意してください。
まとめ
NUMAとメモリレイテンシの問題への対処は、まさにプラグアンドプレイとは言い難いものですが、少し調べて適切な設定をするだけで、特にコア数の多いサーバーやワークステーションでは、目に見える違いが生まれます。重要なのは、システムのファームウェアとOSがメモリ処理方法について同じ認識を持っていることです。セットアップによっては、BIOSスイッチを切り替えたり、簡単なコマンドを実行したりするだけですが、場合によっては、RAMのバランスを調整し、ワークロードをより深く理解することが重要です。すべてがうまくいけば、以前は遅く感じていたワークロードが、突然、はるかにスムーズに動作するようになるかもしれません。この情報が、影に潜んでいたことに気づいていなかったパフォーマンスのボトルネックを解消するのに役立つことを願っています。