在今天的文章里我想談下SQL Server 2014里引入的緩存池擴展(Buffer Pool Extensions)。我們都知道,在SQL Server里,緩存池是主要的內存消耗者。當你從你存儲里讀取數據時,數據會在緩存池里緩存。SQL Server在計劃緩存里緩存執行計劃,也是緩存池的一部分。你擁有的物理內存越多,你的緩存池就會越大(通過【最大服務器內存】設置配置)。
很多SQL Server用戶會碰到數據庫服務器里物理內存受限的問題:所有內存槽都被占用了,因此你如何想給物理服務器增加額外的內存?當然,你可以遷移到更大的服務器,但那是另外一回事……這個特定問題的解決方案是SQL Server 2014里引入的緩存池擴展。在緩存池擴展的幫助下,SQL Server在內存層級里引入了另外一層。我們來看下面的圖片:
如你所見,在頂部是緩存池本身,它是非??斓模ǜ鶕憫獣r間(latency times)),在底部你會看到我們的傳統存儲,它是比較慢的。緩存池擴展剛好落戶在2者之間——傳統緩存池和我們存儲之間。緩存池苦熬占本身是包含一個簡單文件(所謂的擴展文件(Extension File)),它應該存儲在非??斓拇鎯ι?mdash;—例如SSD硬盤。擴展文件大體上和Windows系統的頁文件一樣。不用在你的數據庫服務器增加額外的物理內存,你只要配置在SSD硬盤上配置擴展——就可以了!
在我討論配置并啟用緩存池擴展前,我想簡單談下緩存池擴展的架構和背后的設計。SQL Server傳統的緩存池總是在干凈頁和臟頁間區分的。干凈頁就是內存里的內容和存儲里的內容一樣的頁。臟頁是在內存里改變的頁,但還沒有寫回到存儲。大約每分鐘所謂的檢查點(CHECKPOINT)過程會把臟頁寫回到存儲,意味著臟頁變成了干凈頁。
如果SQL Server的緩存池陷入內存壓力,緩存池擴展本身就會被使用。內存壓力指的是SQL Server需要比當前可用更多的內存。在那個情況下,緩存會從緩存池驅逐頁,那些頁是最近剛使用過的。SQL Server這里使用的是近期最少使用算法(Least Recently Used Policy (LRU))。如果現在你配置了擴展文件,SQL Server會把這些頁寫到擴展文件,而不是把它們直接寫入我們緩慢的存儲。如果頁是臟的,這些頁也會并發寫入物理存儲(通過異步I/O操作)。因此當你使用緩存池擴展時,你不會丟失任何數據。到一定時間點你的擴展文件也會完全存滿。在那個情況下SQL Server又會從擴展文件驅逐老頁(也是通過LRU算法),最后把它們寫入傳統存儲。擴展文件充當緩存池和存儲本身之間的額外一層。
現在我們來看下在SQL Server 2014里如何配置緩存池擴展。SQL Server這里提供你ALTER SERVER CONFIGURATION SET BUFFER POOL EXTENSION命令。我們來詳細看下如何使用它:
1 USE master2 GO 3 4 EXEC sp_configure 'show advanced options', 15 RECONFIGURE WITH OVERRIDE6 GO
1 ALTER SERVER CONFIGURATION2 SET BUFFER POOL EXTENSION ON3 (4 FILENAME = 'd:/ExtensionFile.BPE',5 SIZE = 1 GB6 )7 GO
這里你會碰到的第1個限制是擴展文件必須和緩存池本身一樣的大小,如果你指定了比它小的文件大小,你會從SQL Server收到如下的錯誤信息:
Msg 868, Level 16, State 1, Line 1Buffer pool extension size must be larger than the current memory allocation threshold 1596 MB. Buffer pool extension is not enabled.
下一個你肯定會碰到的限制是,在SQL Server運行期間,你不能修改擴展文件的大小。例如,當你想修改擴展文件到更大的大小,你需要停用緩存池擴展,然后再次啟用。在此操作期間,你的性能會下降,因為你剛剛停用了SQL Server一個重要的緩存層!
當你計劃為你的生產環境部署緩存池擴展時,你一定要意識到這點?。?!另外你不能縮小擴展文件的大小,文件必須要比先前的大。不然你還會收到如下的錯誤信息:
Msg 868, Level 16, State 1, Line 3Buffer pool extension size must be larger than the current memory allocation threshold 4096 MB. Buffer pool extension is not enabled.
緩存池擴展的整個配置也可以通過DMVsys.dm_os_buffer_pool_extension_configuration來查詢到。
什么時候你應該使用緩存池擴展?微軟建議在你的服務器工作負荷是少讀多寫(write-heavy)時,例如OLTP工作負荷。當你處理DWH/BI相關的工作復核時,你不應該考慮緩存池擴展——這里啟用擴展文件沒任何意義。并且當我們討論擴展文件時,你應該為它配置好非??斓腟SD!傳統旋轉硬盤(機械硬盤)就算了吧!
新聞熱點
疑難解答