在與朋友們聊到怎么讓SQL Server的性能更好時(shí),發(fā)現(xiàn)一些問(wèn)題。對(duì)于SQL Server,除了遵循OS和應(yīng)用程序的最佳實(shí)踐外,還有哪些優(yōu)化方法?
硬件級(jí)別的優(yōu)化同樣也很重要,特別是存儲(chǔ)的優(yōu)化。聊完這些,我們開(kāi)始從DBA的角度去解釋SAN的問(wèn)題。
有許多的因素影響著磁盤的IO性能,比如共用或?qū)S么疟P,RAID級(jí)別,總線速度,HBA的配置等。還有一個(gè)重要的但經(jīng)常被忽略的因素:磁盤分區(qū)對(duì)齊(alignment in disk partitions).
還有一些非磁盤因素,也可能出現(xiàn)瓶頸:
-HBA和網(wǎng)卡
-FC的處理能力和iSCSI端口
-服務(wù)器和存儲(chǔ)的路徑數(shù)
-交換機(jī)
了解和考慮架構(gòu)中相關(guān)組件的限制是非常重要的。下面是目前市場(chǎng)止一些組件的限制:
但是這些是怎么跟SQL Server聯(lián)系起來(lái)的呢?
SQL Server中數(shù)據(jù)存儲(chǔ)的基本單元是頁(yè)(Page 8kb).分配給數(shù)據(jù)庫(kù)中數(shù)據(jù)文件(無(wú)論mdf或ldf)的空間,邏輯上被分為連續(xù)的,從0到N編號(hào)的頁(yè)。磁盤IO操作以頁(yè)的方式實(shí)現(xiàn)。
硬盤由一些薄片(Platter)組成。在薄片表面的的圓型磁盤(Disk)是存儲(chǔ)信息的電子媒體。薄片的每一面上有數(shù)以千計(jì)的磁道(Tracks)。薄片具有相同直徑的磁道組成了磁柱(Cylinder)。
對(duì)于新出的設(shè)備,磁柱沒(méi)有什么意義,因?yàn)樗麄儾⒉灰酝膱A排列。但是這對(duì)于理解術(shù)語(yǔ)的來(lái)龍去脈還是有幫助的。
每個(gè)磁盤表面有一個(gè)專門的頭(Head)用于IO。磁道被分為扇區(qū)(Sector).扇區(qū)是磁盤讀寫(xiě)的最小片段。新出的設(shè)備能夠提供1kb,3kb或4kb的扇區(qū)。
使用RAID技術(shù),數(shù)據(jù)通過(guò)一組物理磁盤被條帶化。這種數(shù)據(jù)分布的方與操作系統(tǒng)請(qǐng)求數(shù)據(jù)的方式是相輔相成的。
在后續(xù)數(shù)據(jù)存儲(chǔ)在陣列中下一個(gè)磁盤前,數(shù)據(jù)存儲(chǔ)在陣列中當(dāng)前磁盤的粒度,叫做條帶化單元大小(stripe-unit size)。(譯者:這比較繞口,簡(jiǎn)單來(lái)說(shuō)就是數(shù)據(jù)經(jīng)過(guò)條帶化后,分成多個(gè)小塊存儲(chǔ)在陣列的磁盤上。這個(gè)“塊”就叫條帶單元,它大小就叫條帶單元大小。)從陣列中第一個(gè)磁盤到最后一個(gè)磁盤的條帶單元的集合稱為一個(gè)條帶(Stripe)。
這就是分區(qū)對(duì)齊嗎?這影響SQL Server的性能嗎?下面的圖示將會(huì)解釋這些。
覆蓋著紅色梯度線的黑色虛線代表一組陣列中單個(gè)磁盤的邊界。Windows Server2008之前的Windows版本,保留63個(gè)扇區(qū)用于記錄磁盤硬件的信息,接下來(lái)分區(qū)中其它的可供用戶使用。
如圖所示,一般的扇區(qū)大小為512 bytes,圖中的條帶單元大小為64kb,NTFS的默認(rèn)簇(Cluster)大小為4kb。(譯者:簇就是一組扇區(qū)的集合,也是磁盤上分配存儲(chǔ)空間的最小單位)
缺少磁盤對(duì)齊將迫使第八個(gè)用戶數(shù)據(jù)的簇跨越兩個(gè)條帶單元。從第一個(gè)條帶單元的最后的一個(gè)空白扇區(qū)直到第二條帶單元。這種情況會(huì)延續(xù)整個(gè)分區(qū)的余下部分。因?yàn)槊康贜個(gè)跨越兩個(gè)條帶單元的簇執(zhí)行一次讀或?qū)憣?huì)導(dǎo)致兩次IO。
建議用于SQL Server的文件分配單元大小(即簇大小)為64kb。SQL Server首選的64kb的簇大小造成了默認(rèn)分區(qū)錯(cuò)位,迫使用戶數(shù)據(jù)簇跨越兩個(gè)條帶單元。從第一個(gè)條帶單元的第一個(gè)可用扇區(qū)開(kāi)始,直到第二個(gè)條帶單元。這種情會(huì)延續(xù)整個(gè)分區(qū)的余下部分。這種配置注定了后續(xù)每一個(gè)用戶數(shù)據(jù)簇的讀寫(xiě),會(huì)跨越兩個(gè)磁道或者條帶單元。
下面是我們的一個(gè)測(cè)試磁盤性能的實(shí)驗(yàn)數(shù)據(jù),基于Windows Server2003&SQL Server 2005。通過(guò)運(yùn)行一個(gè)查詢從SQL Server獲取信息。每次都會(huì)執(zhí)行DBCC DROPCLEANBUFFERS清理緩存區(qū)高速緩存(Buffer Cache),用以保證結(jié)果可信。我們監(jiān)控了用于度量磁盤延遲的性能計(jì)數(shù)器Avg.Disk Transfer/Sec。結(jié)果表明,磁盤對(duì)齊的Duration和Latency性能有明顯提升,提升超過(guò)30%。
為了檢驗(yàn)磁盤對(duì)齊,您需要清楚以下幾個(gè)概念:
分區(qū)起始偏移量(Starting Partition Offset):卷中分區(qū)起始偏移量用于確定在早期卷中分配默認(rèn)數(shù)據(jù)頁(yè)給隱藏扇區(qū)。
條帶單元大小(Stripe Unit Size):在后續(xù)數(shù)據(jù)存儲(chǔ)在陣列中下一個(gè)磁盤前,數(shù)據(jù)存儲(chǔ)在陣列中當(dāng)前磁盤的粒度。這個(gè)由SAN管理員提供。
文件分配單元大小(File Allocation Unit Size):就是傳說(shuō)中的簇大小。分配磁盤空間的最小單元。此值在OS格式化分區(qū)時(shí)確定。
為了正確的磁盤分區(qū),需要遵守兩個(gè)規(guī)則:下面的兩個(gè)計(jì)算結(jié)果需是整數(shù)值。
Partition_Offset / Stripe_Unit_Size
Stripe_Unit_Size / File_Allocation_Unit_size
前面兩條中的第一條對(duì)性能優(yōu)化非常重要。
磁盤未對(duì)齊示例場(chǎng)景:
某個(gè)磁盤的分區(qū)起始偏移量為32256bytes(31.5Kb),條帶單元大小為65536bytes(64Kb)。Partition_Offset/Stripe_Unit_Size=0.4921875,不是整數(shù),所以磁盤是未對(duì)齊的。
磁盤對(duì)齊示例場(chǎng)景:
某個(gè)磁盤的分區(qū)起始偏移量為1048576bytes(1Mb),條帶單元大小為65536bytes(64Kb)。Partition_Offset/Stripe_Unit_Size=8,是整數(shù),所以磁盤是對(duì)齊的。
經(jīng)過(guò)以上的闡述,現(xiàn)在需要解答的問(wèn)題是:怎么知道磁盤的對(duì)齊狀態(tài)呢?
我們可以使用WMIC命令獲取一個(gè)磁盤的偏移量的信息,語(yǔ)法如下:
wmic partition get BlockSize, BootPartition, DeviceID, DiskIndex, HiddenSectors, NumberOfBlocks, StartingOffset, Name, Index
這個(gè)命令可以檢查SaartingOffset的值。也可以通過(guò)DISKPART獲知StartingOffset,選定你要分析的磁盤執(zhí)行l(wèi)ist partition命令就可以知首o(hù)ffset了。檢查動(dòng)態(tài)磁盤的Offset,需要使用打開(kāi)-v開(kāi)關(guān)的dmdiag工具。
如果可以使用下面的命令檢查文件分配單元大小:
fsutil fsinfo ntfsinfo [drive]
下面的圖片展示了上面所有的命令:
總結(jié)
很多方面共同作用才能讓磁盤發(fā)揮最佳性能。在Windows 2003上創(chuàng)建磁盤分區(qū)應(yīng)嚴(yán)格驗(yàn)證條帶單元大小和簇大小的正確關(guān)系,并做為最佳實(shí)踐。Windows 2008創(chuàng)建分區(qū)時(shí)默認(rèn)對(duì)齊。
服務(wù)器從Windows 2003更新為2008,已經(jīng)存在的分區(qū)不會(huì)自動(dòng)對(duì)齊,而需要重建以最佳化性能。
----------------------------------------------------------------------------------------------------------------
Joe.TJ翻譯整理,原文地址:Storage Area Network (SAN) for DBA's
---------------------------------------------------------------------------------------------------------------
我的總結(jié):
1. 原文好多地方摘抄引用了Disk Partition Alignment Best Practices for SQL Server。
2. 我是在找SAN相關(guān)資源時(shí)看到此文的,看完后發(fā)現(xiàn)沒(méi)有什么關(guān)于SAN的內(nèi)容,有標(biāo)題黨的嫌疑。但是對(duì)存儲(chǔ)的介紹很有意義就翻譯了出來(lái)。
3. 文中的“缺少磁盤對(duì)齊將迫使第八個(gè)用戶數(shù)據(jù)的簇跨越兩個(gè)條帶單元?!保@是對(duì)原文的翻譯并且對(duì)參照了Disk Partition Alignment Best Practices for SQL Server。
我個(gè)人對(duì)這點(diǎn)很是不解。64kb的條帶單元=128扇區(qū),減去隱藏的63個(gè)扇區(qū),還有65個(gè)扇區(qū)供用戶使用。每個(gè)用戶數(shù)據(jù)簇4kb=8扇區(qū),那么8個(gè)用戶數(shù)據(jù)簇=64扇區(qū)。
65-64=1,所以應(yīng)該是第9個(gè)用戶數(shù)據(jù)簇才是跨越兩個(gè)條帶單元的,而不是第8個(gè)。
聯(lián)系客服