今日はリソースガバナで遊んでみました♪
SQL Server 2008からリソースガバナって機能がありまして、
ワークロードとシステムリソースの消費を管理できるようになりました♪
詳細は
SQL Server のワークロードとリソースの管理を参照して下さい。
さて、今回は以下の事を行います。
- リソースプール作成
- ワークロード グループの作成
- 振り分け関数の作成
というわけで、さっそくリソースプールを作成します。
IF EXISTS ( SELECT name FROM sys.resource_governor_resource_pools WHERE name = N'GTEST')
BEGIN
DROP RESOURCE POOL [GTEST]
END
GO
CREATE RESOURCE POOL [GTEST] WITH
(
min_cpu_percent=0,
max_cpu_percent=50,
min_memory_percent=0,
max_memory_percent=50
)
GO
作成したリソースプールのお名前は
GTESTでCPU使用率0~50%、最大メモリ使用率0~50%で設定しました。
さてお次はワークロードグループの作成をします。
IF EXISTS ( SELECT name FROM sys.resource_governor_workload_groups WHERE name = N'LowProc')
BEGIN
DROP WORKLOAD GROUP [LowProc]
END
GO
CREATE WORKLOAD GROUP [LowProc] WITH
(
group_max_requests=0,
importance=Medium,
request_max_cpu_time_sec=0,
request_max_memory_grant_percent=25,
request_memory_grant_timeout_sec=0,
max_dop=0
) USING [GTEST]
GO
IF EXISTS ( SELECT name FROM sys.resource_governor_workload_groups WHERE name = N'Normalproc')
BEGIN
DROP WORKLOAD GROUP [Normalproc]
END
GO
CREATE WORKLOAD GROUP [Normalproc] WITH
(
group_max_requests=0,
importance=High,
request_max_cpu_time_sec=0,
request_max_memory_grant_percent=25,
request_memory_grant_timeout_sec=0,
max_dop=0
) USING [GTEST]
GO
ここでは
LowProc、NormalProcという2種類のワークロードグループをGTESTというリソースプールに対して作成しています。
LowProc、NormalProcともに同時要求の最大数、要求が使用できる最大 CPU 時間(s)、1 つの要求にプールから割り当てられる最大メモリ量(%)、
メモリ許可(作業バッファメモリ)が使用可能になるのをクエリが待機できる最大時間、を同じにしていますが、
ワークロード グループでの要求の相対的な重要度をMediumとHighに分けています。
ここまでで、リソースプールとワークロードができましたが、
実際にどのワークロードを使うのかというのを判定させる関数を作る必要があります。
次はその関数を作成します。
USE [master]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Choose]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[Choose]
GO
USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[Choose] ()
RETURNS SYSNAME WITH SCHEMABINDING
BEGIN
DECLARE @val varchar(32);
if 'localhost\imagawa' = SUSER_NAME()
SET @val = 'LowProc';
else if 'puser' = SUSER_NAME()
SET @val = 'NormalProc';
return @val;
END
GO
関数を見てお気づきかと思いますが、
作成したワークグループのお名前が戻り値になります。
ちなみに、この関数は
必ずmasterに作る必要があります。
関数を作っただけでは、割り当ての際に関数が呼ばれないので、関数を呼び出すように設定します。
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.Choose);
GO
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO
CLASSIFIER_FUNCTIONの引数に作成した関数を指定してALTER RESOURCE GOVERNORを実行し、そのあとに
ALTER RESOURCE GOVERNOR RECONFIGURE;を実行してリソースガバナの再構成を行います。
ここまでで、リソースガバナの設定はおしまいです。
さて、ではこれがちゃんと構成されているかを確認します。
select sys.dm_exec_sessions.original_login_name,
sys.resource_governor_workload_groups.name,
sys.resource_governor_workload_groups.importance,
sys.resource_governor_resource_pools.name
from sys.dm_exec_sessions join
sys.resource_governor_workload_groups on
sys.dm_exec_sessions.group_id = sys.resource_governor_workload_groups.group_id
join sys.resource_governor_resource_pools on sys.resource_governor_resource_pools.pool_id = sys.resource_governor_workload_groups.pool_id
;
実行結果
localhost\imagawa |
LowProc |
Medium |
GTEST |
localhost\imagawa |
default |
Medium |
default |
NT AUTHORITY\SYSTEM |
default |
Medium |
default |
puser |
NormalProc |
High |
GTEST |
puser |
NormalProc |
High |
GTEST |
localhost\imagawa |
LowProc |
Medium |
GTEST |
localhost\imagawa |
LowProc |
Medium |
GTEST |
こんな感じで、ログインユーザ名、ワークロードグループ名とその重要度、リソースプール名が表示されます。
リソースガバナの設定をする前にログインしていたものはdefaultのままですが、
ログインしなおしたものについては設定がきくようになりました♪
・・・・今日は、ちょっとやばぁい精神状態なので、この辺でおさらば♪