關於組RAID時的條帶寬度及條帶深度

以前一直爲RAID到底應該如何組織數據的物理存儲結構而疑惑。
現在終於知道,一般情況下用RAID5即可,少數要求高的上RAID10。
不過,在看書的時候,發現對於條帶的解釋不太清楚。度娘了一下,這貼出來給大家分享。

條帶(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硬盤組成的陣列具有更高的傳輸性能。



在操作系統的層次中,我們可以使用軟件條帶(如 LVM LV 的條帶來實現條帶化技術)或硬件條帶(如各種 RAID)。在存儲系統層次中,目前市場上絕大部分產品都提供了各種各樣的條帶技術(如各種 RAID)。

條帶化的設置

當使用 LVM 或者硬件條帶化時,決定條帶化效果的因素是條帶深度(stripe depth)和條帶寬度(stripe width):

  • 條帶深度指的是條帶塊的大小,也叫條帶單元;

  • 條帶寬度指的是條帶深度的產量或者一個條帶分佈的驅動數;

需要根據系統的 I/O 要求來合理的選擇這些設置。對於數據庫系統來說,比較合理的條帶深度是從 256K 1M 。下面分析一下條帶深度和條帶寬度的影響因素。

條帶深度

爲了提高 I/O 效率,一次邏輯 I/O 請求轉化成物理 I/O 請求後,應該讓這些物理 I/O 分佈到最多的物理磁盤上去,也就是每個物理磁盤處理的物理 I/O 最少,最好只有一次 , 因而影響條帶的一個重要因素就是一次邏輯 I/O 請求的大小。

此外,系統中 I/O 的併發度不同我們對條帶的配置要求也不同。例如,在高併發度且邏輯 I/O 請求的大小都比較小的情況下,我們希望一塊磁盤能同時響應多個 I/O 請求;而在那些存在大的邏輯 I/O 請求的低併發度系統中,我們可能就需要多塊磁盤同時響應一個 I/O 請求。無論是一個磁盤還是多個磁盤響應 I/O 請求,我們的一個原則是讓一次邏輯 I/O 能被物理設備一次處理完成。

條帶寬度

正如我們前面所述,無論是一個還是多個磁盤響應一個邏輯 I/O,我們都希望物理設備只處理一次 I/O 。因而在確定了條帶深度的基礎上,我們需要保證條帶寬度 >= I/O 請求的大小 / 條帶深度。這樣就能最大程度的保證 I/O 請求的併發處理能力了。

此外,考慮到以後系統容量的擴充,我們也需要規劃好條帶寬度。

 

 

DB2 中合理規劃和設置條帶相關參數

下面先看下影響 I/O 性能 DB2 數據庫的相關參數:

  • 頁大小(page size):DB2 中的數據頁大小,也決定了 DB2 一次單個 I/O 請求中的數據塊的大小;

  • 預讀大小(prefetch size):在預取讀時,一次讀取數據塊的數量不能大於操作系統的最大 I/O 大小(oracle 中是參數 block size);

  • 排序堆(sortheap)和排序堆閾值(sheapthres :內存中 sort 區域的大小,也決定了併發排序操作時的 I/O 大小;

其中,前面兩個是最關鍵的兩個參數。

DB2 的數據頁大小是在創建數據庫的時候指定的,並且不能被動態的修改。它決定了在 DB2 中所有的表空間默認的頁大小。但是我們在創建每個表空間的時候還可以根據數據存儲的需要單獨指定頁的大小。

OLTP 系統中,會存在大量小的併發的 I/O 請求。這時就需要考慮選擇比較大的條帶深度。使條帶深度大於 I/O 大小就稱爲粗粒度條帶(Coarse Grain Striping)。在高並行度系統中,條帶深度爲(n * page size),其中 n 爲大於 1 的整數。通過粗粒度條帶能實現最大的 I/O 吞吐量(一次物理 I/O 可以同時響應多個併發的邏輯 I/O)。大的條帶深度能夠使像全表掃描那樣的預取讀操作由一個磁盤驅動來響應,並提高預取讀操作的性能。在 OLTP 系統中,爲了避免一個邏輯 I/O 請求被多個物理 I/O 操作完成,條帶深度就需要設置爲兩倍或者兩倍以上於 DB2 頁大小。例如,如果條帶深度是物理 I/O 大小的 N 倍,對於大量併發 I/O 請求,我們可以保證最少有(N-1/ N 的請求是由一塊磁盤來完成。

在低併發度的 DSS 系統中,由於 I/O 請求一般是序列化的,爲了避免出現 I/O 集中的熱點磁盤,我們需要避免邏輯 I/O 只有一塊磁盤處理。這時粗粒度條帶就不適合了。我們應該選擇小的條帶深度,使一個邏輯 I/O 分佈到多個磁盤上,從而實現 I/O 的負載均衡。這就叫細粒度條帶。條帶深度的大小必須爲(n * page size),其中 n 爲小於預取參數(prefetch size)大小的整數。

 預取大小也是對條帶化有影響的一個重要參數,它決定了 DB2 異步 I/O 的基本單位。首先我們要知道 DB2 的預取(prefetchingI/O 機制,在數據庫普遍存在着大量、連續的 I/O 時候,預取可以極大的提高數據庫數據讀取的 I/O 性能(例如 DSS 系統)。

http://www.dataguru.cn/thread-219397-1-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章