詳解SQL Server 2008新特性Resource Governor
相信大家都遇到過,一個服務(wù)器上面運行多個數(shù)據(jù)庫的情況,如果1個數(shù)據(jù)庫占用資源過多,很可能直接導(dǎo)致另外一個數(shù)據(jù)庫無法處理,直到超時的情況。過去這種情況基本無法處理(當(dāng)然不排除使用三方程序處理的方法)。嘿嘿,在新的Sql Server 2008 中,就可以***的解決這個問題了。答案就是Resource Governor。
Resource Governor可以通過創(chuàng)建資源池(Resource Pool)的方式,對不同資源池分別分配服務(wù)器資源(CPU,內(nèi)存),這里設(shè)置的是,資源池最繁忙時期的分配值。簡單的說,現(xiàn)在我有兩個數(shù)據(jù)庫,DataBaseA和DataBaseB,那么我們可以創(chuàng)建兩個資源池PoolA和PoolB,給PoolA分配10%的CPU和內(nèi)存,PoolB分配90%的CPU和內(nèi)存。那么當(dāng)DataBaseA和DataBaseB都繁忙的時候,系統(tǒng)會分別分配相應(yīng)的資源給他們,讓他們都能夠完成自己的工作(當(dāng)然,性能可能有所下降,畢竟只使用10%的資源),從而避免了高并發(fā)性時,資源獨占的情況。很好吧,下面我們就通過一個實例來給大家演示一下。
1. 首先可以查看一下當(dāng)前資源池的配置情況
USE master; |
如果如上圖所示,那么說明目前沒有創(chuàng)建任何資源池。(創(chuàng)建資源池的時候需要綁定一個classifier的函數(shù),如果綁定了,會顯示函數(shù)的ObjectID)
2. 創(chuàng)建2個資源池MarketingPool和DevelopmentPool,
CREATE RESOURCE POOL MarketingPool |
MarketingPool分配了10%CPU資源,DevelopmentPool分配了90%CPU資源。(當(dāng)然你也可以加上內(nèi)存的分配,不過個人感覺一般CPU比較重要,內(nèi)存這東西不好說)
3. 可以先看一下當(dāng)前Resource Governor的配置情況
SELECT * FROM sys.dm_resource_governor_resource_pools; |
你會發(fā)現(xiàn),如上所示結(jié)果,只有兩個資源池,并且不是我們創(chuàng)建的。
internal和default資源池是系統(tǒng)默認(rèn)的資源池,如果沒有手動設(shè)置Resource Governor的話,創(chuàng)建的數(shù)據(jù)庫會被默認(rèn)放到default資源池當(dāng)中。(后面你還會看到對應(yīng)的 WORKLOAD GROUP)
為什么我們創(chuàng)建的資源池沒有看到呢?其實是我們的配置還沒有設(shè)定上去,Sql Server08的設(shè)置修改后,需要手動 RECONFIGURE 來重置配置信息。
4. RECONFIGURE RESOURCE GOVERNOR 來讓我們新建的資源池生效。
ALTER RESOURCE GOVERNOR RECONFIGURE; |
來看一下現(xiàn)在的配置信息。
你會發(fā)現(xiàn)新創(chuàng)建的MarketingPool和DevelopmentPool已經(jīng)被添加了進(jìn)去,并且max_cpu_percent為相應(yīng)的10和90。
只有Resource Pool 是沒用效果的,因為Pool下面還有下級單位,叫做 WORKLOAD GROUP , 所以接下去我們需要創(chuàng)建Group。
5. 創(chuàng)建 WORKLOAD GROUP
CREATE WORKLOAD GROUP MarketingGroup |
分別給兩個Pool創(chuàng)建對應(yīng)的 WorkLoad Group 。并且使用 Using 關(guān)鍵字綁定Group到對應(yīng)的Pool。
6. 查看WorkLoad Group 的配置信息
SELECT * FROM sys.dm_resource_governor_workload_groups; |
會發(fā)現(xiàn),和Pool中的情況相同,只有兩個Group。(就是系統(tǒng)默認(rèn)的Group,分別與默認(rèn)的Pool對應(yīng))
同樣是由于沒有ReConfigure造成的。
7. 更新配置信息
ALTER RESOURCE GOVERNOR RECONFIGURE; |
接著在查看Group信息。
新的Group已經(jīng)被添加進(jìn)去了。
8. 創(chuàng)建兩個數(shù)據(jù)庫,用來做測試
IF DB_ID ('MarketingDB') IS NULL |
9. 創(chuàng)建classifier function
IF OBJECT_ID ('dbo.MyClassifier') IS NOT NULL |
這里,Sqlserver2008對于 Resource Governor 的設(shè)計方式,很類似代理。Resource Governor 通過一個方法來綁定數(shù)據(jù)庫對象到WorkLoad Group ,這個方法需要外部給出定義,并且手動綁定到Resource Governor 上面,定義方式可以參照上面代碼。分別將兩個測試用數(shù)據(jù)庫綁定到各自的Group中,其他的數(shù)據(jù)庫綁定到Default上面。
10. 綁定Classifier Function 到Resource Governor上面。
ALTER RESOURCE GOVERNOR |
11. 更新Resource Governor 配置信息
ALTER RESOURCE GOVERNOR RECONFIGURE; |
12. 查看Resource Governor配置信息,確認(rèn)設(shè)置
SELECT * FROM sys.dm_resource_governor_configuration; |
如果如下圖所示,說明配置成功。
到這里,資源池的創(chuàng)建完成,然后使用Server2003的Performance來查看CPU的使用情況
1. 在管理工具中啟動Performance
2. 點擊Action菜單中的New WindowForm Here
3. 點擊加號添加監(jiān)視
4. 選中對應(yīng)SQL實例的Resource Governor ,并選定兩個資源池
5. 點擊Add添加2個資源池連接
目前由于沒有操作,所以占用資源為0
接下去將使用兩個循環(huán)腳本,不斷更新數(shù)據(jù)庫,來測試效果
1. 創(chuàng)建RunQueries.sql腳本,代碼如下
IF OBJECT_ID ('t1') IS NOT NULL DROP TABLE t1;
GOCREATE TABLE t1 (
c1 INT IDENTITY,
c2 VARCHAR (8000) DEFAULT (REPLICATE ('a', 8000)));
CREATE CLUSTERED INDEX t1c1 ON t1 (c1);
GOSET NOCOUNT ON;
GO
DECLARE @count INT = 0;
WHILE (@count < 1000)
BEGIN
INSERT INTO t1 DEFAULT VALUES;
SET @count += 1;
END;
WHILE (1 = 1) ALTER INDEX t1c1 ON t1 REORGANIZE;不斷更新Index以消耗資源。
2. 創(chuàng)建RunQueries2.sql腳本,代碼如下
IF OBJECT_ID ('t2') IS NOT NULL DROP TABLE t2;
GOCREATE TABLE t2 (
c1 INT IDENTITY,
c2 VARCHAR (8000) DEFAULT (REPLICATE ('a', 8000)));
CREATE CLUSTERED INDEX t2c1 ON t2 (c1);
GOSET NOCOUNT ON;
GO
DECLARE @count INT = 0;
WHILE (@count < 1000)
BEGIN
INSERT INTO t2 DEFAULT VALUES;
SET @count += 1;
END;
WHILE (1 = 1) ALTER INDEX t2c1 ON t2 REORGANIZE;與***個腳本一樣,因為測試發(fā)現(xiàn),一個腳本消耗的資源不足以體現(xiàn)出9:1效果,所以同時運行2個腳本。
3. 使用sqlcmd來運行腳本(因為是死循環(huán))
a) cd 腳本所在目錄
b) sqlcmd -S .\SQLDEV01 -d MarketingDB -iRunQueries.sql
通過sqlcmd運行腳本 –S 指定使用的SQL實例 -d 指定使用數(shù)據(jù)庫 -i 指定運行腳本
分別使用4個sqlcmd運行4分腳本,直接給出sqlcmd命令(注意替換SQL實例名稱)
sqlcmd -S .\SQLDEV01 -d MarketingDB -iRunQueries.sqlsqlcmd -S .\SQLDEV01 -d DevelopmentDB -i RunQueries.sql
sqlcmd -S .\SQLDEV01 -d MarketingDB -i RunQueries2.sql
sqlcmd -S .\SQLDEV01 -d DevelopmentDB -i RunQueries2.sql
4. 觀察Performance中曲線的變化,如下所示則操作成功
可以看到,CPU使用趨于 1:9 Resource Governor 成功應(yīng)用了
備注:
Resource Governor 能夠自動判斷資源分配比例,如果沒有競爭資源池的話,那么會分配100%資源應(yīng)用,如果競爭激烈,會按照比例分配。從而使得各個資源池中的對象都能夠使用一定的服務(wù)器資源完成自己的工作,從而可以使得我們預(yù)測系統(tǒng)的最差情況,增強(qiáng)對數(shù)據(jù)庫的管理性。
【編輯推薦】