SQL Server 2012 RC0 では CTP3 には含まれていなかったリソースガバナーの拡張が実装されています。
今回の投稿では拡張された部分についてみていきたいと思います。
■二つの機能追加
SQL Server 2012 RC0 のリソースガバナーでは二つの機能が追加されています。
- CAP_CPU_PERCENT
- AFFINITY
これらの機能は CREATE RESOURCE POOL で設定することが可能です。
それでは実際にどのような機能なのかを見ていきたいと思います。
■CAP_CPU_PERCENT
今までのリソースガバナーでも CPU の使用率の調整をすることができました。
CPU の最大使用率や並列処理の調整といった機能がこれに該当します。
今までの CPU の使用率制御は使えるときにはフルに使用して、他のワークロードが発生した場合に CPU の使用率制限を怒っていました。
以下のように CPU の使用率を設定していたとします。
default は 70 / ResTest は 30 に設定しています。
CPU 負荷が高い処理を実行した場合の各リソースプールの CPU 使用率は以下のようになります。
default のリソースプールに該当する処理が実行するまでは 100% CPU を使用しており、default が使用されるタイミングで CPU の使用率が調整されています。
使えるときは CPU を最大限使用するというのはリソースの有効活用としては最適化された状態ですが、マルチテナントの SQL Server としてサービスを提供するというようなことを考えた場合、処理の速度にばらつきが出てくる形になります。
# 他のリソースプールが使用されていないときは、CPU が最大限使用されるため。
他のワークロードが発生していない際でも CPU の使用率の上限を設定したい場合に、CAP_CPU_PERCENT を使用します。
以下のクエリを使用して、CAP_CPU_PERCENT を 30 に設定したとします。
ALTER RESOURCE POOL [ResTest] |
先ほどは他のワークロードが実行されるまでは、CPU を 100% 使用することができましたが CAP (上限) を設定した場合、設定した値が CPU 使用率の上限値となります。
他のワークロードが実行されていない場合でも上限を超えることがない設定となります。
設定によってはこのような形にすることが可能なのですが、複数のワークロードが重なった時の挙動がまだ把握できていません…。
最終的には想定している上限になるのですが、設定している上限になるまで時間がかかってしまうのですよね。
CAP_CPU_PERCENT に関しては現状、GUI から設定値を確認することができませんが、[sys.dm_resource_governor_resource_pools] から確認をすることができます。
■AFFINITY
AFFINITY はどのスケジューラーを使用するかの調整となります。
リソースプールに対して SCHEDULER と NUMANODE を設定することが可能です。
このような形で使用するスケジューラーを固定することができます。
ALTER RESOURCE POOL [ResTest] |
先ほどの CAP_CPU_PERCENT はワークロードの実行中に設定を変更することができるようなのですが、AFFINITY に関しては実行中に変更しても設定が動的に反映されるということはないようです。
プロセッサのアフィニティを固定しておくと動作が分かりやすいので、今回はプロセッサの関係マスクを固定して、スレッド単位で使用される CPU コアが移動されないようにしておきます。
この状態で負荷をかけてみると CPU 2/ 4 / 5 / 6 が使用されていることが確認できます。
プロセッサの関係マスクを設定しない状態では、スレッド単位に使用される CPU コアがバランシングされるため、CPU の使用率としては同じなのですが、実際に使用されているコアが分散されます。
# RESOURCE POOL の AFFINITY は使用する SQLOS のスケジューラーを設定するためのものであるため。
SQL Server 2012 のリソースガバナーを使用することで、今まではできなかった CPU 上限の設定や、OLTP / バッチで使用するスケジューラーを分離させるといったリソース管理ができるようになりそうですね。