SQLServer資源調控器--自由分配您的資源

SQLServer資源調控器--自由分配您的資源

http://www.cnblogs.com/fygh/archive/2012/05/07/2489190.html 

    很早之前就有朋友問過我,能否按業務的優先等級分配SQLServer的資源,使得不同的應用能得到不同的響應,SQLServer2008之前對這個需求貌似沒有什麼

解決方法,不過從SQLServer2008開始,這個需求就變得很簡單了,SQLServer直接就爲我們提供了按用戶的要求分配資源的能力,下面我們就來介紹這個功能。

 

    SQLServer資源調控器分成三個部分:資源池、負載組和分類器函數;資源池爲我們提供了將資源(CPU、Memory等)劃分到不同的載體中,負載組承載負載並

將這些負載映射到資源池,分類器函數將不同的會話映射到不同的負載組中。

 

資源池:

 08提供了兩種預先定義好的資源池

 內部池:內部池只用於SQLServer數據庫引擎,系統管理員不能改變和設置;

 默認池:默認池用於沒有分配資源池的各種負載,因此,如果你不指定資源調控器,全部負載將使用默認池。默認池也不能改變或刪除,但是可以修改它的資源上

            下限。

 資源池上下限要求:

    各個資源池的下限之和不能超過100%,因爲SQLServer會盡力滿足每個下限;

    上限可以設置爲下限和100%之間的任意值。


以下是關於資源池的基本操作:

--創建資源池
Create Resource Pool UserQueries with(max_cpu_percent=100) --刪除資源池
drop Resource Pool UserQueries

 

負載組:

     負載組可以讓管理員輕鬆地監控資源使用情況,在不同的資源池之間移動某類負載。

     負載組被映射到資源池上,一個資源池可以有零個或更多負載組,一個負載組爲一組用戶會話提供一個桶。

--創建負載組
Create WorkLoad Group DailyExecReports USING UserQueries;

--刪除負載組
drop WorkLoad Group DailyExecReports

 

分類器函數:

     分類器函數將接入的會話分類,併爲會話的請求和查詢分配一個負載組。你可以根據連接串中的任意屬性(IP地址/應用程序名、用戶名等)分別分配組。

按以下條件分配組:

  •   一個用戶接入並使用SAP_Login登錄名,則爲他分配SAPUsers負載組;
  •   一個用戶接入程序名是SSMS,則讓它成爲AdhocAdmin負載組的一員;
  •   一個用戶是ReportUsers組一員,則讓它成爲DaliyExecReports負載組一員;
  •   一個用戶以共享內存連接,並在NightlyAdmin用戶組中,則分配NightlyMaintanceTask組。
複製代碼
--創建資源池
Create Resource Pool AdminQueries with(max_cpu_percent=100)
Create Resource Pool UserQueries with(max_cpu_percent=100)

--創建負載組
Create WorkLoad Group NightlyMaintenanceTasks USING AdminQueries;
Create WorkLoad Group AdhocAdmin USING AdminQueries;
Create WorkLoad Group SAPUsers USING UserQueries;
Create WorkLoad Group DailyExecReports USING UserQueries;

--創建分類器函數
    USE master
    GO
    create FUNCTION class_func_1()
    Returns sysname with schemabinding
    begin
      Declare @val sysname
      --Handle workload groups defined by login names
      IF SUSER_SNAME()='SAP_Login'
        begin
          SET @val='SAPUsers';
          Return @val;
        end
        
      IF APP_NAME() like 'Microsoft SQL Server Management Studio%'
        begin
          Set @val='AdhocAdmin';
          Return @val;
        end
      
      IF IS_MEMBER('ReportUsers')=1
        begin
          Set @val='DailyExecReports';
          Return @val;
        end
        
      IF CONNECTIONPROPERTY('net_transport')='Shared memory' and IS_MEMBER('NightlyAdmin')=1
        begin
          Set @val='NightlyMaintenanceTasks';
          Return @val;
        end
        
      Return @val;
    end
複製代碼

綁定分類器函數:

--將分類器函數綁定到資源調控器上
  Alter Resource Governor With(Classifier_Function=dbo.class_func_1);

啓用和禁用分類器函數:

--啓用
 ALter Resource Governor Reconfigure;
--禁用
 ALTER RESOURCE GOVERNOR DISABLE;

 

測試:

現在我們分別使用SAP_Login和sysadmin用戶調用此腳本

複製代碼
--測試腳本(分別使用SAP_Login和sysadmin用戶調用此腳本)
  set nocount on 
  Declare @i int=100000000;
  Declare @s varchar(100),@count int;
   While @i>0
   begin
    Select @s=@@VERSION;
    select @count=COUNT(0) from sys.sysobjects 
    set @i=@i-1;
   end
複製代碼

 

通過性能計數器查看資源分配:

 我們可以選擇性能計數器的資源統計:SQL Server:Resource Pools Stats;

 我們先將資源池按一比一的比例分配:

Create Resource Pool AdminQueries with(max_cpu_percent=100)
Create Resource Pool UserQueries with(max_cpu_percent=100)

 運行測試腳本,顯示的CPU利用率圖如下

 現在將資源分配做如下調整:

Create Resource Pool AdminQueries with(max_cpu_percent=10)
Create Resource Pool UserQueries with(max_cpu_percent=90)

 再次運行測試腳本,顯示的CPU利用率圖如下

可以看到,當我們調整資源後,兩個Session中運行同樣的腳本,它們所使用的資源差別很大,這樣就達到了根據不同的應用分配不同的資源的目的。

 

DMV查看資源池:

--查看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
--查看資源池情況
    select * from sys.dm_resource_governor_resource_pools

可以看到,我們創建的兩個資源池(還有兩個是系統資源池和默認資源池),而且不同的Session對應到了不同的資源池中。

 

發佈了62 篇原創文章 · 獲贊 6 · 訪問量 49萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章