次の方法で共有


affinity mask サーバー構成オプション

この機能は、今後のバージョンの Microsoft SQL Server で削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションはできるだけ早く修正してください。 代わりに ALTER SERVER CONFIGURATION (Transact-SQL) を 使用してください。

マルチタスクを実行するために、Microsoft Windows はプロセス スレッドを異なるプロセッサ間で移動することがあります。 オペレーティング システムにとっては効率的であっても、このアクティビティで各プロセッサのキャッシュに繰り返しデータが再読み込みされるため、システムの負荷が高くなり、SQL Server のパフォーマンスが低下する場合があります。 プロセッサを特定のスレッドに割り当てると、プロセッサの再読み込みを排除し、プロセッサ間でのスレッドの移行を減らすことで、これらの条件下でのパフォーマンスを向上させることができます (これにより、コンテキストの切り替えが減ります)。このようなスレッドとプロセッサの間の関連付けは、プロセッサ アフィニティと呼ばれます。

SQL Server では、アフィニティ マスク (CPU アフィニティ マスクとも呼ばれます) とアフィニティ I/O マスクの 2 つのアフィニティ マスク オプションを使用して、プロセッサ アフィニティがサポートされます。 アフィニティ I/O マスクオプションの詳細については、「affinity Input-Output マスク サーバー構成オプション」を参照してください。 プロセッサが 33 から 64 のサーバーに対する CPU と I/O アフィニティのサポートでは、 affinity64 mask サーバー構成オプションaffinity64 Input-Output mask サーバー構成オプションをそれぞれ追加で使用する必要があります。

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

以前のリリースの SQL Server に存在していた affinity mask オプションは、CPU アフィニティを動的に制御します。

SQL Server では、SQL Server のインスタンスを再起動しなくても、アフィニティ マスク オプションを構成できます。 sp_configureを使用している場合は、構成オプションを設定した後で RECONFIGURE または RECONFIGURE WITH OVERRIDE を実行する必要があります。 SQL Server Express を使用している場合、アフィニティ マスク オプションを変更するには再起動が必要です。

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

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

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

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

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

I/O アフィニティ タスク (lazywriter や logwriter など) は、I/O アフィニティ マスクの影響を直接受けます。 レイジーライタータスクとログライタータスクがアフィニティ化されていない場合は、ロックモニターやチェックポイントなどの他の永続的なタスクに対して定義されているのと同じルールに従います。

新しいアフィニティ マスクが有効であることを確認するために、RECONFIGURE コマンドは、通常の CPU アフィニティと I/O アフィニティが相互に排他的であることを確認します。 そうでない場合は、クライアント セッションと SQL Server エラー ログにエラー メッセージが報告され、そのような設定は推奨されないことを示します。 RECONFIGURE WITH OVERRIDE オプションを実行すると、相互に排他的ではない CPU アフィニティと I/O アフィニティが可能になります。

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

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

SQL Server スレッドを特定のプロセッサで実行しないように分離することで、Microsoft Windows 2000 または Windows Server 2003 は、Windows に固有のプロセスのシステムの処理をより適切に評価できます。 たとえば、SQL Server の 2 つのインスタンス (インスタンス A と B) を実行している 8 CPU サーバーでは、システム管理者はアフィニティ マスク オプションを使用して、インスタンス A に 4 個の CPU の最初のセットを割り当て、2 番目のセット 4 をインスタンス B に割り当てることができます。32 を超えるプロセッサを構成するには、アフィニティ マスクと affinity64 マスクの両方を設定します。 affinity mask の値は、以下のとおりです。

  • 1 バイトの affinity mask は、マルチプロセッサ コンピューターで最大 8 個の CPU をカバーします。

  • 2 バイトの affinity mask は、マルチプロセッサ コンピューターで最大 16 個の CPU をカバーします。

  • 3 バイトの affinity mask は、マルチプロセッサ コンピューターで最大 24 個の CPU をカバーします。

  • 4 バイトの affinity mask は、マルチプロセッサ コンピューターで最大 32 個の CPU をカバーします。

  • 32 個を超える CPU をカバーするには、最初の 32 個の CPU に対して 4 バイトのアフィニティ マスクを構成し、残りの CPU には最大 4 バイトの affinity64 マスクを構成します。

SQL Server プロセッサ アフィニティの設定は特殊な操作であるため、必要な場合にのみ使用することをお勧めします。 ほとんどの場合、Microsoft Windows 2000 または Windows Server 2003 の既定のアフィニティが最適なパフォーマンスを提供します。 アフィニティ マスクを設定するときは、他のアプリケーションの CPU 要件も考慮する必要があります。 詳細については、Windows オペレーティング システムのマニュアルを参照してください。

Windows システム モニターを使用して、個々のプロセッサの使用状況を表示および分析できます。

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

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

  • affinity mask オプションでは「1」、affinity I/O mask オプションでは「0」。

  • affinity maskオプションには0、affinity I/O maskオプションには1を指定します。

注意事項

Windows オペレーティング システムで CPU アフィニティを構成したり、SQL Server でアフィニティ マスクを構成したりしないでください。 この 2 つの設定は、同じ効果をねらったものであり、これらの構成間に一貫性がない場合は、予期しない結果を招く可能性があります。 SQL Server の CPU アフィニティは、SQL Server の sp_configure オプションを使用して最適に構成されます。

アフィニティ マスク オプションの設定例として、プロセッサ 1、2、および 5 が使用可能として選択され、ビット 1、2、5 が 1 に設定され、ビット 0、3、4、6、および 7 が 0 に設定されている場合は、0x26の 16 進値または 10 進数の等価 38 が指定されます。 右から左にビット数を指定します。 affinity mask オプションは、プロセッサのカウントを 0 から 31 まで開始します。次の例では、カウンター 1 はサーバー上の 2 番目のプロセッサを表します。

sp_configure 'show advanced options', 1;  
RECONFIGURE;  
GO  
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

アフィニティ マスク オプションは高度なオプションです。 sp_configure システム ストアド プロシージャを使用して設定を変更する場合は、詳細オプションの表示が 1 に設定されている場合にのみ、affinity maskを変更できます。 Transact-SQL RECONFIGURE コマンドを実行すると、新しい設定がすぐに有効になります。SQL Server インスタンスを再起動する必要はありません。

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

ハードウェア ベースの非均一メモリ アクセス (NUMA) を使用し、アフィニティ マスクを設定すると、ノード内のすべてのスケジューラが独自の CPU にアフィニティされます。 アフィニティ マスクが設定されていない場合、各スケジューラは NUMA ノード内の CPU のグループにアフィニティ化され、NUMA ノード N1 にマップされたスケジューラは、ノード内の任意の CPU で作業をスケジュールできますが、別のノードに関連付けられている CPU ではスケジュールできません。

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

ライセンスに関する問題

動的関係は、CPU ライセンスにより厳密に制限されます。 SQL Server では、ライセンス ポリシーに違反するアフィニティ マスク オプションの構成は許可されません。

スタートアップ

指定されたアフィニティ マスクが SQL Server の起動中またはデータベースのアタッチ中にライセンス ポリシーに違反した場合、エンジン レイヤーはスタートアップ プロセスまたはデータベースのアタッチ/復元操作を完了し、アフィニティ マスクのsp_configure実行値をゼロにリセットし、エラー メッセージを SQL Server エラー ログに発行します。

再設定

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

こちらもご覧ください

リソースの利用状況の監視 (システム モニター)
RECONFIGURE (Transact-SQL)
サーバー構成オプション (SQL Server)
sp_configure (Transact-SQL)
ALTER SERVER CONFIGURATION (Transact-SQL)