サーバー構成: 関係マスク

適用対象: SQL Server

Note

この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに ALTER SERVER CONFIGURATION を使用します。

マルチタスクを実行するため、 Windows では、プロセス スレッドが別のプロセッサに移動される場合があります。 オペレーティング システムにとっては効率的であっても、このアクティビティで各プロセッサのキャッシュに繰り返しデータが再読み込みされるため、システムの負荷が高くなり、SQL Server のパフォーマンスが低下する場合があります。 このような状況では、特定のスレッドにプロセッサを割り当てることで、プロセッサの再読み込みを回避してパフォーマンスを向上できます。このようなスレッドとプロセッサ間の関連付けを "プロセッサ関係 (processor affinity)" と言います。

SQL Server では、 2 つの関係マスク オプション affinity mask (別名 CPU 関係マスク) と affinity I/O mask により、プロセッサ関係をサポートします。 affinity I/O mask option の詳細については、「関係 I/O マスク サーバー構成オプションを設定する」を参照してください。 プロセッサが 33 から 64 個のサーバーに対して CPU および I/O 関係をサポートするには、affinity64 マスク および affinity64 I/O マスク サーバー構成オプションがそれぞれ必要になります。

Note

33 から 64 個までのプロセッサを搭載しているサーバーでの関係 (affinity) は、64 ビット オペレーティング システムでのみサポートされます。

affinity mask オプションは、SQL Server の以前のリリースでも提供されており、動的に CPU 関係を制御します。

SQL Server では、SQL Server インスタンスを再起動しなくても affinity mask オプションを構成できます。 sp_configure, を使用する場合は、構成オプションを設定した後、RECONFIGURE または RECONFIGURE WITH OVERRIDE を実行する必要があります。 SQL Server Express を使用するとき、affinity mask オプションを変更した場合、再起動する必要があります。

関係マスクに対する変更は動的に行われるため、SQL Server 内のプロセス スレッドをバインドする CPU スケジューラのオンデマンドでの起動とシャットダウンが可能になります。 この処理は、サーバーの状態の変化に伴って発生する可能性があります。 たとえば、SQL Server の新しいインスタンスをサーバーに追加したときに、プロセッサの負荷を再分散するために、affinity mask オプションを調整する必要が生じる場合があります。

SQL Server が新しい CPU スケジューラを有効にし、既存の CPU スケジューラを無効にするためには、関係ビットマスク (affinity bitmask) を変更する必要があります。 関係ビットマスクを変更すると、新しいスケジューラまたは継続して使用されているスケジューラで新しいバッチを処理できるようになります。

新しい CPU スケジューラを起動するために、SQL Server により新しいスケジューラが作成され、これが標準のスケジューラのリストに追加されます。 新しいスケジューラは、新しく受信するバッチ専用と見なされます。 現在のバッチは、これまでと同じスケジューラで実行されます。 ワーカーは、ワーカーが解放されたとき、または新しいワーカーが作成されたときに、新しいスケジューラに移行されます。

スケジューラをシャットダウンするには、スケジューラ上のすべてのバッチが操作を完了し、終了される必要があります。 シャットダウンされたスケジューラは、オフラインとしてマークされ、新しいバッチがこのスケジューラにより処理されないようにします。

新しいスケジューラを追加または削除しても、ロック モニターやチェックポイント、システム タスク スレッド (DTC の処理)、シグナル プロセスなどの永続的なシステム タスクは、サーバーが稼働している間はスケジューラ上で継続して実行されます。 このような永続的なシステム タスクについては、動的な移行は行われません。 スケジューラ間でこれらのシステム タスクのプロセッサ負荷を再分散するには、SQL Server インスタンスを再起動する必要があります。 SQL Server が永続的なシステム タスクに関連付けられているスケジューラをシャットダウンした場合、タスクはオフラインになったスケジューラ上で引き続き実行されます (移行はされません)。 このスケジューラは、変更された関係マスク内のプロセッサにバインドされているため、変更前にバインドされていたプロセッサには負荷を分散しません。 オフラインのスケジューラが増えたとしても、システムの負荷には目立った影響はありません。 その場合、変更されたアフィニティ マスクで使用可能なスケジューラでこれらのタスクを再構成するには、データベース サーバーを再起動する必要があります。

