Non-Uniform Memory Access について

MicrosoftSQL Server は Non-Uniform Memory Access (NUMA) に対応しているので、特殊な構成を行わなくても NUMA ハードウェアで適切に実行されます。プロセッサのクロック速度や数が増加するにつれて処理能力が向上しますが、その一方で、向上した能力の活用に必要となるメモリの待機時間を減らすことが困難になります。ハードウェア ベンダはメモリの待機時間をなくすために、大容量の L3 キャッシュを搭載していますが、この解決策にも限界があります。この問題に対する、拡張性に優れた解決方法が NUMA アーキテクチャです。SQL Server は、アプリケーションを変更しなくても NUMA ベースのコンピュータを活用できるように設計されています。

NUMA の概念

最近のハードウェア面の傾向として、それぞれがプロセッサの小さなセットとして機能するシステム バスが複数搭載されるようになりました。プロセッサの各グループには専用のメモリが搭載されており、場合によっては専用の I/O チャネルが搭載されている場合もあります。ただし、各 CPU は他のグループに関連付けられているメモリには、一貫した方法でアクセスできます。この CPU の各グループのことを NUMA ノードと呼びます。NUMA ノード内の CPU 数は、ハードウェア ベンダにより異なります。ノードのローカル メモリにアクセスする方が、他の NUMA ノードに属するメモリにアクセスするよりも高速です。このようにアクセス速度が一定ではないことから、NUMA (non-uniform memory access : 非均質メモリ アクセス) アーキテクチャと呼ばれています。

NUMA ハードウェアでは、メモリの一部の領域が他の領域とは物理的に異なるバス上にあります。NUMA はローカル メモリと外部メモリを使用するため、メモリの一部の領域にアクセスするには、他の領域にアクセスするより時間がかかります。通常、ローカル メモリと外部メモリは、現在実行中のスレッドを基準に使い分けます。ローカル メモリは、現在スレッドを実行している CPU と同じノードにあるメモリです。現在スレッドを実行しているノードに属していないメモリは、外部メモリです。外部メモリは、リモート メモリとも呼ばれます。ローカル メモリへのアクセス速度に対する外部メモリへのアクセス速度の比率を、NUMA 比と呼びます。NUMA 比が 1 の場合は SMP (対称型マルチプロセッシング) です。この比率が大きいほど、他のノードのメモリにアクセスする速度が遅くなります。NUMA 対応ではない Windows アプリケーション (SQL Server 2000 SP3 以前を含む) は、NUMA ハードウェアで実行するとパフォーマンスが低下する場合があります。

NUMA の主な利点はスケーラビリティです。NUMA アーキテクチャは、SMP アーキテクチャのスケーラビリティの限界を解消するために設計されました。SMP では、すべてのメモリ アクセスが同じ共有メモリ バスにポストされます。これは CPU の数が比較的少ない場合は十分に機能しますが、数十または数百の CPU が共有メモリ バスにアクセスすることを競っている場合には機能しません。NUMA では、いずれかのメモリ バスで CPU の数を制限し、高速相互接続を使用してさまざまなノードを接続することによって、これらのボトルネックを改善します。

4 基のプロセッサで構成される NUMA ノード

ハードウェア NUMA とソフト NUMA

NUMA は、専用のハードウェアにより (ハードウェア NUMA)、または SQL Server のメモリを構成することで (ソフト NUMA)、CPU とメモリを対応させることができます。起動時に、SQL Server は、動作しているオペレーティング システムおよびハードウェア構成またはソフト NUMA の設定に基づいて、自分自身を構成します。ハードウェア NUMA でもソフト NUMA でも、NUMA 構成で SQL Server が起動するときには、SQL Server のログに、ノードごとのマルチモード構成メッセージが CPU マスクと共に記録されます。

ハードウェア NUMA

