我們在伺服器和儲存做raid的時候,常常說做了raid後磁碟的IO會提升很多,資料會條帶化寫入。那麼,到底什麼是條帶化呢? ? ?

條帶(strip)是把連續的資料分割成相同大小的資料區塊,把每段資料分別寫入到陣列中的不同磁碟上的方法。
簡單的說,條帶是一種將多個磁碟機合併為一個磁碟區的方法。 許多情況下,這是透過硬體控制器來完成的。
當多個進程同時存取一個磁碟時,可能會出現磁碟衝突。
大多數磁碟系統都對存取次數(每秒的 I/O 操作,IOPS)和資料傳輸速率(每秒傳輸的資料量,TPS)有限制。
當達到這些限制時,後面需要存取磁碟的進程就需要等待,這時就是所謂的磁碟衝突。
避免磁碟衝突是最佳化 I/O 效能的重要目標,而 I/O 效能的最佳化與其他資源(如CPU和記憶體)的最佳化有著很大的差異 ,I/O 最佳化最有效的手段是將 I/O 最大限度的進行平衡。
條帶化技術是一種自動的將 I/O 的負載平衡到多個實體磁碟上的技術,條帶化技術就是將一塊連續的資料分成很多小部分並把他們分別儲存到不同磁碟上去。
這就能使多個進程同時存取資料的多個不同部分而不會造成磁碟衝突,而且在需要對這種資料進行順序存取的時候可以獲得最大程度上的 I/O 並行能力,從而獲得非常好的效能。
由於條帶化在 I/O 效能問題上的優越表現,以至於在應用系統所在的運算環境中的多個層次或平台都涉及了條帶化的技術,如作業系統和儲存系統這兩個層次中都可能使用條帶化技術。
條帶化後,條帶磁碟所能提供的速度比單一碟所能提供的速度要快很多,由於現在儲存技術成熟,大多數系統都採用條帶化來實現系統的I/O負載 分擔,如果OS有LVM軟體或硬體條帶設備,決定因素是條帶深度(stripe depth)和條帶寬度(stripe width)。
條帶深度指的是條帶的大小,也叫條帶大小。
有時也被叫做block size, chunk size, stripe length 或granularity。這個參數指的是寫在每塊磁碟上的條帶資料塊的大小。
RAID的資料塊大小一般在2KB到512KB之間(或更大),其數值是2 的次方,即2KB,4KB,8KB,16KB這樣。
條帶大小對效能的影響比條帶寬度難以量化的多。
·減小條帶大小: 由於條帶大小減小了,則檔案被分成了更多個,更小的資料塊。
這些資料塊會分散到更多的硬碟上存儲,因此提高了傳輸的效能,但是由於要多次尋找不同的資料區塊,磁碟定位的效能就下降了。 ·增加條帶大小: 與減少條帶大小相反,會降低傳輸效能,提高定位效能。 根據上邊的論述,我們會發現根據不同的應用類型,不同的性能需求,不同驅動器的不同特點(如SSD硬碟),不存在一個普遍適用的”最佳條帶大小”。
所以這也是儲存廠家,檔案系統編寫者允許我們自己定義條帶大小的原因。
條帶寬度是指同時可以並發讀或寫的條帶數量。這個數量等於RAID中的實體硬碟數量。
例如一個經過條帶化的,具有4塊實體硬碟的陣列的條帶寬度就是 4。增加條帶寬度,可以增加陣列的讀寫效能。
道理很明顯,增加更多的硬碟,也就增加了可以同時並發讀或寫的條帶數量。
在其他條件一樣的前提下,一個由8塊 18G硬碟組成的陣列相比一個由4塊36G硬碟組成的陣列具有更高的傳輸性能。
下面先看下影響IO大小的作業系統和Oracle的相關參數:db_block_size oracle資料區塊的大小,也決定了oracle一次單一IO請求中oracle資料區塊的大小db_file_multiblock_read_count:在多資料區塊讀取時,一次讀取資料區塊的數量,它和參數db_block_size一起決定了一個多資料區塊讀的大小作業系統的資料塊大小:這個參數決定了Redo Log和Archive Log操作時的資料塊大小,對於大多數Unix系統來說,該值為512K。
最大作業系統IO大小:決定了一次單一的IO操作的IO大小的上限,對於大多數Unix系統來說,由參數max_io_size設定。
sort_area_size:記憶體中sort area的大小,也決定了並發排序操作時的IO大小。
hash_area_size:記憶體中hash area的大小,也決定了哈希操作的IO大小。在OLTP系統中,會存在大量小的並發的IO請求。
這時就需要考慮選擇比較大的條帶深度。
使條帶深度大於IO大小就稱為粗粒度條帶(Coarse Grain Striping)。在高並行度系統中,條帶深度為(n * db_block_size),其中n為大於1的整數。
透過粗粒度條帶能實現最大的IO吞吐量(一次物理IO可以同時回應多個並發的邏輯IO)。
大的條帶深度能夠使像全表掃描那樣的多資料塊讀取操作由一個磁碟驅動來回應,並提高多資料塊讀取操作的效能。
在低併發度的DSS系統中,由於IO請求比較序列化,為了避免出現熱點磁碟,我們需要避免邏輯IO只有一塊磁碟處理。
這是,粗粒度條帶就不適合了。
我們選擇小的條帶深度,使一個邏輯IO分散到多個磁碟上,從而實現IO的負載平衡。
這就叫做細粒度條帶。條帶深度的大小為(n * db_block_size),其中n為小於多資料區塊讀取參數(db_file_multiblock_read_count)大小的整數。可以簡單地理解為並發程度高的IO採用粗粒度條帶化,並發程度低的IO採用細粒度條帶化。
在IO過程中,你無法保證Oracle資料塊的邊界能和條帶單元的大小對齊。如果條帶深度大小和Oracle資料塊大小完全相同,而它們的邊界沒有對齊的話,那麼就會存在大量一個單獨的IO請求被兩塊磁碟來完成。
在OLTP系統中,為了避免一個邏輯IO請求被多個物理IO操作完成,條帶寬度就需要設定為兩倍或兩倍以上於Oracle資料塊大小。例如,如果條帶深度是IO大小的N倍,對於大量並發IO請求,我們可以保證最少有(N-1)/ N的請求是由一塊磁碟來完成。