同じ CPU を使用するように SQL Server の affinity maskaffinity I/O mask の構成値を設定しないでください。 SQL Server ワーカー スレッドのスケジューリングと I/O 処理の両方にプロセッサをバインドすると、パフォーマンスが低下する可能性があります。 このため、構成値が同じプロセッサに対して設定されていないことを確認してください。 affinity64 maskaffinity64 I/O mask にも同じ推奨事項が適用されます。 affinity maskaffinity I/O mask と重複しないようにするため、RECONFIGURE コマンドでは、通常の CPU 関係と I/O 関係が相互に排他的であるかどうかの確認を行います。 相互に排他的でない場合は、そのような設定は推奨されないことを示すエラー メッセージがクライアント セッションと SQL Server エラー ログに報告されます。

 Msg 5834, Level 16, State 1, Line 1
 The affinity mask specified conflicts with the IO affinity mask specified. Use the override option to force this configuration.

RECONFIGURE WITH OVERRIDE オプションを実行すると、重複して相互に排他的ではない CPU 関係と I/O 関係が許可されます。

I/O 関係タスク (レイジー ライターやログ ライターなど) は、affinity I/O mask の影響を直接受けます。 レイジー ライター タスクやログ ライター タスクは、バインドされていない場合、ロック モニターやチェックポイントなどの他の永続タスクに定義されているものと同じルールに従います。

存在しない CPU にマップしているような関係マスクを指定した場合、RECONFIGURE コマンドによりクライアント セッションと SQL Server エラー ログの両方にエラー メッセージが報告されます。 この場合、RECONFIGURE WITH OVERRIDE オプションを使用しても影響がなく、同じ構成エラーが再度報告されます。

Windows オペレーティング システムによる特定のワークロード割り当てから SQL Server の動作を除外することもできます。 プロセッサを表すビットを 1 に設定している場合、SQL Server データベース エンジンは、このプロセッサをスレッド割り当ての対象として選択します。 affinity mask0 (既定値) に設定すると、Microsoft Windows のスケジューリング アルゴリズムにより、スレッドの関係が設定されます。 affinity mask を 0 以外の値に設定すると、 の関係により、選択可能なプロセッサを指定するビット マスクとしてその値が解釈されます。

SQL Server スレッドを特定のプロセッサ上の実行から隔離すると、Microsoft Windows でシステムによる Windows 固有のプロセス処理を評価しやすくなります。 たとえば、SQL Server のインスタンスを 2 つ (インスタンス A および B) を実行する 8 CPU サーバーで、システム管理者は affinity mask オプションを使用して最初の 4 個の CPU をインスタンス A に割り当て、残りの 4 個をインスタンス B に割り当てることができます。33 プロセッサ以上を構成する場合は、affinity mask および affinity64 mask の両方を設定します。 affinity mask の値は、以下のとおりです。

マスク内のバイト数 CPU の数
1 バイト 最大 8 個の CPU
2 バイト 最大 16 個の CPU
3 バイト 最大 24 個の CPU
4 バイト 最大 32 個の CPU

33 個以上の CPU に対応するには、最初の 32 個の CPU に 4 バイトの affinity mask を構成し、残りの CPU に 4 バイトの affinity64 mask を構成します。

SQL Server プロセッサ関係を設定することは特別な操作であるため、特に必要な場合にのみこのオプションを使用します。 通常は、既定の Windows の関係で、最適なパフォーマンスが得られます。 関係マスクを設定する場合は、他のアプリケーションの CPU 要件を考慮する必要があります。 詳細については、Windows オペレーティング システムのマニュアルを参照してください。

Note