ハードウェア NUMA を使用するコンピュータには、それぞれがプロセッサの小さなセットとして機能する複数のシステム バスがあります。プロセッサの各グループには専用のメモリが搭載されており、場合によっては専用の I/O チャネルを備えています。ただし、各 CPU は、他のグループに関連付けられているメモリに、一貫した方法でアクセスできます。この CPU の各グループのことを NUMA ノードと呼びます。NUMA ノード内の CPU 数は、ハードウェア ベンダにより異なります。コンピュータがハードウェア NUMA をサポートするかどうかは、ハードウェアの製造元に問い合わせてください。

ハードウェア NUMA を使用する場合は、NUMA ではなくインターリーブされたメモリを使用するように構成できます。その場合、Windows および SQL Server では、この構成が NUMA として認識されません。SQL Server が使用できるメモリ ノードの数を調べるには、次のクエリを実行します。

SELECT DISTINCT memory_node_id
FROM sys.dm_os_memory_clerks

SQL Server が単一のメモリ ノード (ノード 0) だけを返す場合は、ハードウェア NUMA を備えていないか、またはハードウェアがインターリーブ (非 NUMA) として構成されています。ハードウェア NUMA が正しく構成されていないと考えられる場合は、ハードウェアのベンダに連絡して、NUMA を有効にしてください。ハードウェア NUMA の CPU の数が 4 つ以下で、1 つ以上のノードに CPU が 1 つしかない場合、SQL Server は NUMA 構成を無視します。

ソフト NUMA

SQL Server では、CPU をソフト NUMA と呼ばれるノードにグループ化できます。通常は、CPU の数が多く、ハードウェア NUMA を装備していない場合にソフト NUMA を構成しますが、ハードウェア NUMA のノードを小さなグループに分割するためにソフト NUMA を使用することもできます。SQL Server スケジューラと SQL Server ネットワーク インターフェイス (SNI) だけが、ソフト NUMA に対応しています。メモリ ノードは、ハードウェア NUMA に基づいて作成されます。したがって、ソフト NUMA の影響は受けません。たとえば、8 個の CPU を備える SMP コンピュータがあり、それぞれが 2 個の CPU を含む 4 つのソフト NUMA ノードを作成した場合、メモリ ノードは 1 つだけで、このノードが 4 つの NUMA ノードすべてを管理します。ソフト NUMA は、CPU アフィニティにメモリを提供しません。

ソフト NUMA の利点には、CPU の数が多くてハードウェア NUMA を装備しないコンピュータにおける、I/O およびレイジー ライタのボトルネックの抑制があります。各 NUMA ノードには、単一の I/O スレッドと単一のレイジー ライタ スレッドがあります。データベースの使用状況によっては、これらの単一スレッドがパフォーマンスの重大なボトルネックになる可能性があります。4 つのソフト NUMA を構成すると、4 つの I/O スレッドと 4 つのレイジー ライタ スレッドが提供されるため、パフォーマンスが向上します。

異なるハードウェア NUMA ノードの CPU を含むソフト NUMA を作成することはできません。たとえば、ハードウェアが 8 個の CPU (0 ~ 7) を備え、2 つのハードウェア NUMA ノード (0 ~ 3 と 4 ~ 7) がある場合は、CPU (0、1) および CPU (2、3) の組み合わせでソフト NUMA を作成できます。CPU (1、5) を使用してソフト NUMA を作成することはできませんが、CPU アフィニティを使用して、SQL Server のインスタンスを異なる NUMA ノードの CPU に関係付けることはできます。したがって、上記の例では、SQL Server が CPU 0 ~ 3 を使用する場合は、I/O スレッドとレイジー ライタ スレッドは 1 つずつです。一方、上記の例で SQL Server が CPU 1、2、5、6 を使用する場合は、2 つの NUMA ノードにアクセスするようになり、I/O スレッドとレイジー ライタ スレッドはそれぞれ 2 つになります。

注意

一部のハードウェア構成では、L3/L4 キャッシュのような共通リソースを共有します。このような共有リソースを中心にしてプロセッサをグループ化し、ソフト NUMA ノードを作成することができます。

詳細については、「ソフト NUMA を使用するように SQL Server を構成する方法」を参照してください。