重點說明:本測試使用的是兩塊SSD組成的RAID1
首先,我們先來分析SQL Server的IO行為,參考網址:Choosing what SQLIO tests to Run and Automating the Tests
下面的幾點是我根據文章整理,并非完全翻譯:
1、SQL Server每個邏輯CPU上都會分配一個調度器,每個調度器上根據系統負載不同,會有多個Worker Thread,但是在同一個時刻,每個調度器上只能有一個Worker Thread處于運行狀態,即:每個邏輯CPU在同一時刻只能支配一個Worker Thread干活。也就是說:SQLIO Param.txt 文件中定義的testfile.dat 8 0×0 5000 不能超過測試服務器邏輯CPU的數目,我測試的服務器為:2物理CPU*6核心*雙線程=24邏輯CPU,即最大設置為:testfile.dat 24 0×0 5000
2、SQL Server間歇性的寫入數據,寫數據的行為由CheckPoint或者Lazy Writer(當內存有壓力的時候)完成。當二者觸發執行時,由單一的線程將內存中的臟頁寫入磁盤,因此當測試“寫”的時候,在Param.txt 中配置超過1個線程都是毫無意義的,因為這種行為在即使多個數據庫時也是串行的,(當然你可以配置線程數為2來壓榨出IO寫能力的極限)。并且,SQL Server在寫入數據的時候,大部分情況下一次性寫入32個page即256K的數據,因此你應該配置寫入的Size為256K。但是也有例外,那就是Eager Writer,該行為在將數據庫恢復模式設置為“大容量日志模式”時,最小化記錄日志時將觸發,該行為的寫入Size為8KB(或者可能是64KB)。
3、SQL Server連續不斷的進行數據讀取操作,絕大多數的讀操作是8KB為單位的,預讀的塊大小是64個page即512KB,直接讀取整個區Extent即64KB也是較為常見的,因此對于讀操作,測試8KB、64KB、512KB就可以了。
4、對于日志寫,定一個測試Size是非常困難的,因為寫入日志的大小取決于系統的負荷大小,但是一般不會超過60KB,但是對于測試,“我”建議使用8KB作為測試單位,這個大小覆蓋了Eager Writer和Log Writer。在微軟亞太博客的這篇文章中:SQL server每個日志寫(log write)究竟有多大?,我們也可以了解到,SQL Server的日志寫確實很不固定,一個簡單的commit是512byte,而負荷較高時,接近60KB,在這里,我決定擅自再使用一個接近512byte的1KB作為測試大小,并且實際上,我用PRocessMonitor在生產環境抓取了一段時間Log Writer后,絕大多數的日志寫確實在1K及以下。
5、作者的第5條認為SAN存儲,由于有巨大的緩存,并且優化了讀寫機制,所以讀寫的差距不是很大,所以建議只使用Random作為測試方式,這一點,我決定不茍同于作者,仍然按照Data和Log的讀寫特性來進行測試,隨機和順序都會照顧到。
綜上所述,根據個人知識點,測試要點總結如下:
1、我們首先建立兩個Para.txt文件,一個Thread為邏輯CPU數目24,另外一個Thread我們設置為1,對應于上圖中“使用線程數”中的內容,另外,我還將測試文件testfile.dat的大小調整為了5000M。
本次我為了避免誤差,僅使用同一組RAID1來完成這三組簇分別為4KB/8KB/64KB大小的測試。
ParamMT.txt
D:/testfile.dat 24 0x0 5000
ParamST.txt
D:/testfile.dat 1 0x0 5000
2、以下為測試腳本,我們將-o參數從1開始增加,然后以翻倍的形式,測試出IO的最大能力。
在進行下一組測試前,我們只需要將后面的寫入文件Cluster_4KB_test中的4KB全部替換為8KB或者64KB即可。echo ****** Read Tests *****echo ******random_R_8KB**********sqlio -kR -s300 -frandom -o1 -b8 -LS -BH -FparamMT.txt > Cluster_4KB_test.txttimeout /T 5sqlio -kR -s300 -frandom -o2 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kR -s300 -frandom -o4 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kR -s300 -frandom -o8 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kR -s300 -frandom -o16 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5echo ******random_R_64KB**********sqlio -kR -s300 -frandom -o1 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kR -s300 -frandom -o2 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kR -s300 -frandom -o4 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kR -s300 -frandom -o8 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kR -s300 -frandom -o16 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5echo ******random_R_512KB**********sqlio -kR -s300 -frandom -o1 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kR -s300 -frandom -o2 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kR -s300 -frandom -o4 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kR -s300 -frandom -o8 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kR -s300 -frandom -o16 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5echo ******random_W_8KB**********sqlio -kW -s300 -frandom -o1 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -frandom -o2 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -frandom -o4 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -frandom -o8 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -frandom -o16 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5echo ******random_W_256KB**********sqlio -kW -s300 -frandom -o1 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -frandom -o2 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -frandom -o4 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -frandom -o8 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -frandom -o16 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txttimeout /T 5echo ******sequential_W_1KB**********sqlio -kW -s300 -fsequential -o1 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -fsequential -o2 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -fsequential -o4 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -fsequential -o8 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -fsequential -o16 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5echo ******sequential_W_8KB**********sqlio -kW -s300 -fsequential -o1 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -fsequential -o2 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -fsequential -o4 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -fsequential -o8 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 5sqlio -kW -s300 -fsequential -o16 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txttimeout /T 53、在進行了漫長的等待后,我們終于拿齊了三個文件,用SqlioAnalyzer導出為文件,值得注意的是,導入txt文件時,報錯,只需要將”1 thread”全部替換為”1 threads”,再次導入即可。4、整理,取出每組測試最大值,所得結果如下。看到結果,我驚呆了,在盡可能模擬SQLServer IO行為的前提下,我們這組SSD組成的Raid1不再是簇為64KB時性能全面領先!
在盡可能模擬SQL Server IO行為的前提下,我們測試的兩塊SSD硬盤組成的RAID1表現出了與第一篇測試文章時不同的性能行為。
SSD的特性是不再以物理尋道的形式獲取數據,而是電子存儲芯片顆粒直接讀寫,再也沒有磁頭移動消耗的時間,并且,SSD硬盤的并發讀寫能力是建立在多線程之上的,在同一時刻的工作絕不會局限于一個顆粒之上,本例我們測試的最大線程為24(測試服務器邏輯CPU數目),也許這是制約這組SSD硬盤沒有發揮出最大功效的原因吧。即使這樣,我們仍然可以察覺出簇為64KB比4KB時是有優勢的。
如果您有不同意見,請提出,我們繼續討論。
手頭上沒有SAS硬盤的RAID,如果您有興趣,可以試一下,差別應該會更大一些。
新聞熱點
疑難解答