ソフト NUMA を使用するように SQL Server を構成する方法

NUMA (Non-Uniform Memory Access) は自動的に検出されて使用されます。大規模な SMB コンピューターの NUMA をシミュレートする場合、または局所性の向上のために NUMA コンピューターを分割する場合、ソフトウェア NUMA (ソフト NUMA) を使用できます。ソフト NUMA を使用するように SQL Server を構成するには、レジストリを編集して、ノード構成 affinity mask を追加する必要があります。ソフト NUMA マスクは、バイナリまたは DWORD (16 進数または 10 進数) レジストリ エントリとして記述できます。最初の 32 個より多くの CPU を構成するには BINARY レジストリ値を使用します。ソフト NUMA を構成するには、データベース エンジンを再起動する必要があります。ソフトウェア NUMA を構成する前に、「Non-Uniform Memory Access について」と「SQL Server での NUMA のサポート状況」を参照してください。

ヒントヒント

CPU には 0 から始まる連番が付けられます。

レジストリを誤って編集すると、システムに重大な障害が発生する場合があります。レジストリを変更する前に、コンピューター上のすべての重要なデータをバックアップしてください。

次の例を考えてみましょう。この 8 個の CPU が搭載されたコンピューターには、ハードウェア NUMA がありません。3 つのソフト NUMA ノードが構成されています。データベース エンジン インスタンス A は、CPU 0 から 3 を使用するように構成されています。データベース エンジンの 2 つ目のインスタンスがインストールされており、CPU 4 から 7 を使用するように構成されています。この例は、次のように視覚的に表されます。

CPUs          0  1  2  3  4  5  6  7

Soft-NUMA   <-N0--><-N1-><----N2---->

SQL Server  <instance A ><instance B>

非常に多くの I/O が発生するインスタンス A には、2 つの I/O スレッドと 2 つのレイジー ライター スレッドが存在するようになります。一方、プロセッサに負荷が集中する操作を実行するインスタンス B には、1 つの I/O スレッドと 1 つのレイジー ライター スレッドしかありません。異なる量のメモリをこれらのインスタンスに割り当てることができますが、ハードウェア NUMA とは異なり、どちらもオペレーティング システムの同じメモリ ブロックからメモリを受け取るのでメモリおよびプロセッサ間の関係はありません。

注意

SQL Server のインスタンスをアップグレードするときに Soft-NUMA レジストリ キーはコピーされません。

CPU affinity mask の設定

  1. インスタンス A で次のステートメントを実行し、CPU affinity mask を設定して CPU 0、1、2、および 3 を使用するように構成します。

    ALTER SERVER CONFIGURATION 
    SET PROCESS AFFINITY CPU=0 TO 3;
    
    ALTER SERVER CONFIGURATION 
    SET PROCESS AFFINITY CPU=0 TO 3;
    
  2. インスタンス B で次のステートメントを実行し、CPU affinity mask を設定して CPU 4、5、6、および 7 を使用するように構成します。

    ALTER SERVER CONFIGURATION 
    SET PROCESS AFFINITY CPU=4 TO 7;
    
    ALTER SERVER CONFIGURATION 
    SET PROCESS AFFINITY CPU=4 TO 7;
    

CPU へのソフト NUMA ノードのマッピング

  • レジストリ エディター プログラム (regedit.exe) を使用して、次のレジストリ キーを追加し、ソフト NUMA ノード 0 を CPU 0 および 1 に、ソフト NUMA ノード 1 を CPU 2 および 3 に、ソフト NUMA ノード 2 を CPU 4、5、6、および 7 にマッピングします。

    SQL Server 2005

    値の名前

    値データ

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node0

    DWORD

    CPUMask

    0x03

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node1

    DWORD

    CPUMask

    0x0c

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\NodeConfiguration\Node2

    DWORD

    CPUMask

    0xf0

    SQL Server 2008

    値の名前

    値データ

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node0

    DWORD

    CPUMask

    0x03

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node1

    DWORD

    CPUMask

    0x0c

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node2

    DWORD

    CPUMask

    0xf0

    SQL Server 2008 R2

    値の名前

    値データ

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node0

    DWORD

    CPUMask

    0x03

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node0

    DWORD

    Group

    0

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node1

    DWORD

    CPUMask

    0x0c

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node1

    DWORD

    Group

    0

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node2

    DWORD

    CPUMask

    0xf0

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\NodeConfiguration\Node2

    DWORD

    Group

    0

    ヒントヒント

    CPU 60 ~ 63 を指定するには BINARY 値 1111000000000000000000000000000000000000000000000000000000000000 を使用します。