各プロセッサの利用状況を表示して分析するには、プロセス モニターを使用します。

affinity I/O mask オプションを指定する場合は、affinity mask 構成オプションと共に使用する必要があります。 ただし、既に説明したように、affinity mask スイッチと affinity I/O mask オプションの両方で同じ CPU を有効にしないでください。 各 CPU に対応するビットは、次の 3 つの状態のうちのいずれかに設定します。

  • affinity mask オプションと affinity I/O mask オプションの両方の 0
  • affinity mask オプションの 1affinity I/O mask オプションの 0
  • affinity mask オプションの 0affinity I/O mask オプションの 1

注意事項

Windows オペレーティング システムでの CPU 関係の構成と、 SQL Serverでの affinity mask の構成は、同時に行わないようにしてください。 この 2 つの設定は、同じ効果をねらったものであり、これらの構成間に一貫性がない場合は、予期しない結果を招く可能性があります。 SQL Server の CPU 関係を構成する場合は、SQL Server の sp_configure オプションを使用する方法が最適です。

affinity mask オプションの設定例として、たとえば、ビット位置 1、2、および 5 を 1 に設定し、ビット 0、3、4、6、および 7 を 0 に設定して、プロセッサ 1、2、および 5 を使用可能として選択する場合は、16 進値 0x26 または 10 進値 38 を使用する必要があります。 ビット位置の番号は右から左に数えます。

EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
EXEC sp_configure 'affinity mask', 38;
RECONFIGURE;
GO

次の表は、8 CPU システムの affinity mask 値を示しています。

10 進値 2 進ビット マスク SQL Server スレッドを有効にするプロセッサ
1 00000001 0
3 00000011 0 と 1
7 00000111 0、1、および 2
15 00001111 0、1、2、および 3
31 00011111 0、1、2、3、および 4
63 00111111 0、1、2、3、4、および 5
127 01111111 0、1、2、3、4、5、および 6
255 11111111 0、1、2、3、4、5、6、および 7

affinity mask オプションは拡張オプションです。 この設定の変更に、sp_configure システム ストアド プロシージャを使用している場合、show advanced options1 に設定されている場合のみ、affinity mask の設定を変更することができます。 Transact-SQL の RECONFIGURE コマンドの実行が完了すると、新しい設定は、SQL Server インスタンスを再起動しなくてもすぐに有効になります。

NUMA (Non-Uniform Memory Access)

NUMA (Non-Uniform Memory Access) ベースのハードウェアを使用し、affinity mask を設定する場合、ノード内のすべてのスケジューラがそのノードの CPU にバインドされます。 affinity mask を設定しない場合、各スケジューラは NUMA ノード内の CPU のグループにバインドされ、NUMA ノード N1 にマップされたスケジューラはノード内の任意の CPU で作業をスケジュールできますが、他のノードに関連付けられた CPU ではスケジュールできません。

1 つの NUMA ノードで実行中のすべての操作は、そのノードのバッファー ページのみを使用できます。 操作を複数のノードの CPU で並行して実行する場合、メモリは関連する任意のノードから使用できます。

ライセンスの問題

動的関係は、CPU ライセンスにより厳密に制限されます。 SQL Server では、ライセンス ポリシーに違反する affinity mask オプションの構成が許可されていません。

Startup

SQL Server の起動時またはデータベースのアタッチ時に、指定された関係マスクがライセンス ポリシーに違反する場合、エンジン層により起動処理や、データベースのアタッチおよび復元操作は完了されますが、その後、関係マスクの sp_configure 実行値が 0 にリセットされ、SQL Server エラー ログにエラー メッセージが記録されます。

再構成

Transact-SQL の RECONFIGURE コマンドの実行時に、指定された関係マスクがライセンス ポリシーに違反する場合は、エラー メッセージがクライアント セッションと SQL Server エラー ログに報告され、データベース管理者に関係マスクの再構成が求められます。 この場合、RECONFIGURE WITH OVERRIDE コマンドは使用できません。