SQLSERVER中的資源調控器
一個資源池可以有多個組 resource_pools有多個workload_groups 一個resource_pools只有一個workload_groups情況下dm_resource_governor_resource_pools的pool_id==sys.dm_exec_sessions的group_id --查看Session所在的資源池 select s.session_id,s.login_name ,s.program_name,s.group_id,g.name from sys.dm_exec_sessions s join sys.dm_resource_governor_workload_groups g on s.group_id=g.group_id where session_id>50 and s.group_id=256 --查看資源池情況 select * from sys.dm_resource_governor_resource_pools select * from sys.dm_resource_governor_workload_groups --查看資源池情況 select * from sys.dm_resource_governor_resource_pools select * FROM sys.dm_resource_governor_workload_groups wg INNER JOIN sys.dm_resource_governor_resource_pools rp ON [rp].[pool_id] = [wg].[pool_id]
轉載自:
http://wenku.baidu.com/view/0d92380cf78a6529647d5375.html
http://www.cnblogs.com/fygh/archive/2012/05/07/2489190.html
資源調控器是sql server 2008新增的功能,可以限制某些用戶訪問sql server所消耗的cpu、內存資源或是對某個庫訪問
所消耗的cpu、內存資源,可以在SQL Server 的 Enterprise Edition、Developer Edition 和 Evaluation Edition中使用。
配置資源調控器基本分為以下步驟:
(1) 創建並配置一個資源調控器資源池,發生 CPU 爭用時,該資源池將限制分配給資源池中的請求的最大平均 CPU 帶寬。
(2) 創建並配置一個使用該池的資源調控器工作負荷組。
(3) 創建一個“分類器函數”,它是一個用戶定義函數 (UDF),其返回值供資源調控器用來對會話進行分類,
以便將它們路由到適當的工作負荷組。
(4)將分類器函數注冊到資源調控器。
(5)將更改應用於資源調控器進行配置。
你可以使用IS_MEMBER()、APP_NAME()、SUSER_SNAME()、CONNECTIONPROPERTY()等函數在分類器函數里編寫您的業務邏輯
msdn中的示例
本測試示例是限制某查詢用戶USER_READONLY限制cpu最大為10%.
--配置資源調控器. USE master GO -- 創建並配置一個資源調控器資源池,發生 CPU 爭用時, -- 該資源池將限制分配給資源池中的請求的最大平均 CPU 帶寬為 10% CREATE RESOURCE POOL pMAX_CPU_PERCENT_10 WITH (MAX_CPU_PERCENT = 10) GO -- 創建並配置一個使用該池的資源調控器工作負荷組。 CREATE WORKLOAD GROUP gMAX_CPU_PERCENT_10 USING pMAX_CPU_PERCENT_10; GO -- 創建一個“分類器函數”,它是一個用戶定義函數 (UDF), -- 其返回值供資源調控器用來對會話進行分類,以便將它們路由到適當的工作負荷組 -- 本例是限制用戶為:USER_READONLY所使用的cpu資源不超過10% USE master GO CREATE FUNCTION rgclassifier_MAX_CPU ( ) RETURNS SYSNAME WITH SCHEMABINDING AS BEGIN DECLARE @workload_group_name SYSNAME --Handle workload groups defined by login names IF SUSER_SNAME() = 'USER_READONLY' BEGIN SET @workload_group_name = 'gMAX_CPU_PERCENT_10';--gMAX_CPU_PERCENT_10 負載組 RETURN @workload_group_name; END RETURN @workload_group_name; END -- 將分類器函數rgclassifier_MAX_CPU注冊到資源調控器 一定要加dbo架構名 不然會報錯 Alter Resource Governor With(Classifier_Function=dbo.rgclassifier_MAX_CPU); GO -- 將更改應用於資源調控器 ALTER RESOURCE GOVERNOR RECONFIGURE; GO --包含資源調控器的當前內存中配置狀態的行 SELECT * FROM SYS.[dm_resource_governor_configuration] --當前資源池狀態、資源池的當前配置以及資源池統計信息的相關信息 SELECT [pool_id], [name], [statistics_start_time], [max_cpu_percent] FROM SYS.[dm_resource_governor_resource_pools] --工作負荷組統計信息和工作負荷組當前在內存中的配置 SELECT * FROM SYS.[dm_resource_governor_workload_groups] 一個資源池可以有多個組 resource_pools有多個workload_groups 一個resource_pools只有一個workload_groups情況下dm_resource_governor_resource_pools的pool_id==sys.dm_exec_sessions的group_id --查看Session所在的資源池 select s.session_id,s.login_name ,s.program_name,s.group_id,g.name from sys.dm_exec_sessions s join sys.dm_resource_governor_workload_groups g on s.group_id=g.group_id where session_id>50 and s.group_id=256 --查看資源池情況 select * from sys.dm_resource_governor_resource_pools select * from sys.dm_resource_governor_workload_groups --查看資源池情況 select * from sys.dm_resource_governor_resource_pools select * FROM sys.dm_resource_governor_workload_groups wg INNER JOIN sys.dm_resource_governor_resource_pools rp ON [rp].[pool_id] = [wg].[pool_id] --這樣,資源資源調控器配置完成,下面進行一下測試創建一個public帳號: USE master GO CREATE LOGIN USER_READONLY WITH PASSWORD ='Nzperfect' GO --然后測試一下,執行下面的T-sql循環腳本 DECLARE @CNT INT WHILE 1=1 BEGIN SELECT @CNT=COUNT(*) FROM sys.tables END --測試結束,刪除測試 USE master GO DROP WORKLOAD GROUP gMAX_CPU_PERCENT_10 GO ALTER RESOURCE GOVERNOR RECONFIGURE; GO DROP RESOURCE POOL pMAX_CPU_PERCENT_10 GO ALTER RESOURCE GOVERNOR RECONFIGURE; GO ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION= null); GO ALTER RESOURCE GOVERNOR RECONFIGURE; GO --禁用並重置 ALTER RESOURCE GOVERNOR DISABLE; ALTER RESOURCE GOVERNOR RESET STATISTICS GO DROP FUNCTION [dbo].[rgclassifier_MAX_CPU] GO
這樣,資源資源調控器配置完成,下面進行一下測試,創建一個登錄帳號:USER_READONLY
我們用這個USER_READONLY帳號登陸SQLSERVER
在新建查詢窗口執行一下腳本
可以看到,gMAX_CPU_PERCENT_10所占用的cpu立即下降到5%左右不會超過10%,說明我們配置的配置資源調控器已生效。
由上面的測試說明,當系統資源夠用時,USER_READONLY像正常情況一下,sql server不會限制其使用的cpu資源,
但當存在資源競爭時,資源調控器將跟據配置的資源池及組信息自動調節,限制USER_READONLY使用的資源,以確保其它進程擁用更多的資源。
網上另一個流行的示例
USER_READONLY用戶和sa用戶分別調用同一個腳本,sa用戶CPU為90% USER_READONLY用戶CPU為10%
1 ------------------------------------------------------------------------ 2 3 --創建資源池 4 Create Resource Pool AdminQueries with(max_cpu_percent=10) 5 Create Resource Pool UserQueries with(max_cpu_percent=90) 6 7 --創建負載組 8 Create WorkLoad Group [sa] USING UserQueries; 9 Create WorkLoad Group USER_READONLY USING AdminQueries; 10 11 12 --創建分類器函數 13 USE master 14 GO 15 create FUNCTION class_func_load() 16 Returns sysname with schemabinding 17 begin 18 Declare @val sysname 19 --Handle workload groups defined by login names 20 IF SUSER_SNAME()='sa' 21 begin 22 SET @val='sa';--sa 負載組 23 Return @val; 24 end 25 26 IF SUSER_SNAME()='USER_READONLY' 27 begin 28 Set @val='USER_READONLY'; --USER_READONLY負載組 29 Return @val; 30 end 31 Return @val; 32 END 33 34 --將分類器函數綁定到資源調控器上 一定要加dbo架構名 不然會報錯 35 Alter Resource Governor With(Classifier_Function = [dbo].class_func_load) 36 GO 37 --啟用 38 ALTER RESOURCE GOVERNOR RECONFIGURE; 39 40 41 42 43 44 45 --測試腳本(分別使用sa和USER_READONLY用戶調用此腳本) 46 set nocount on 47 Declare @i int=100000000; 48 Declare @s varchar(100),@count int; 49 While @i>0 50 begin 51 Select @s=@@VERSION; 52 select @count=COUNT(0) from sys.sysobjects 53 set @i=@i-1; 54 end 55 56 57 --查看Session所在的資源池 58 select s.session_id,s.login_name ,s.program_name,s.group_id,g.name 59 from 60 sys.dm_exec_sessions s join sys.dm_resource_governor_workload_groups g 61 on s.group_id=g.group_id 62 where session_id>50 63 --查看資源池情況 64 select * from sys.dm_resource_governor_resource_pools 65 66 ----------------------------------------
1 --查看Session所在的資源池 2 select s.session_id,s.login_name ,s.program_name,s.group_id,g.name 3 from 4 sys.dm_exec_sessions s join sys.dm_resource_governor_workload_groups g 5 on s.group_id=g.group_id 6 where session_id>50 7 --查看資源池情況 8 select * from sys.dm_resource_governor_resource_pools
1 --測試結束,刪除測試 2 USE master 3 GO 4 --刪除負荷組 5 DROP WORKLOAD GROUP [sa] 6 DROP WORKLOAD GROUP [USER_READONLY] 7 GO 8 ALTER RESOURCE GOVERNOR RECONFIGURE; 9 GO 10 --刪除資源池 11 DROP RESOURCE POOL AdminQueries 12 DROP RESOURCE POOL UserQueries 13 GO 14 ALTER RESOURCE GOVERNOR RECONFIGURE; 15 GO 16 ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION= null); 17 GO 18 ALTER RESOURCE GOVERNOR RECONFIGURE; 19 GO 20 --禁用並重置 21 ALTER RESOURCE GOVERNOR DISABLE; 22 ALTER RESOURCE GOVERNOR RESET STATISTICS 23 GO 24 --刪除自定義函數 25 DROP FUNCTION [dbo].[class_func_load] 26 GO
介紹:
SQL2012增強了資源調控器的功能,反映了對集中管理的數據庫服務的需求不斷增長,
以便為需要隔離工作負荷的客戶提供多租戶模式。
SQLSERVER資源調控器在SQL2008 企業版引入的,用於為支持多個客戶端工作負荷的單個SQLSERVER實例提供多租戶模式和資源隔離。
通過資源調控器,您可對傳入請求可使用的內存量和CPU資源設置限制,並且他提供一個方法來隔離和限制失控查詢,
添加細粒度資源跟蹤以便用於退款和提供可預測性能。
使用SQL2012,您可為工作負荷提供更完全的CPU資源隔離,對CPU使用量設置上限以便實現更高程度的可預測性,
並且可以控制更大比例的SQLSERVER內存分配
資源池、工作負荷組和分類
SQLSERVER資源調控器引入了“資源池”概念,作為在SQL實例內實現資源隔離的基本方式
可以通過TSQL以及SMO之類的其他管理界面對資源池進行控制,並且可以通過
CREATE RESOURCE POOL和ALTER RESOURCE POOL語句向資源池分配最小和最大CPU以及內存資源
SQLSERVER2012支持最多62個用戶可定義資源池,與SQL2008中的18個相比大幅增加。
SQL2012還提供兩個內置的資源池:一個叫“內部”,他是為系統任務保留的,不可配置
一個用戶可配置的資源池叫“默認”,默認情況下在此資源池中運行工作負荷
每個用戶資源池可與一個或多個“工作負荷組”相關聯,這些工作負荷組是表示一個或多個客戶端工作負荷的邏輯實體。
傳入會話可通過在登錄后運行的用戶可定義的“分類器”函數與這些工作負荷組相關聯,並且可調用系統函數以便評估不同登錄屬性,
例如用戶名、工作站名稱,數據庫名稱等
下面是一個例子,判斷用戶名、工作站、數據庫名
1 CREATE FUNCTION rgclassifier_MAX_CPU ( ) 2 RETURNS SYSNAME 3 WITH SCHEMABINDING 4 AS 5 BEGIN 6 DECLARE @workload_group_name SYSNAME 7 --Handle workload groups defined by login names 8 IF SUSER_SNAME() = 'USER_READONLY' --用戶名是USER_READONLY 9 BEGIN 10 SET @workload_group_name = 'gMAX_CPU_PERCENT_10' 11 RETURN @workload_group_name; 12 END 13 IF HOST_ID() = 'joe' --工作站名稱是joe 14 BEGIN 15 SET @workload_group_name = 'gMAX_CPU_PERCENT_10'; 16 RETURN @workload_group_name; 17 END 18 IF DB_NAME() = 'GPOSDB' --數據庫名稱是GPOSDB 19 BEGIN 20 SET @workload_group_name = 'gMAX_CPU_PERCENT_10'; 21 RETURN @workload_group_name; 22 END 23 24 RETURN @workload_group_name; 25 END
SQL2012中的新資源調控器功能
為什麽更改資源調控器?
隨着每個插槽中CPU內核數目的增加以及大型計算機成本的降低,我們聽到了來自使用
資源調控器為客戶隔離SQL資源的SQLSERVER托管合作伙伴的意見:
“在使用每個CPU具有10個和12個內核的新型商用服務器之后,
服務器上的CPU資源大量空閑,因為我們受制於資源池的最大數目。”
想要基於SQLSERVER向客戶提供經濟合算的數據庫服務產品的主機托管服務提供商需要更為靈活地為工作負荷划分大型計算機上的可用資源,
並且盡可能減少工作負荷彼此爭用資源以及一個工作負荷對其他工作負荷使用的資源有負面影響(即所謂的擾民鄰居)等情況的發生
隨着計算機以及虛擬化軟件性能的增強,在私有化中虛擬化和管理SQLSERVER實例的數目和大小也在增加。
因此,向共享資源的用戶提供更有效的隔離變得更加重要,工作負荷需要在SQLSERVER實例內的分區資源上運行,以避免發生“擾民鄰居”問題
我們還看到了另一個趨勢,就是針對資源使用的退款情況的增加。
現在,越來越多的企業和公共托管提供商對內部資源的使用進行跟蹤和收費,而這就需要向資源的使用者提供可預測的計費
為了滿足這些需要,在SQL2012中添加了下面功能:
(1)將資源池的最大數目從20增加到64(包括默認和內部),這樣就能對更大的計算機進行分區,以便適用於更多的工作負荷。
(2)向資源池添加了CAP_CPU_PERCENT選項以便對CPU資源使用情況設置硬上限,從而提供更好的可預測性
(3)向資源池添加了AFFINITY選項,允許單獨的資源池關聯到一個或多個計划程序和NUMA節點,從而提供更好的CPU資源隔離
(4)SQLSERVER內存管理器負責調控多頁分配以及單頁分配。之所以這樣是因為SQLSERVER2012中進行了一個重大的設計改動,
內存管理器現已成為用於頁分配的中心操作系統接口。
設置資源池中的CPU容量上限
1 ALTER RESOURCE POOL pMAX_CPU_PERCENT_10 WITH (MAX_CPU_PERCENT = 10)
MAX_CPU_PERCENT設置是一種“投機性質”的最大值。如果有可用CPU容量,該工作負荷會一直用到100%。這個“最大值”僅存在CPU爭用時才適用
如果你要硬性規定設置CPU上限為10%,可以使用CAP_CPU_PERCENT屬性來設置資源池
該屬性對CPU使用率設置硬上限
1 ALTER RESOURCE POOL pMAX_CPU_PERCENT_10 WITH (CAP_CPU_PERCENT = 10) 2 GO 3 ALTER RESOURCE GOVERNOR RECONFIGURE; 4 GO
所以為什麽在示例一里出現CPU占用超過10%就是這個原因
設置了ALTER RESOURCE POOL pMAX_CPU_PERCENT_10 WITH (CAP_CPU_PERCENT = 10)之后
我在SSMS里開了7個新建查詢窗口,在性能監視器里看到CPU占用率始終保持在10%或以下
如果客戶希望專門有一個CPU內核能夠100%供他們隨時使用。他們可以使用SQL2012中的另一個新的資源調控器功能:計划程序關聯。
為了說明這個新功能,我們刪除了應用於SQLSERVER的關聯掩碼,並且讓SQLSERVER引擎使用該計算機的兩個CPU
1 EXEC [sys].[sp_configure] @configname = 'affinity mask', -- varchar(35) 2 @configvalue = 0 -- int 3 RECONFIGURE 4 GO
現在,您可以使用新資源池的AFFINITY選項將各資源池與自己的計划程序相關聯。
在此情況下,該選項會使單個CPU內核有效地用於各工作負荷
1 ALTER RESOURCE POOL AdminQueries WITH(AFFINITY SCHEDULER=(0)) 2 GO 3 ALTER RESOURCE POOL UserQueries WITH(AFFINITY SCHEDULER=(1)) 4 GO 5 ALTER RESOURCE GOVERNOR RECONFIGURE 6 GO
在您運行此代碼后,將在不同的CPU上計划工作負荷。
上面的示例說明了一些新的SQL2012資源調控器功能提供更有效的資源隔離
最佳做法
考慮應用程序資源整體消耗量
對於內存,資源調控器可以提供硬上限並且划分計算機資源。MAX_MEMORY_PERCENT資源池設置是針對內存使用率的一種有效的硬上限,
而不是“投機性質”的設置。內存調控的一個例外是緩沖池,他是共享的以便針對整體查詢性能進行優化。資源調控器當前不管理I/O,
因此,需要使用其他方法以便盡量減少與I/O有關的“擾民鄰居”問題,例如最大化內存、條帶化、隔離I/O以及
使用有效的SAN針對隨機I/O進行優化
避免在相同的CPU上共享工作負荷 在工作符號彼此爭用時,計划程序可以很容易地划分公平和類似上限的工作負荷。
如果您需要為變化非常大的工作負荷調控資源,例如,高CPU與高I/O混用,請考慮使用計划程序關聯對這些工作負荷進行划分,
而不是設置CPU最大值和上限
始終在更改CPU配置后重新配置池關聯
您將資源池與一組SQLSERVER計划程序相關聯,期望與他們隔離到特定CPU。在關閉計算機並且移除CPU后將會發生什么情況?
例如:您的SQL實例正在某一虛擬機中運行並且CPU使用率低,因此,您重新配置了虛擬機,減少了CPU數量
最好的情況是,計划程序關聯設置不再精確,因為某一個資源池關聯到的計划程序現在可能會指向不同CPU。
最糟的情況是,這些計划程序可能會指向不存在的CPU,這將導致資源調控器失敗,或者導致關聯默認為“自動”
因此,在您對CPU配置進行更改后,應該始終重新配置計划程序關聯設置並且重新啟動資源調控器
故障排除
sys.dm_resource_governor_resource_pool_ffinity
查看確切的計划程序CPU分配
我看不到SMO對象模型中定義的新的資源調控器功能 ?
如果您使用POWERSHELL或者C#來通過SMO SQLSERVER管理對象配置資源調控器,
將不能利用SQL2012中的新功能,新的SMO類在SQL2012 SP1中提供
當我在SSMS中編寫資源池定義腳本時,他不顯示新功能 ?
在SQL2012 SP1中添加了對SSMS的腳本編寫功能的增強,以便顯示CAP_CPU_PERCENT和計划程序關聯之類的
新的資源調控器功能
創建資源調控器時的一些參數
USE master GO CREATE RESOURCE POOL [rp_WebApp] WITH ( MIN_CPU_PERCENT=50, MAX_CPU_PERCENT =100, MIN_MEMORY_PERCENT =50, MAX_MEMORY_PERCENT =100 ) GO CREATE WORKLOAD GROUP [rg_WebApp] WITH ( GROUP_MAX_REQUESTS=0, IMPORTANCE=MEDIUM, REQUEST_MAX_CPU_TIME_SEC=300, REQUEST_MAX_MEMORY_GRANT_PERCENT=25, REQUEST_MEMORY_GRANT_TIMEOUT_SEC=0, MAX_DOP=0 )USING [rp_WebApp] GO CREATE RESOURCE POOL [rp_ReportApp] WITH ( MIN_CPU_PERCENT=25, MAX_CPU_PERCENT =100, MIN_MEMORY_PERCENT =25, MAX_MEMORY_PERCENT =100 ) GO CREATE WORKLOAD GROUP [rg_ReportApp] WITH ( GROUP_MAX_REQUESTS=0, IMPORTANCE=MEDIUM, REQUEST_MAX_CPU_TIME_SEC=300, REQUEST_MAX_MEMORY_GRANT_PERCENT=25, REQUEST_MEMORY_GRANT_TIMEOUT_SEC=0, MAX_DOP=0 )USING [rp_ReportApp] GO ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=[dbo].[RGClassifier] ); GO ALTER RESOURCE GOVERNOR RECONFIGURE GO
簡要說明一下:
1、 IMPORTANCE:定義工作負荷組中對請求處理的重要性,其值為LOW/MEDIUM/HIGH。
2、 GROUP_MAX_REQUESTS:定義在一個工作負荷組中最大並行執行的請求數量。
3、 MAX_DOP:在一個工作負荷組中並行請求的最大並行度。
4、 REQUEST_MAX_MEMORY_GRANT_PERCENT:對於一個工作負荷組中,一個單獨的請求能用的最大內存數。
5、 REQUEST_MAX_CPU_TIME_SEC: 對於一個工作負荷組中,一個單獨的請求可以使用的最大秒數。
6、 REQUEST_MEMORY_GRANT_TIMEOUT_SEC: 指定查詢等待內存授予(工作緩沖區內存)變為可用的最長時間(以秒為單位)。
相關文章:
http://blog.csdn.net/dba_huangzj/article/details/8792468