數據庫系統的資源是指內存和CPU(處理器)資源,擁有資源的多寡,決定了數據查詢的性能。當一個SQL Server實例上,擁有多個獨立的工作負載(workload)時,使用資源管理器(Resource Governor),能夠實現系統資源在邏輯上的隔離,解決在一臺SQL Server實例上,管理多用戶工作負載的需求。資源管理器允許數據庫管理員(DBA)通過編程設置資源池,配置資源池擁有資源的上限,資源池是每一個請求能夠使用的資源,這樣設置之后,強制系統在處理用戶發送的請求(Requsts)時所耗費的CPU 和 Memory資源的數量不能超過限制,在一定程度上,限制用戶能夠使用的資源數量,隔離了失控(runaway)的查詢對系統的影響。對于SQL Server 2012來說,用戶能夠基于工作負載,實現CPU資源的完全隔離,并能設置CPU資源使用量的硬上限(CAP Usage,Hard Limit)。在一個多用戶、高并發的SQL Server實例上,管理員使用Resource Governor,控制不同工作負載對內存和CPU資源的使用量,使不同的應用程序在資源的使用上相互隔離,使系統性能得到可預測性的控制和保證。
一,資源管理器的基本構成
Resource Governor的可編程部分由三部分組成:Resource Pool,Workload Group 和 Classifier Function,每個部分實現不同的功能。
1,資源池(Resource Pool)
在SQL Server實例中,資源隔離的基本單位是Resource Pool,正如其名,該對象是資源池,在創建Resource Pool時,指定該Pool擁有的CPU和Memory資源的數量范圍。在SQL Server 2012版本中,最多可以創建62個用戶自定義的Resource Pool。SQL Server內置了兩個ResourcePools:internal用于系統Task,用戶不能配置;default是默認的Resource Pool,用于任何沒有指定Resource Pool的Request;
2,負載分組(Workload Group)
Workload Group是邏輯上的實體,用于表示一個或多個工作負載。實際上,一個工作負載是SQL Server實例接收到的一個查詢請求(Request),通過Classifier Function將多個具有共同屬性的Requests劃分到相同的Workload Group中。每一個Resource Pool服務于一個或多個工作負載分組,這就是說,這些工作負載分組能夠共享同一個Resource Pool中擁有的資源。
SQL Server內置兩個負載分組:internal和default,關聯到相應的internal和default資源池,internal負載分組用于系統Task,SQL Server將沒有被分類函數顯式指定負載分組的Request劃分到default 分組中。
3,分類函數(Classifier Function)
分類函數根據指定的規則(Rule),例如,根據Login,應用程序名稱,數據庫名字等屬性,將接收的Request分配(路由)到不同的負載分組中,可以指定用戶定義的負載分組或default負載分組。
4,處理流程
Resource Governor各個部分相互配合,控制內存和CPU資源的使用:Classification將SQL Server實例接收到的Requests進行分類,劃分到不同的負載組中,負載組與之關聯的Resource Pool中包含的CPU和內存資源來處理Request,Resource Governor的處理流程如下圖:
Resource Pool 是SQL Server實例中物理資源的子集,由于位于同一個實例上的所有數據庫共享該實例的所有資源,因此,最好將Resource Pool的三個組成對象創建在master 數據庫中。
二,創建和使用資源管理器
資源管理器默認是關閉的,在使用之前,必須啟用。用戶可以通過SSMS啟用資源管理器,展開Management,選擇Resource Governor,右擊彈出快捷菜單,點擊“Enable”,啟用資源管理器:
或者,使用TSQL命令,重新配置,啟用資源管理器:
ALTER RESOURCE GOVERNOR RECONFIGURE; GO
1, 創建自定義的資源池(Resource Pool)
SQL Server 內置兩個資源池:internal和default,internal是系統內部使用的,default是默認的資源池,當一個查詢請求沒有指定資源池時,使用默認的資源池。為了管理用戶不同的工作負載,DBA需要根據業務需求創建自定義的資源池。在創建資源池時,需要注意,資源池的選項都是比例關系,所有資源的下限(MIN_MEMORY_PERCENT或MIN_CPU_PERCENT)的加和不能超過系統的物理資源總量,即不能超過100。
CREATE RESOURCE POOL rp_20Percent WITH ( MIN_CPU_PERCENT = 0, MAX_CPU_PERCENT = 40, CAP_CPU_PERCENT = 40, AFFINITY SCHEDULER = auto, MIN_MEMORY_PERCENT = 0, MAX_MEMORY_PERCENT = 20 );
CAP_CPU_PERCENT選項:設置資源池擁有CPU資源的硬上限,任何Workload Group使用的CPU數量不可能超過該上限,而資源池使用的CPU資源有可能超過MAX_CPU_PERCENT 選項指定的比例。
2,創建工作負載組(Workload Group)
創建工作負載分組,通過using子句關聯該分組能夠使用的資源池,一個工作負載分組只能關聯一個資源池,一個資源池可以服務一個或多個工作負載分組。
CREATE WORKLOAD GROUP wg_20Percent WITH ( IMPORTANCE = MEDIUM, REQUEST_MAX_MEMORY_GRANT_PERCENT=20, REQUEST_MAX_CPU_TIME_SEC=0, REQUEST_MEMORY_GRANT_TIMEOUT_SEC=0, MAX_DOP=0, GROUP_MAX_REQUESTS=0 ) USING rp_20Percent;
IMPORTANCE選項:有三個可選值:Low,Medium和High,默認值是Medium,該選項用于指定該Workload Group在關聯的資源池(Resource Pool)中相對的重要性,由于同一個可以Resource Pool關聯多個Workload Group,當一個工作負載組(Workload Group)的Importance數值高于其他工作負載組(Workload Group)時,在競爭Resource Pool中的資源時,更容易獲勝。當前工作負載組的IMPORTANCE的選項不會使用其他資源池,也不會影響其他資源組中的工作負載。
REQUEST_MAX_MEMORY_GRANT_PERCENT:默認值是25,用于指定工作負載組能夠從資源組中申請到的最大授予內存(Grant Memory)資源,由于授予內存跟執行的SORT和HASH JOIN操作有關,如果設置REQUEST_MAX_MEMORY_GRANT_PERCENT為0,這意味著,SQL Server引擎將不允許執行排序和哈希鏈接操作。
MAX_DOP:用于指定并發查詢的最大并發度(Degree of Parallelism),默認值是0,表示使用全局配置(Global Setting)。
3,創建分類函數(Classifier Function)
分類函數根據特定的規則(Rule)把接收的request路由到不同的資源池中,用戶應該把分類函數創建在master數據庫中,這樣,函數的作用域就是整個SQL Server實例,分類函數的執行上下文是master 數據庫;如果分類函數返回NULL,default或不存在的工作負載組的名稱,那么查詢被路由導default資源池:
If the user-defined function returns NULL, default, or the name of non-existent group the session is given the default workload group context. The session is also given the default context if the function fails for any reason.
The function should be defined with server scope (master database).
例如,根據用戶名稱,將Request劃分到wg_20Percent負載分組。默認情況下,任何沒有指定Workload Group的Request,都分發到Default資源池。在實際產品環境中,也可以使用APP_NAME()獲取應用程序名字,或者SUSER_NAME()獲取用戶的登陸(Login)名稱,根據應用程序或登陸名稱劃分負載分組。
CREATE FUNCTION dbo.rgClassifierFunction_20Percent() RETURNS sysname WITH SCHEMABINDING AS BEGIN DECLARE @Workload_Group_Name AS sysname IF (SUSER_NAME() = 'USER_READONLY') SET @workload_group_name = 'wg_20Percent' RETURN @workload_group_name END;
常用于分類函數(Classifier Function)中的函數如下,這些函數的執行上下文是整個Server:
APP_NAME():返回當前Session所在的應用程序的名稱
HOST_NAME():返回主機名稱;
SUSER_NAME():返回登陸名;
IS_SVROLEMEMBER():當用戶是特定的服務器角色時,返回True;
注意:列表中函數執行的上下文和分類函數的上下文相同,如果分類函數被創建在master數據庫,那么分類函數的查詢的范圍是在master數據庫。
執行上下文是單個數據庫的函數是:
IS_MEMBER('role | group')
IS_ROLEMEMBER( 'role' [ , 'database_principal' ] )
函數:IS_MEMBER('role | group'),用于檢測當前的用戶(User)是否屬于當前數據庫的role或windows group。通常情況下,我們把分類函數創建在master系統數據庫中,這會導致函數的執行上下文是master數據庫,而不是用戶數據庫,而master數據庫中可能不存在windows group(數據庫用戶User),這會導致函數無法起到分類的作用:
IS_MEMBERdoesn’t work here as it’ll be firing in the context of the master db, not the user database you’re interested in.
為了解決這個問題,必須在master數據庫中創建相應的windows group(數據庫用戶User)。
4,啟動資源管理器(Resource Governor)
為了啟動資源管理器(Resource Governor),首先配置資源管理器使用的分類函數,把資源管理器和分類函數關聯起來;然后,重新配置資源管理器,啟動Resource Governor。啟動之后,SQL Server引擎使用分類函數對把SQL Server實例接收的查詢請求(Requests),分配到不同的負載分組中。
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=dbo.rgClassifierFunction_20Percent); GO ALTER RESOURCE GOVERNOR RECONFIGURE; GO
5,修改分類函數
修改分類函數,需要先禁用資源管理器,然后解除分類函數和資源管理器的關聯關系,然后修改分類函數,把資源管理器和分類函數重新綁定:
ALTER RESOURCE GOVERNOR DISABLE; GO ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=NULL); GO ALTER FUNCTION dbo.rgClassifierFunction_20Percent() RETURNS sysname WITH SCHEMABINDING AS BEGIN .... END; GO ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=dbo.rgClassifierFunction_20Percent); GO ALTER RESOURCE GOVERNOR RECONFIGURE; GO
三,查看資源管理器
通過以下三個視圖查看資源管理器的元數據:
sys.resource_governor_configuration sys.resource_governor_workload_groups sys.resource_governor_resource_pools
通過以下三個DMV查看資源管理器的統計數據:
sys.dm_resource_governor_configuration sys.dm_resource_governor_workload_groups sys.dm_resource_governor_resource_pools
DMVsys.dm_exec_requests 和 sys.dm_exec_sessions 中包含group_id字段,用于表示當前session或request處于的工作負載分組。
CREATE FUNCTION dbo.rgclassifier_v1() RETURNS sysname WITH SCHEMABINDING AS BEGIN -- Declare the variable to hold the value returned in sysname. DECLARE @grp_name AS sysname -- If the user login is 'sa', map the connection to the groupAdmin workload group. IF (SUSER_NAME() = 'sa') SET @grp_name = 'groupAdmin' -- Use application information to map the connection to the groupAdhoc workload group. ELSE IF (APP_NAME() LIKE '%MANAGEMENT STUDIO%') OR (APP_NAME() LIKE '%QUERY ANALYZER%') SET @grp_name = 'groupAdhoc' -- If the application is for reporting, map the connection to the groupReports workload group. ELSE IF (APP_NAME() LIKE '%REPORT SERVER%') SET @grp_name = 'groupReports' -- If the connection does not map to any of the previous groups, put the connection into the default workload group. ELSE SET @grp_name = 'default' RETURN @grp_name END; GO -- Register the classifier user-defined function and update the -- the in-memory configuration. ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=dbo.rgclassifier_v1); GO ALTER RESOURCE GOVERNOR RECONFIGURE; GO
編輯:hfy
-
cpu
+關注
關注
68文章
10854瀏覽量
211578 -
內存
+關注
關注
8文章
3019瀏覽量
74003 -
數據庫系統
+關注
關注
0文章
31瀏覽量
9590 -
資源管理器
+關注
關注
0文章
23瀏覽量
7533
發布評論請先 登錄
相關推薦
評論