在SQLServer2008中引入了ResourceGovernor,通過對一些語句的CPU和內(nèi)存的資源限制瞻性的對多租戶的數(shù)據(jù)庫環(huán)境進(jìn)行有效管理。這個特性允許客戶實(shí)現(xiàn)數(shù)據(jù)庫的整合或者把數(shù)據(jù)庫配置為服務(wù)管理。但是隨著虛擬化和云技術(shù)的發(fā)展,IO的控制成為一個難題。在SQLServer2014中,我們根據(jù)客戶的請求,增加了對IO資源的控制來解決客戶遇到的問題。
在SQLServer2008中引入了ResourceGovernor,通過對一些語句的CPU和內(nèi)存的資源限制瞻性的對多租戶的數(shù)據(jù)庫環(huán)境進(jìn)行有效管理。這個特性允許客戶實(shí)現(xiàn)數(shù)據(jù)庫的整合或者把數(shù)據(jù)庫配置為服務(wù)管理。但是隨著虛擬化和云技術(shù)的發(fā)展,IO的控制成為一個難題。在SQLServer2014中,我們根據(jù)客戶的請求,增加了對IO資源的控制來解決客戶遇到的問題。
新特性:
如何使用:
讓我們以下面的場景為例說明如何使用IO資源治理在一個SQL服務(wù)器實(shí)例上控制資源。
假設(shè)我們有一臺數(shù)據(jù)庫主機(jī)或者運(yùn)行在私有云上的整合數(shù)據(jù)庫,我們需要根據(jù)多個客戶的要求放多個數(shù)據(jù)庫,這樣可以實(shí)現(xiàn)資源的有效利用同時節(jié)省成本。如果客戶的一個數(shù)據(jù)庫運(yùn)行IO密集型的工作負(fù)載,這樣會導(dǎo)致整個磁盤的IO性能,從而影響其他用戶的操作。
***個我們會為每個客戶/數(shù)據(jù)庫創(chuàng)建一個資源池和一個可以將客戶會話映射到對應(yīng)資源池的分類器函數(shù)。例如,會話為客戶1可以被映射到資源池1,會話為客戶2到資源池2。
如果你想使用IO資源治理,重要的是對每一個資源池設(shè)定最小或大IOPS,以便IO請求定向到治理子系統(tǒng)。在下面的例子中,我們對每個資源池都設(shè)置MAX_IOPS_PER_VOLUME:
--Create2resourcepools&2workloadgroups.
CREATERESOURCEPOOLCustomer1Pool;
CREATERESOURCEPOOLCustomer2Pool;
GO
CREATEWORKLOADGROUPCustomer1GroupUSINGCustomer1Pool;
CREATEWORKLOADGROUPCustomer2GroupUSINGCustomer2Pool;
GO
--Createclassifierfunction
CREATEFUNCTIONfnUserClassifier()
RETURNSSYSNAME
WITHSCHEMABINDING
AS
BEGIN
IFORIGINAL_DB_NAME()='Customer1DB'
BEGIN
RETURN'Customer1Group'
END
IFORIGINAL_DB_NAME()='Customer2DB'
BEGIN
RETURN'Customer2Group'
END
RETURN'default'
END;
GO
--SettheclassifierfunctionandenableRG.
ALTERRESOURCEGOVERNORWITH(CLASSIFIER_FUNCTION=dbo.fnUserClassifier);
ALTERRESOURCEGOVERNORRECONFIGURE;
GO
--SetdefaultvaluesfortheresourcepoolssothatIORGisenabled.
ALTERRESOURCEPOOLCustomer1PoolWITH(MIN_IOPS_PER_VOLUME=0,MAX_IOPS_PER_VOLUME=2147483647);
ALTERRESOURCEPOOLCustomer2PoolWITH(MIN_IOPS_PER_VOLUME=0,MAX_IOPS_PER_VOLUME=2147483647);
ALTERRESOURCEGOVERNORRECONFIGURE;
GO
將每個工作負(fù)載分類到不同的資源池有助于我們根據(jù)每個用戶的使用情況配置資源限制,同時可以監(jiān)控用戶的工作復(fù)雜。下面的圖(性能監(jiān)視器)表明由于客戶1的大量IO請求導(dǎo)致了客戶2的性能下降:

為了保護(hù)客戶2的性能不受其他客戶的影響,我們對客戶2的資源池設(shè)置MIN_IOPS_PER_VOLUME。從上面的圖表,看起來,系統(tǒng)可以處理大約1300IOPS,所以我們決定保留650IOPS給客戶2:
ALTERRESOURCEPOOLCustomer2PoolWITH(MIN_IOPS_PER_VOLUME=650);
ALTERRESOURCEGOVERNORRECONFIGURE;
GO
通過這個配置,SQLServer將會限制其他資源池的負(fù)載,從而滿足650IOPS給客戶2.下面的圖中,我們可以看到系統(tǒng)的IOPS被公平的分配到客戶,客戶2的性能沒有受其他客戶的影響。

MIN_IOPS_PER_VOLUMEsetting雖然可以讓資源池保留資源,但是不會限制***的IOPS.這就意味著性能仍然會根據(jù)其他客戶的使用情況變化,無法獲得穩(wěn)定性能。為了避免這個問題,保證可預(yù)測的性能,我們需要對每個客戶設(shè)置MAX_IOPS_PER_VOLUME。這將對客戶設(shè)置***的工作負(fù)載限制,一方面可以達(dá)到預(yù)測的性能,同時還會保護(hù)其他的客戶性能不受影響:
ALTERRESOURCEPOOLCustomer2PoolWITH(MAX_IOPS_PER_VOLUME=750)
ALTERRESOURCEGOVERNORRECONFIGURE
GO
通過對IO資源池的資源設(shè)定,我們可以控制每個客戶需要的資源。這可以保證性能不會受其他客戶的影響,同時也可以基于用戶的資源請求設(shè)定不同的SLA或者數(shù)據(jù)庫服務(wù)。
另一個場景是可以將OLTP工作負(fù)載與維護(hù)操作進(jìn)行隔離。比如重建索引是一種常見的操作,因?yàn)橐獟呙枵麄€索引或者表,會導(dǎo)致大量的IO請求。通過使用IO資源治理我們可以限制這些操作的IO復(fù)雜,從而保證OLTP的并發(fā)和性能不受影響。
可以提供下載downloadingtheSQLServer2014CTP2測試這個功能。
原文來自:http://blogs.technet.com/b/dataplatforminsider/archive/2013/11/07/io-resource-governance-in-sql-server-2014.aspx
譯文鏈接:http://lzf328.blog.51cto.com/1196996/1324689