SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server 2012 RC0 のリソースガバナーの拡張について

leave a comment

SQL Server 2012 RC0 では CTP3 には含まれていなかったリソースガバナーの拡張が実装されています。

今回の投稿では拡張された部分についてみていきたいと思います。

■二つの機能追加


SQL Server 2012 RC0 のリソースガバナーでは二つの機能が追加されています。

  1. CAP_CPU_PERCENT
  2. AFFINITY

これらの機能は CREATE RESOURCE POOL で設定することが可能です。

それでは実際にどのような機能なのかを見ていきたいと思います。

 

■CAP_CPU_PERCENT


今までのリソースガバナーでも CPU の使用率の調整をすることができました。

CPU の最大使用率や並列処理の調整といった機能がこれに該当します。
image

今までの CPU の使用率制御は使えるときにはフルに使用して、他のワークロードが発生した場合に CPU の使用率制限を怒っていました。
以下のように CPU の使用率を設定していたとします。
image

default は 70 / ResTest は 30 に設定しています。

CPU 負荷が高い処理を実行した場合の各リソースプールの CPU 使用率は以下のようになります。

default のリソースプールに該当する処理が実行するまでは 100% CPU を使用しており、default が使用されるタイミングで CPU の使用率が調整されています。
image

使えるときは CPU を最大限使用するというのはリソースの有効活用としては最適化された状態ですが、マルチテナントの SQL Server としてサービスを提供するというようなことを考えた場合、処理の速度にばらつきが出てくる形になります。
# 他のリソースプールが使用されていないときは、CPU が最大限使用されるため。

他のワークロードが発生していない際でも CPU の使用率の上限を設定したい場合に、CAP_CPU_PERCENT を使用します。

以下のクエリを使用して、CAP_CPU_PERCENT を 30 に設定したとします。

ALTER RESOURCE POOL [ResTest]
WITH (
    CAP_CPU_PERCENT=30
)
ALTER RESOURCE GOVERNOR RECONFIGURE

先ほどは他のワークロードが実行されるまでは、CPU を 100% 使用することができましたが CAP (上限) を設定した場合、設定した値が CPU 使用率の上限値となります。
image

他のワークロードが実行されていない場合でも上限を超えることがない設定となります。

設定によってはこのような形にすることが可能なのですが、複数のワークロードが重なった時の挙動がまだ把握できていません…。
最終的には想定している上限になるのですが、設定している上限になるまで時間がかかってしまうのですよね。
image

CAP_CPU_PERCENT に関しては現状、GUI から設定値を確認することができませんが、[sys.dm_resource_governor_resource_pools] から確認をすることができます。

 

■AFFINITY


AFFINITY はどのスケジューラーを使用するかの調整となります。
リソースプールに対して SCHEDULER と NUMANODE を設定することが可能です。

このような形で使用するスケジューラーを固定することができます。

ALTER RESOURCE POOL [ResTest]
WITH (
    AFFINITY SCHEDULER=(1, 3 TO 5)
)
ALTER RESOURCE GOVERNOR RECONFIGURE

先ほどの CAP_CPU_PERCENT はワークロードの実行中に設定を変更することができるようなのですが、AFFINITY に関しては実行中に変更しても設定が動的に反映されるということはないようです。

プロセッサのアフィニティを固定しておくと動作が分かりやすいので、今回はプロセッサの関係マスクを固定して、スレッド単位で使用される CPU コアが移動されないようにしておきます。
image

この状態で負荷をかけてみると CPU 2/ 4 / 5 / 6 が使用されていることが確認できます。
image

プロセッサの関係マスクを設定しない状態では、スレッド単位に使用される CPU コアがバランシングされるため、CPU の使用率としては同じなのですが、実際に使用されているコアが分散されます。
# RESOURCE POOL の AFFINITY は使用する SQLOS のスケジューラーを設定するためのものであるため。
image

SQL Server 2012 のリソースガバナーを使用することで、今まではできなかった CPU 上限の設定や、OLTP / バッチで使用するスケジューラーを分離させるといったリソース管理ができるようになりそうですね。

Written by masayuki.ozawa

11月 26th, 2011 at 9:28 pm

Posted in SQL Server

Tagged with ,

Leave a Reply

*