Oracle I/O和條帶陣列如何相互作用
在幾乎所有的大型數(shù)據(jù)庫中,對磁盤進(jìn)行條帶化可以增 加磁盤I/O的速率,而不會因為要管理分布在多個單獨(dú)磁盤上的數(shù)據(jù)文件而增加過多的負(fù)擔(dān)。正如前面討論的那樣,可以利用應(yīng)用數(shù)據(jù)庫服務(wù)器上的卷管理器,專 用I/O子系統(tǒng),或者是兩者的結(jié)合將磁盤組織成磁盤陣列。
如果使用的Oracle發(fā)布沒有提供ASM,那么你 在建立條帶磁盤陣列的時候,可以設(shè)置用于給磁盤加條帶的塊大小。塊大小就是數(shù)據(jù)遷移到陣列中的另一個磁盤之前寫入當(dāng)前磁盤的數(shù)據(jù)量。理解不同條帶的塊大小 與兩種大小的Oracle I/O之間的相互作用,對于將I/O性能最大化非常關(guān)鍵。
假設(shè)一個Oracle數(shù)據(jù)塊大小為8KB,并且 DB_FILE_MULTBLOCK_READ_COUNT初始化參數(shù)設(shè)為32。那么Oracle將支持兩種大小的I/O:一個單獨(dú)的8KB數(shù)據(jù)塊,和一 個256KB的多塊讀(8KB的32倍)。然后假設(shè)為Oracle配置了一個包括4個磁盤的陣列,而塊大小為64KB,那么256KB的數(shù)據(jù)庫將會分散到 4個磁盤中,以及每個磁盤64KB數(shù)據(jù)。
每個8KB的I/O將命中一個軸,而這8KB的數(shù)據(jù) 將會置于一個64KB的塊中。由于并發(fā)的最大化,建立條帶可以提高小型I/O的性能,因為每個磁盤可以服務(wù)于不同的I/O。256KB的多塊I/O將命中 所有4個磁盤。如果把塊大小從64KB換成256KB,那么平均每個256KB的I/O請求只命中一個磁盤。在這種情況下,多塊I/O就只需要更少的I /O調(diào)用,因為磁盤上的塊大小比較大。無論是哪一種情況,磁盤都將會滿足單數(shù)據(jù)庫I/O調(diào)用。通過把一個I/O調(diào)用分散到多個磁盤上建立條帶,可以提高大 規(guī)模讀操作的I/O速率,在上面的64KB塊大小和256KB多塊I/O的例子中已經(jīng)說明了這一點。
那么什么是條帶化呢?條帶化(Striping)是把連續(xù)的數(shù)據(jù)分割成相同大小的數(shù)據(jù)塊,把每段數(shù)據(jù)分別寫入到陣列中不同磁盤上的方法。此技術(shù)非常有用,它比單個磁盤所能提供 的讀寫速度要快的多,當(dāng)數(shù)據(jù)從第一個磁盤上傳輸完后,第二個磁盤就能確定下一段數(shù)據(jù)。數(shù)據(jù)條帶化正在一些現(xiàn)代數(shù)據(jù)庫和某些RAID硬件設(shè)備中得到廣泛應(yīng) 用。
條帶化的設(shè)置
由于現(xiàn)在的存儲技術(shù)成熟、成本降低,大多數(shù)系統(tǒng)都采用條帶化來實現(xiàn)系統(tǒng)的IO負(fù)載分擔(dān)。如果操作系統(tǒng)有 LVM(Logical Volume Manager邏輯卷管理器)軟件或者硬件條帶設(shè)備,我們就可以利用這些攻擊來分布IO負(fù)載。當(dāng)使用LVM或者硬件條帶時,決定因素是條帶深度 (stripe depth)和條帶寬度(stripe width):
條帶深度指的是條帶的大小,也叫條帶單元;
條帶寬度指的是條帶深度的產(chǎn)量或者一個條帶集中的驅(qū)動數(shù);
需要根據(jù)系統(tǒng)的IO要求來 合理的選擇這些數(shù)據(jù)。對于Oracle數(shù)據(jù)庫系統(tǒng)來數(shù),比較合理的條帶深度是從256K到1M。下面分析影響條帶深度和條帶寬度的影響因素。
條帶深度
為了提高IO效率,我們要盡量使一次邏輯IO請求由一塊磁盤的一次物理IO請求。因而影響條帶的一個重要因素就是一次邏輯IO 請求的大小。
此外,系統(tǒng)中IO的并發(fā)度不同我們對條帶的配置要求也不同。例如,在高并發(fā)度且IO請求的大小都比較小的情況下,我們希望一塊磁盤能同時響應(yīng)多 個IO操作;而在那些存在大IO請求的低并發(fā)度系統(tǒng)中,我們可能就需要多塊磁盤同時響應(yīng)一個IO請求。無論是一個磁盤還是多個磁盤響應(yīng)IO請求,我們的一 個原則是讓一次邏輯IO能被一次處理完成。
下面先看下影響IO大小的操作系統(tǒng)和Oracle的相關(guān)參數(shù):
db_block_size:Oracle中的數(shù)據(jù)塊大小,也決定了Oracle一次單個IO請求中的數(shù)據(jù)塊的大小;
db_file_multiblock_read_count: 在多數(shù)據(jù)塊讀時,一次讀取數(shù)據(jù)塊的數(shù)量,它和參數(shù)db_block_size一起決定了一次多數(shù)據(jù)塊讀的大小,它們的乘積不能大于操作系統(tǒng)的最大IO大 小,在SAP中此值是默認(rèn)的,SAP的Nots中不建議改到此參數(shù)即,此參數(shù)的大小為128
操作系統(tǒng)的數(shù)據(jù)塊大小:這個參數(shù)決定拉Redo Log和Archive Log操作時的數(shù)據(jù)塊大小,對于大多數(shù)Unix系統(tǒng)來說,該值為512K;
最大操作系統(tǒng)IO大小:操作系統(tǒng)最大的 I/O 大小對條帶化深度的設(shè)置也產(chǎn)生著重要的影響。當(dāng)邏輯 I/O 請求達(dá)到操作系統(tǒng)之后,如果邏輯 I/O 的大小超過了操作系統(tǒng)能處理最大的 I/O 大小,操作系統(tǒng)會根據(jù)自己能夠處理的最大的 I/O 大小來分割邏輯 I/O 請求。操作系統(tǒng)決定了一次單個的IO操作的IO大小的上限,
對 于HP-UX系統(tǒng)來說,由參數(shù)max_io_size設(shè)置;
在 AIX 中,這個參數(shù)就是 LTG,也就是當(dāng)邏輯 I/O 的大小超過了所在卷組的 LTG 的設(shè)置之后,AIX 會將邏輯 I/O 以 LTG 為單位進(jìn)行分割之后,才會將分割好的 I/O 請求分發(fā)到物理存儲中去。所以 LTG 的大小應(yīng)該與條帶深度大小相同或者是條帶深度大小的整數(shù)倍。在 AIX V5.3 后,卷組的 LTG 參數(shù)是在 varyonvg 的時候指定的,語法如下:
varyonvg – M 512K vgname
上 面的語句將卷組“ vgname ”的 LTG 參數(shù)設(shè)置為 512K,每次在 varyonvg 卷組的時候可以設(shè)置不同的 LTG(在 AIX5.3 之前,LTG 是在創(chuàng)建卷組的時候設(shè)置,并且不能修改)。目前 LTG 的取值范圍為:4K、8K、16K、32K、64K、128K、1M、2M、4M、8M、16M、32M 和 128M 。而且如果卷組中 PV 不能支持 LTG 的設(shè)置 varyonvg 命令將會失敗。
sort_area_size:內(nèi)存中sort area的大小,也決定了并發(fā)排序操作時的IO大??;
hash_area_size:內(nèi)存中hash area的大小,也決定了哈希操作的IO大小。
其中,前面兩個是最關(guān)鍵的兩個參數(shù)。
在OLTP系統(tǒng)中,會存在大量小的并發(fā)的IO請求。這時就需要考慮選擇比較大的條帶深度。使條帶深度大于IO大小就稱為粗粒度條帶 (Coarse Grain Striping)。在高并行度系統(tǒng)中,條帶深度為(n * db_block_size),其中n為大于1的整數(shù)。通過粗粒度條帶能實現(xiàn)最大的IO吞吐量(一次物理IO可以同時響應(yīng)多個并發(fā)的邏輯IO)。大的條帶深度能夠使像全表掃描那樣的多數(shù)據(jù)塊讀操作由 一個磁盤驅(qū)動來響應(yīng),并提高多數(shù)據(jù)塊讀操作的性能。
在低并發(fā)度的DSS系統(tǒng)中,由于IO請求比較序列化,為了避免出現(xiàn)熱點磁盤,我們需要避免邏輯IO之由一塊磁盤處理。這是,粗粒度條帶就不適合 了。我們選擇小的條帶深度,使一個邏輯IO分布到多個磁盤上,從而實現(xiàn)IO的負(fù)載均衡。這就叫細(xì)粒度條帶。條帶深度的大小為(n * db_block_size),其中n為小于多數(shù)據(jù)塊讀參數(shù)(db_file_multiblock_read_count)大小的整數(shù)。
另外,IO過程中,你無法保證Oracle數(shù)據(jù)塊的邊界能和條帶單元的大小對齊。如果條帶深度大小和Oracle數(shù)據(jù)塊大小完全相同,而它們 的邊界沒有對齊的話,那么就會存在大量一個單獨(dú)的IO請求被兩塊磁盤來完成。
在OLTP系統(tǒng)中,為了避免一個邏輯IO請求被多個物理IO操作完成,條帶寬度就需要設(shè)置為兩倍或者兩倍以上于Oracle數(shù)據(jù)塊大小。例如, 如果條帶深度是IO大小的N倍,對于大量并發(fā)IO請求,我們可以保證最少有(N-1)/ N的請求是由一塊磁盤來完成。
條帶寬度
正如我們前面所述,無論是一個還是多個磁盤響應(yīng)一個邏輯IO,我們都要求IO能被一次處理。因而在確定了條帶深度的基礎(chǔ)上, 我們需要保證條帶寬度 >= IO請求的大小 / 條帶深度。
此外,考慮到以后系統(tǒng)容量的擴(kuò)充,我們也需要規(guī)劃好條帶寬度。
如今大多數(shù)LVM都支持在線動態(tài)增加磁盤。也就是在磁盤容量不足時,我們可以隨時將新磁盤加入到一個已經(jīng)使用的邏輯卷中。這樣的話,我們在設(shè)置 邏輯卷時就可以簡單地將所有磁盤都?xì)w入到一個卷中去。