第二章 Disk I/O Configuration。
對于SQL Server,磁盤I/O的配置主要針對數(shù)據(jù)庫工作負載,考慮和權(quán)衡兩個點:
1. 磁盤容量VS磁盤吞吐量
一個1TB的庫放在一塊2TB的磁盤上,容量是夠了,但是磁盤吞吐量能滿足工作負載嗎?通常會使用RAID,合適的RAID級別也是容量與吞吐量權(quán)衡的一種結(jié)果。
2. 順序IO VS. 隨機I/O
數(shù)據(jù)庫日志文件操作通常是順序IO,數(shù)據(jù)文件通常隨機IO會多很多。而磁盤的順序IO性能要高于隨機IO,因為前者需要移動磁頭,后者不需要。
以工作負載不同的IO方式在存儲上對數(shù)據(jù)庫做隔離就很重要了。
選擇正確的RAID級別(Chose the right RAID level)
使用RAID的好處,通常有:1. 增強IO性能 2. 增加IO吞吐量 3. 增加單個邏輯設備的可用容量 4. 數(shù)據(jù)冗余
而選擇何種RAID級別,主要取決于工作負載的類型。像數(shù)據(jù)庫日志文件以順序?qū)憺橹?,就要考慮RAID的寫入性能,數(shù)據(jù)文件需要在讀、寫和可用容量間做權(quán)衡。
RAID 0:提供數(shù)據(jù)條帶化和高效的IO性能,但是沒有數(shù)據(jù)冗余保護,所以SQL Server一般不采用。
RAID 1: 提供完全的數(shù)據(jù)冗余保護,較低IO性能,成本較高。可以考慮放置單個的事務日志文件。如果放置多個事務日志文件,則每個日志文件的順序IO操作交織在一起,
就變成了隨機IO,性能會下降。
RAID 5(6): 提供數(shù)據(jù)冗余保護,且容量損失少,高效讀性能。但是寫性能相對較低。每次某塊數(shù)據(jù)更新時,則要重新計算和更新奇偶效驗數(shù)據(jù)。當某塊磁盤失效,整個RAID的性能會急劇下降,
因為讀取失效磁盤上的數(shù)據(jù),需要經(jīng)過效驗計算得到。RAID6是RAID5的擴展,只是存有兩份效驗數(shù)據(jù)在不同的磁盤上,但可用容量只有磁盤總量的一半且至少4塊盤。
這樣,還不如用RAID10??梢钥紤]放置讀多于寫的數(shù)據(jù)文件。
RAID10: 先組成RAID1,再用RAID1組成RAID0。容量只有磁盤總?cè)萘康囊话?,提供?shù)據(jù)冗余保護,寫入性能相對較快。最多允許每組RAID1失效一塊磁盤。
比相同數(shù)量的磁盤RAID5讀性能要慢一些。
RAID01: 先組成RAID0,再用RAID0組成RAID1。最多只允許其中一組RAID0失效。當任意一塊磁盤失效,整個RAID01也失效了。數(shù)據(jù)丟失風險高于RAID10。
除了磁盤本身的硬性性能外,還有一些很重要因素影響其性能:
1. RAID控制器的緩存大小和配置 2. RAID條帶大小 3. 分區(qū)對齊 4. NTFS格式化的文件簇大小
一定要做基準測試來確定IO子系統(tǒng)的配置正確性,不能迷戀于理論上的數(shù)據(jù)。推薦的基準測試工具SQLIO和IOmeter,推薦SQL Server壓力測試工具SQLIOSim
數(shù)據(jù)文件、日志文件和tempdb最好物理隔離。
數(shù)據(jù)文件:讀遠多于寫、只讀或者寫延遲不影響系統(tǒng)性能的情況下可置于RAID5或者RAID6.相反則可以考慮RAID10.
日志文件:可以考慮RAID1和RAID10。多個寫入頻繁的日志文件置于同一個物理磁盤上或者磁盤碎片會加劇寫入壓力。
tempdb: 它的功能決定它是寫密集型數(shù)據(jù)庫,最好與用戶庫物理隔離,置于raid1或者RAID10。當然也可以置于SSD和RAMDisk上。
可以為tempdb創(chuàng)建多個相同配置的數(shù)據(jù)文件,減少系統(tǒng)頁急用問題。
DAS VS. SAN
DAS簡單附加即可使用,性能可預估,也不需要額外經(jīng)驗維護,同時也沒有SAN的各種高級功能(如支持集群、磁盤陣列鏡像和基于陣列的復制)。相對便宜。
SAN適用于企業(yè)級存儲,相對較貴。但它是用于優(yōu)化存儲使用方式,而不一定是優(yōu)化存儲性能。
對故障診斷需要額外的存儲經(jīng)驗或者依賴于外部資源(SAN管理員或者供應商)。
診斷磁盤IO問題
兩個比較重要的性能計數(shù)器Avg. Disk sec/Read和Avg. Disk sec/Write。
一般它們的值<10ms=好,10~20ms=有點慢,20~50ms=很慢,>50ms=存在性能問題。
IO瓶頸通常還有PAGEIOLATCH_*, ASYNC_IO_COMPLETION, IO_COMPLETION, 或者 WRITELOG等待類型的嚴重等待。
常見的磁盤I/O問題
診斷磁盤問題前,一定要確認系統(tǒng)不存其它方面的瓶頸。
1. 只考慮容量而非性能
一個1TB的OLTP庫放在一塊2TB的磁盤上,容量滿足,性能通常滿足不了。SAN網(wǎng)絡和磁盤通常不會是SQL Server獨占的,SQL Server也不知道LUN是否是獨立的物理磁盤。
很多時候是與其它應用共享的,故障診斷時就要特別關(guān)注IO指標是否只是SQL Server造成的。
2. 錯誤的負載隔離
數(shù)據(jù)文件、日志文件和tempdb要物理隔離,因為IO方式大相徑庭。還要特別注意SAN分配給SQL Server的存儲單元是否與其它應用物理隔離。
3. 錯誤的分區(qū)對齊
參照Storage Area Network (SAN) for DBA's
4. 錯誤的SAN帶寬配置
不要迷戀理論值或者供應商提供的數(shù)據(jù),一定要經(jīng)過基準測試,確保SAN的性能滿足工作負載,尤其是多路SAN。
總結(jié)
對于存儲,一定要有清晰的規(guī)劃,一定要經(jīng)過測試(基準和壓力)。