上次放出了一篇文章,針對磁盤卷簇大小默認4KB和自定義64KB進行了測試,測試內容爲隨機和順序讀寫,大小爲8KB和64KB,有人以爲這並無照顧到SQL Server全部的IO使用情景。這篇測試文章,咱們就來儘量模擬一下SQL Server IO的行爲,全方位對簇大小4KB、8KB和64KB作一次驗證,注意:本次咱們增長了簇爲8KB的大小。
重點說明:本測試使用的是兩塊SSD組成的RAID1html
首先,咱們先來分析SQL Server的IO行爲,參考網址:Choosing what SQLIO tests to Run and Automating the Testssql
下面的幾點是我根據文章整理,並不是徹底翻譯:數據庫
一、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緩存
二、SQL Server間歇性的寫入數據,寫數據的行爲由CheckPoint或者Lazy Writer(當內存有壓力的時候)完成。當兩者觸發執行時,由單一的線程將內存中的髒頁寫入磁盤,所以當測試「寫」的時候,在Param.txt 中配置超過1個線程都是毫無心義的,由於這種行爲在即便多個數據庫時也是串行的,(固然你能夠配置線程數爲2來壓榨出IO寫能力的極限)。而且,SQL Server在寫入數據的時候,大部分狀況下一次性寫入32個page即256K的數據,所以你應該配置寫入的Size爲256K。可是也有例外,那就是Eager Writer,該行爲在將數據庫恢復模式設置爲「大容量日誌模式」時,最小化記錄日誌時將觸發,該行爲的寫入Size爲8KB(或者多是64KB)。服務器
三、SQL Server接二連三的進行數據讀取操做,絕大多數的讀操做是8KB爲單位的,預讀的塊大小是64個page即512KB,直接讀取整個區Extent即64KB也是較爲常見的,所以對於讀操做,測試8KB、64KB、512KB就能夠了。多線程
四、對於日誌寫,定一個測試Size是很是困難的,由於寫入日誌的大小取決於系統的負荷大小,可是通常不會超過60KB,可是對於測試,「我」建議使用8KB做爲測試單位,這個大小覆蓋了Eager Writer和Log Writer。在微軟亞太博客的這篇文章中:SQL server每一個日誌寫(log write)究竟有多大?,咱們也能夠了解到,SQL Server的日誌寫確實很不固定,一個簡單的commit是512byte,而負荷較高時,接近60KB,在這裏,我決定擅自再使用一個接近512byte的1KB做爲測試大小,而且實際上,我用ProcessMonitor在生產環境抓取了一段時間Log Writer後,絕大多數的日誌寫確實在1K及如下。併發
五、做者的第5條認爲SAN存儲,因爲有巨大的緩存,而且優化了讀寫機制,因此讀寫的差距不是很大,因此建議只使用Random做爲測試方式,這一點,我決定不苟同於做者,仍然按照Data和Log的讀寫特性來進行測試,隨機和順序都會照顧到。app
綜上所述,根據我的知識點,測試要點總結以下:dom
一、咱們首先創建兩個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
二、如下爲測試腳本,咱們將-o參數從1開始增長,而後以翻倍的形式,測試出IO的最大能力。
echo ****** Read Tests *****
echo ******random_R_8KB**********
sqlio -kR -s300 -frandom -o1 -b8 -LS -BH -FparamMT.txt > Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o2 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o4 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o8 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o16 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
echo ******random_R_64KB**********
sqlio -kR -s300 -frandom -o1 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o2 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o4 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o8 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o16 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
echo ******random_R_512KB**********
sqlio -kR -s300 -frandom -o1 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o2 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o4 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o8 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o16 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
echo ******random_W_8KB**********
sqlio -kW -s300 -frandom -o1 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o2 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o4 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o8 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o16 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
echo ******random_W_256KB**********
sqlio -kW -s300 -frandom -o1 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o2 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o4 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o8 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o16 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5
echo ******sequential_W_1KB**********
sqlio -kW -s300 -fsequential -o1 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o2 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o4 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o8 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o16 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
echo ******sequential_W_8KB**********
sqlio -kW -s300 -fsequential -o1 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o2 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o4 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o8 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o16 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
- 先說第二個直方圖,咱們能夠看到,在順序寫時,三種簇大小下幾乎是沒有差異的;
- 第一個直方圖,在隨機讀取64KB和512KB時,簇爲4KB相比其它兩種狀況是有優點的;其它讀寫狀況下,仍是簇爲8KB和64KB時佔據優點。
- 咱們上面已經說過,SQL Server的隨機讀,絕大多數仍是以8KB爲單位的,從這點來看,依然仍是簇爲8KB和64KB比簇爲4KB在全局來說,要佔據優點,而簇爲64KB比8KB的優點,是微乎其微的。
測試總結:
在儘量模擬SQL Server IO行爲的前提下,咱們測試的兩塊SSD硬盤組成的RAID1表現出了與第一篇測試文章時不一樣的性能行爲。
SSD的特性是再也不以物理尋道的形式獲取數據,而是電子存儲芯片顆粒直接讀寫,再也沒有磁頭移動消耗的時間,而且,SSD硬盤的併發讀寫能力是創建在多線程之上的,在同一時刻的工做毫不會侷限於一個顆粒之上,本例咱們測試的最大線程爲24(測試服務器邏輯CPU數目),也許這是制約這組SSD硬盤沒有發揮出最大功效的緣由吧。即便這樣,咱們仍然能夠察覺出簇爲64KB比4KB時是有優點的。
若是您有不一樣意見,請提出,咱們繼續討論。
手頭上沒有SAS硬盤的RAID,若是您有興趣,能夠試一下,差異應該會更大一些。