內存和CPU資源控制


數據庫系統的資源是指內存和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內置了兩個Resource Pools: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_MEMBER doesn’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
View Code

三,查看資源管理器

通過以下三個視圖查看資源管理器的元數據:

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

DMV sys.dm_exec_requests 和 sys.dm_exec_sessions 中包含group_id字段,用於表示當前session或request處於的工作負載分組。

 

MSDN示例腳本:

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
View Code

 

參考文檔:

Resource Governor

Resource Governor in SQL Server 2012

使用sql server 2008 資源調控器限制指定用戶查詢所使用CPU資源

CREATE RESOURCE POOL (Transact-SQL)

CREATE WORKLOAD GROUP (Transact-SQL)

ALTER RESOURCE GOVERNOR (Transact-SQL)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM