SQL Server では、affinity mask オプションまたは、PROCESS AFFINITY を使用して、ハードウェアスレッドの関連付けを変更することができます。
今回の投稿ではこの設定がどのように動作に影響するのかを確認してみたいと思います。
実際の環境だとデフォルトの設定のまま変更することは少ないと思いますが。
■デフォルトの設定の動作
SQL Server の PROCESS AFFINITY の設定はデフォルトでは自動になっています。
この状態では SQL Server はすべての CPU を使用可能となっています。
この状態で、以下のクエリを実行してみます。
DECLARE @i int = 0 |
単純な計算を永久ループするクエリです。
この時の CPU の使用状況ですが以下のようになっています。
特定の CPU を常に使用して処理をするのではなく、使用される CPU が分散していることが確認できると思います。
SQL Server のデフォルトの CPU の使い方はこの状態となります。
SQL Server は SQLOS のスケジューラーを使用して処理を行っています。
デフォルトの設定ではスケジューラーは特定の CPU と固定でマッピングはされておらず、CPU の利用状況に応じて柔軟に使用する CPU を切り替えて処理を進めていきます。
■PROCESS AFFINITY を設定
次に PROCESS AFFINITY を設定してみます。
すべての CPU を使用するように明示的に設定をしている状態となります。
全 CPU を使用するというのは先ほどと変わらないですね。
それではクエリを実行してみます。
先ほどとは異なり、特定の CPU のみを使用して処理がされているのが確認できます。
これが、BOL に記載されている
ハードウェア スレッドを CPU に関連付けます。
の効果になります。
スレッドが CPU 間を移動しなくなり、固定化されることによりレスポンスがあがるかは環境に依存するのできちんとテストする必要があります。
# コンテキストスイッチを減少させるために設定するという文献があった記憶がありますが。
たまにクエリを実行して CPU 負荷を上げようとした際に思った挙動にならなくてなんでだろうということになるので、動作について軽くまとめてみました。