本文從低層原理上,深入透析了目前存在的7種模式的組成原理,結(jié)構(gòu),并深刻分析了各種級別相對于單盤IO速率的變化。
Raid0
?
Raid0是這樣一種模式:我們拿5塊盤的raid0為例子。
上圖中5個豎條,分別代表5個磁盤上的一個extent,也就是豎條的意思,每個磁盤被邏輯的劃分為N個這種extent。然后再在磁盤相同偏移的extent上,橫向邏輯分割,形成strip,一個strip橫跨過的extent個數(shù),稱為strip lenth,而一個strip和一個extent交叉帶,稱為一個segment,一個segment中所包含的data block個數(shù),稱為strip depth。Data block,可以是N倍個扇區(qū)大小的容量,應(yīng)該可以調(diào)節(jié),或者不可調(diào),隨控制器而定。
Raid0便是將一系列連續(xù)編號的data block,分布到多個物理磁盤上,擴散IO,提高性能。其分布的方式,如圖所示:這個例子中,條帶深度為4,則0、1、2、3號data block,被放置到第一個條帶的第一個segment中,然后4、5、6、7號block,放置到第一個條帶的第二個segment中,依此類推,條帶1放滿后,繼續(xù)放條帶2。這種特性,稱為“局部連續(xù)”,因為block只有在一個segment中是物理連續(xù)的,邏輯連續(xù),就需要跨物理磁盤了。
對外來說,參與形成raid0的各個物理盤,會組成一個邏輯上連續(xù),物理上也連續(xù)的虛擬磁盤。磁盤控制器對這個虛擬磁盤發(fā)出的指令,都被raid控制器截獲,分析,根據(jù)block映射關(guān)系公式,轉(zhuǎn)換成對組成raid0的各個物理盤的真實物理IO請求指令,收集或?qū)懭霐?shù)據(jù)之后,再提交給主機磁盤控制器。
Raid0還有另一種非條帶化模式,即寫滿其中一塊物理磁盤之后,再接著寫另一塊,直到所有組成磁盤全部寫滿。這種模式,對IO寫沒有任何優(yōu)化,但是對IO讀,能提高一定的并發(fā)IO讀幾率。
在進一步講述raid0和其他raid級別之前,我們先來看一下IO的種類。IO按照可以分為:讀/寫IO,大/小塊IO,連續(xù)/隨機IO,順序/并發(fā)IO。下面我們來分別介紹每一種IO。
讀/寫IO,這個就不用多說了,讀IO,就是發(fā)指令,從磁盤讀取某段扇區(qū)的內(nèi)容。指令一般是通知磁盤開始扇區(qū)位置,然后給出需要從這個初始扇區(qū)往后讀取的連續(xù)扇區(qū)個數(shù),同時給出動作是讀,還是寫。磁盤收到這條指令,就會按照指令的要求,讀或者寫數(shù)據(jù)。控制器發(fā)出的這種指令+數(shù)據(jù),就是一次IO,讀或者寫。
大/小塊IO,指控制器的指令中給出的連續(xù)讀取扇區(qū)數(shù)目的多少,如果數(shù)目很大,比如128,64等等,就應(yīng)該算是大塊IO,如果很小,比如1,4,8等等,就應(yīng)該算是小塊IO,大塊和小塊之間,沒有明確的界限。
連續(xù)/隨機IO,連續(xù)和隨機,是指本次IO給出的初始扇區(qū)地址,和上一次IO的結(jié)束扇區(qū)地址,是不是完全連續(xù)的,或者相隔不多的,如果是,則本次IO應(yīng)該算是一個連續(xù)IO,如果相差太大,則算一次隨機IO。連續(xù)IO,因為本次初始扇區(qū)和上次結(jié)束扇區(qū)相隔很近,則磁頭幾乎不用換道或換道時間極短;如果相差太大,則磁頭需要很長的換道時間,如果隨機IO很多,導(dǎo)致磁頭不停換道,效率大大降底。
順序/并發(fā)IO,這個的意思是,磁盤控制器每一次對磁盤組發(fā)出的指令套(指完成一個事物所需要的指令或者數(shù)據(jù)),是一條還是多條。如果是一條,則控制器緩存中的IO隊列,只能一個一個的來,此時是順序IO;如果控制器可以同時對磁盤組中的多塊磁盤,同時發(fā)出指令套,則每次就可以執(zhí)行多個IO,此時就是并發(fā)IO模式。并發(fā)IO模式提高了效率和速度。
說完了4種IO模式,我們再來說2個概念:
IO并發(fā)幾率。單盤,IO并發(fā)幾率為0,因為一塊磁盤同時只可以進行一次IO。對于raid0,2塊盤情況下,條帶深度比較大的時候(條帶太小不能并發(fā)IO,下面會講到),并發(fā)2個IO的幾率為1/2。其他情況請自行運算。
IOPS。一個IO所用的時間=尋道時間+數(shù)據(jù)傳輸時間。IOPS=IO并發(fā)系數(shù)/(尋道時間+數(shù)據(jù)傳輸時間),由于尋道時間相對傳輸時間,大幾個數(shù)量級,所以影響IOPS的關(guān)鍵因素,就是降底尋道時間,而在連續(xù)IO的情況下,尋道時間很短,僅在換磁道時候需要尋道。在這個前提下,傳輸時間越少,IOPS就越高。
每秒IO吞吐量。顯然,每秒IO吞吐量=IOPS乘以平均IO SIZE。Io size越大,IOPS越高,每秒IO吞吐量就越高。設(shè)磁頭每秒讀寫數(shù)據(jù)速度為V,V為定值。則IOPS=IO并發(fā)系數(shù)/(尋道時間+IO SIZE/V),代入,得每秒IO吞吐量=IO并發(fā)系數(shù)乘IO SIZE乘V/(V乘尋道時間+IO SIZE)。我們可以看出影響每秒IO吞吐量的最大因素,就是IO SIZE和尋道時間,IO SIZE越大,尋道時間越小,吞吐量越高。相比能顯著影響IOPS的因素,只有一個,就是尋道時間。
下面我們來具體分析一個從上到下訪問raid0磁盤的過程。假如某一時刻,主機控制器發(fā)出指令:讀取 初始扇區(qū)10000
長度128。Raid控制器接受到這個指令之后,立即進行計算,根據(jù)對應(yīng)公式(這個公式是raid控制器在做邏輯條帶化的時候制定的)算出10000號扇區(qū)所對應(yīng)的物理磁盤的扇區(qū)號,然后依次計算出邏輯上連續(xù)的下128個扇區(qū)所在物理磁盤的扇區(qū)號,之后,分別向?qū)?yīng)這些扇區(qū)的磁盤,再次發(fā)出指令,這次是真實的讀取數(shù)據(jù)了,磁盤接受到指令,各自將數(shù)據(jù)提交給raid控制器,經(jīng)過控制器在cache種的組合,再提交給主機控制器。
分析以上過程,我們發(fā)現(xiàn),如果這128個扇區(qū),都落在同一個segment中的話,也就是說條帶深度容量大于128個扇區(qū)的容量(64K),則這次IO就只能真實的從這一塊物理盤上讀取,性能和單盤相比會減慢,因為沒有任何優(yōu)化,反而還增加了raid控制器額外的計算開銷。所以要提升性能,讓一個IO盡量擴散到多塊物理盤上,就要減小條帶深度,磁盤數(shù)量不變的條件下,也就是減小條帶大小strip size。讓這個IO的數(shù)據(jù)被控制器分割,同時放滿第一個segment、第二塊物理磁盤上的第二個segment。。。。。。。依此類推,這樣就能極大的占用多塊物理盤。在這里大家可能存在一個誤區(qū),就是總是以為控制器是先放滿第一個segment,再放滿第二個segment,其實是同時進行的,因為控制器把每塊盤要寫入或者讀取的數(shù)據(jù)都計算好了,是同時進行的。所以,raid0要提升性能,條帶做的越小越好。但是這里又一個矛盾出現(xiàn)了,就是條帶太小,導(dǎo)致并發(fā)IO幾率降底,因為如果條帶太小,則每次IO一定會占用大部分物理盤,而隊列中的IO就只能等待這次IO結(jié)束后才能使用物理盤。而條帶太大,又不能充分提高傳輸速度,這兩個是一對矛盾,按照需求來采用不同的方式。
我們接著分析raid0相對于單盤的性能變化。根據(jù)以上總結(jié)出來的公式,可以推得以下表格:
RAID0
IOPS
|
讀
|
寫
|
并發(fā)IO
|
順序IO
|
并發(fā)IO
|
順序IO
|
隨機IO
|
連續(xù)IO
|
隨機IO
|
連續(xù)IO
|
隨機IO
|
連續(xù)IO
|
隨機IO
|
連續(xù)IO
|
Io size/strip size較大
|
不支持
|
不支持
|
提升極小
|
提升了N乘系數(shù)倍
|
不支持
|
不支持
|
提升極小
|
提升了N乘系數(shù)倍
|
Io size/strip size較小
|
提升了(1+并發(fā)系數(shù))倍
|
提升了(1+并發(fā)系數(shù)+系數(shù))系數(shù)倍
|
提升極小
|
提升了系數(shù)倍
|
提升了(1+并發(fā)系數(shù))倍
|
提升了(1+并發(fā)系數(shù)+系數(shù))倍
|
提升極小
|
提升了系數(shù)倍
|
注:并發(fā)IO和IO size/strip size是一對矛盾,兩者總是對立。N=組成raid0的磁盤數(shù)目。系數(shù)=io size/strip size和初始LBA地址所處的strip偏移綜合系數(shù),大于等于1。并發(fā)系數(shù)=并發(fā)IO的數(shù)量
Raid1
Raid1是這樣一種模式,我們拿2塊盤的例子來說明:
Raid1和raid0不同,raid0對數(shù)據(jù)沒有任何保護措施,每個block都沒有備份或者校驗保護措施。Raid對虛擬邏輯盤上的每個物理block,都在物理盤上有一份鏡像備份。也就是說數(shù)據(jù)有兩份。對于raid1的寫IO,速度不但沒有提升,而且有所下降,因為數(shù)據(jù)要同時向多塊物理盤寫,時間以最慢的你個為準,因為是同步的。而對于raid1的讀IO請求,不但可以并發(fā),而且就算順序IO的時候,控制器也可以象raid0一樣,從兩塊物理盤上同時讀數(shù)據(jù),提升速度。Raid1沒有srip的概念。同樣我們總結(jié)出一個表格:
RAID1
IOPS
|
讀
|
寫
|
并發(fā)IO
|
順序IO
|
并發(fā)IO
|
順序IO
|
隨機IO
|
連續(xù)IO
|
隨機IO
|
連續(xù)IO
|
隨機IO
|
連續(xù)IO
|
隨機IO
|
連續(xù)IO
|
|
提升N或者并發(fā)系數(shù)倍
|
提升N倍或者并發(fā)系數(shù)
|
提升極小
|
提升了N 倍
|
不支持
|
事物性IO可并發(fā),提升并發(fā)系數(shù)倍
|
沒有提升
|
沒有提升
|
注:raid1沒有strip的概念。N=組成raid1鏡像物理盤的數(shù)目。?
在讀、并發(fā)IO的模式下,由于可以并發(fā)N個IO,每個IO占用一個物理盤,這就相當于提升了N倍的IOPS。由于每個IO只獨占了一個物理盤,所以速度相對于單盤并沒有改變,所以不管是隨機還是順序IO,相對單盤都不變。
在讀、順序IO、隨機IO模式下,由于IO不能并發(fā),所以此時一個IO可以同時讀取N個盤上的內(nèi)容,但是是在隨機IO模式下,那么尋道時間影響很大,縱使同時分塊讀取多個磁盤的內(nèi)容,也架不住尋道時間的抵消,所以性能提升極小
在讀、順序IO、連續(xù)IO模式下,尋道時間影響到了最低,此時傳輸速率為主要矛盾,同時讀取多塊磁盤的數(shù)據(jù),時間減少為1/N,所以性能提升了N倍。
寫IO的時候和讀IO情況相同,就不做分析了。寫IO因為要同時向每塊磁盤寫入備份數(shù)據(jù),所以不能并發(fā)IO,也不能分塊并行。但是如果控制器把優(yōu)化算法做到極至的話,還是可以并發(fā)IO的,比如控制器從IO隊列中提取連續(xù)的多個IO,可以將這些IO合并,并發(fā)寫入磁盤。前提這幾個IO必須是事物性的,也就是說LBA必須連續(xù),不然不能作為一個大的合并IO,而且和文件系統(tǒng)也有關(guān)系,文件系統(tǒng)碎片越少,并發(fā)幾率越高。
Raid2
raid2是一種比較特殊的raid模式,他是一種專用raid,現(xiàn)在早已被淘汰。他的基本思想是,IO到來之后,控制器將數(shù)據(jù)分割開,在每塊物理磁盤讀或者寫1bit。這里有個疑問,磁盤的最小IO單位是扇區(qū),512字節(jié),如何寫入1bit呢?其實這個寫入1bit,并非只寫入1bit。我們知道上層IO,可以先經(jīng)過文件系統(tǒng),然后才通過磁盤控制器驅(qū)動來向磁盤發(fā)出IO,最終的IO大小,都是N倍的扇區(qū),也就是Nx512字節(jié),N大于等于1,不可能發(fā)生N小于1的情況,即使你需要的數(shù)據(jù)只有幾個字節(jié),那么也同樣要讀出或者寫入整個扇區(qū),也就是512字節(jié)。明白這個原則之后,我們再來看一下raid2中所謂的“每個磁盤寫1bit”是個什么概念。IO最小單位為扇區(qū),512字節(jié),我們就拿一個4塊數(shù)據(jù)盤+3塊校驗盤的raid2系統(tǒng)給大家來說明一下。這個環(huán)境中,raid2的一個條帶大小是4bit(1bit乘4塊數(shù)據(jù)盤),而IO最小單位是一個扇區(qū),那么如果分別向每塊盤寫1bit,就需要分別向每塊盤寫一個扇區(qū),每個扇區(qū)只包含1bit有效數(shù)據(jù),這顯然是不好的,因為太浪費空間,沒有意義。因為IO數(shù)據(jù)到來時,我們拿以下IO請求為例:寫入 初始扇區(qū)10000長度1,這個IO目的是要向LBA10000寫入一個扇區(qū)的數(shù)據(jù),也就是512字節(jié)。Raid2控制器接受到這512字節(jié)的數(shù)據(jù)之后,先將其放入cache,然后計算需要寫入的物理磁盤的信息,比如定位到物理扇區(qū),分割數(shù)據(jù)成bit,然后一次性寫入物理磁盤扇區(qū)。
也就是說第一塊物理盤,控制器會寫入本次IO數(shù)據(jù)的第1、5、9、13、17、21。。。。。。。。。。。等等位,第二塊物理盤會寫入2、6、10、14、18、22。。。。。。。。。。等等位,其他兩塊物理盤同樣方式寫入。直到這樣將數(shù)據(jù)寫完。我們可以計算出來,這512字節(jié)的數(shù)據(jù)寫完之后,此時每塊物理盤只包含128字節(jié)的數(shù)據(jù),也就是一個扇區(qū)的四分之一,那么這個扇區(qū)剩余的部分,就是空的。如果要利用起這部分空間,那么等下次IO到來之后,控制器對數(shù)據(jù)進行bit分割,將要填入這些空白區(qū)域的數(shù)據(jù),控制器將首先讀出原來的數(shù)據(jù),然后和新數(shù)據(jù)合并之后,一并再寫回這個扇區(qū),這樣做效率和速度都大打折扣。我們可以發(fā)現(xiàn),其實raid2就是將原本連續(xù)的一個扇區(qū)的數(shù)據(jù),以位為單位,分割存放到不連續(xù)的多塊物理盤上,因為這樣可以全組并行讀寫,提高性能。每個物理磁盤扇區(qū)其實是包含了N個扇區(qū)的“殘體”。那么如果出現(xiàn)需要更新這個IO的4個扇區(qū)中某一個扇區(qū)的情況,怎么辦?這種情況下,必須先讀出原來的數(shù)據(jù),和新數(shù)據(jù)合并,然后在一并寫入。其實這種情況出現(xiàn)的非常少。我們知道上層IO的產(chǎn)生,一般是需要先經(jīng)過os的文件系統(tǒng),然后才到磁盤控制器這一層的。所以磁盤控制器產(chǎn)生的IO,一般都是事務(wù)性的,也就是這個IO中的所有扇區(qū),很大幾率上對于上層文件系統(tǒng)來說,是一個完整的事務(wù),所以很少會發(fā)生只針對這個事務(wù)中某一個原子進行讀寫的情況。這樣的話,每次IO很大幾率都會包含入這些邏輯上連續(xù)的扇區(qū)的,所以不必擔心經(jīng)常會發(fā)生那種情況,即便發(fā)生了,控制器也只能按照那種低效率的做法來做,不過總體影響較小。但是如果隨機IO比較多,那么這些IO初始LBA,很有可能就會命中在一個兩個事務(wù)交接的扇區(qū)處,這種情況,就導(dǎo)致速度和效率大大降低了。連續(xù)IO出現(xiàn)這種情況的幾率非常小了。
Raid2因為每次讀寫都需要全組磁盤聯(lián)動,所以為了最大化其性能,最好保證每塊磁盤主軸同步,使得同一時刻每塊磁盤磁頭所處的扇區(qū)邏輯編號都一致,并存并取,達到最佳性能,如果不能同步,則會產(chǎn)生等待,影響速度。
基于raid2的并存并取的特點,raid2不能實現(xiàn)并發(fā)IO,因為每次IO都占用了每塊物理磁盤。
Raid2的校驗盤對系統(tǒng)不產(chǎn)生瓶頸,但是產(chǎn)生延遲,因為多了計算校驗的動作。校驗位和數(shù)據(jù)位是一同并行寫入或者讀取的。Raid2采用海明碼來校驗數(shù)據(jù),這種碼可以判斷修復(fù)一位錯誤的數(shù)據(jù),并且使用校驗盤的數(shù)量太多,4塊數(shù)據(jù)盤需要3塊校驗盤,但是隨著數(shù)據(jù)盤數(shù)量的增多,校驗盤所占的比例會顯著減小。
Raid2和raid0有些不同,raid0不能保證每次IO都是多磁盤并行,因為raid0的分塊相對raid2以位為單位來說是太大了,而raid2由于她每次IO都保證是多磁盤并行,所以其數(shù)據(jù)傳輸率是單盤的N倍,為了最好的利用這個特性,就需要將這個特性的主導(dǎo)地位體現(xiàn)出來,而根據(jù)IOPS=IO并發(fā)系數(shù)/(尋道時間+數(shù)據(jù)傳輸時間),尋道時間比數(shù)據(jù)傳輸時間大幾個數(shù)量級,所以為了體現(xiàn)數(shù)據(jù)傳輸時間減少這個優(yōu)點,就必須避免尋道時間的影響,而避免其影響的最佳做法就是:盡量產(chǎn)生連續(xù)IO而不是隨機IO,所以,raid2最適合連續(xù)IO的情況。另外,根據(jù)每秒IO吞吐量=IO并發(fā)系數(shù)乘IO SIZE乘V/(V乘尋道時間+IO SIZE),如果將IO size也增大,則每秒IO吞吐量也將顯著提高。所以,raid2最適合的應(yīng)用,就是:產(chǎn)生連續(xù)IO,大塊IO的情況,不言而喻,文件服務(wù),視頻流服務(wù)等等這些應(yīng)用,適合raid2,不過,raid2的缺點太多,比如校驗盤數(shù)量多,算法復(fù)雜等等,它逐漸的被raid3替代了。
RAID2
IOPS
|
讀
|
寫
|
順序IO
|
順序IO
|
非事務(wù)性隨機IO
|
事務(wù)性隨機IO
|
連續(xù)IO
|
非事務(wù)性隨機IO
|
事務(wù)性隨機IO
|
連續(xù)IO
|
IO滿足公式條件
|
提升極小
|
提升極小
|
提升N倍
|
性能降低
|
提升極小
|
提升N倍
|
注:N=數(shù)據(jù)盤數(shù)量。Raid2不能并發(fā)IO
Raid3
?
由于raid2缺點比較多,比如非事務(wù)性IO對他的影響,校驗盤數(shù)量太多等等。Raid2的劣勢,就在于它的將數(shù)據(jù)以bit為單位,分割,將原本物理連續(xù)的扇區(qū),轉(zhuǎn)變成物理不連續(xù),邏輯連續(xù)的,這樣就導(dǎo)致了它對非事務(wù)性IO的效率低下。為了從根本上解決這個問題,raid3出現(xiàn)了。既然要從根本上解決這個問題,首先就是需要拋棄raid2對扇區(qū)進行分散的做法。Raid3保留了扇區(qū)的物理連續(xù)。Raid2將數(shù)據(jù)以bit為單位分割,這樣為了保證每次IO占用全部磁盤的并行性。而raid3同樣也保留了這個特點,但是沒有以bit為單位來分散數(shù)據(jù),而就是以扇區(qū)或者幾個扇區(qū)為單位來分散數(shù)據(jù)。Raid3還采用了高效的XOR校驗算法,但是這種算法只能判斷數(shù)據(jù)是否有誤,不能判斷出哪一位有誤,更不能修正。XOR校驗使得raid3不管多少塊數(shù)據(jù)盤,只需要一塊校驗盤就足夠了。
Raid3的每一個條帶,其長度很小,深度為1。這樣的話,每個segment的大小一般就是1個扇區(qū)或者幾個扇區(qū)的容量。以上圖的例子來看,4塊數(shù)據(jù)盤,一塊校驗盤,每個segment,也就是圖中的一個block portion,假如為2個扇區(qū)大小,也就是1k,則整個條帶大小為4k,如果一個segment大小為8個扇區(qū),即4k,則整個條帶大小為16K。
我們還是用一個例子來說明raid3的作用機制。比如,一個4數(shù)據(jù)盤,1校驗盤的raid3系統(tǒng),segment size為2個扇區(qū)大小即1k。raid3控制器接受到了這么一個IO:寫入 初始扇區(qū)10000長度8,即總數(shù)據(jù)量為8乘512字節(jié)=4k。則控制器先定位LBA10000所對應(yīng)的真實物理LBA,假如LBA10000恰好在第一個條帶的第一個segment的第一個扇區(qū)上,那么控制器將這個IO數(shù)據(jù)里的第1、2個512字節(jié)寫入這個扇區(qū),同一時刻,第3、4個512字節(jié)會被同時寫入這個條帶的第二個segment中的兩個扇區(qū),其后的數(shù)據(jù)同樣被寫入第3、4個segment中,此時恰好是4k的數(shù)據(jù)量。也就是說這4k的IO數(shù)據(jù),同時被寫入了4塊磁盤,每塊磁盤寫入了兩個扇區(qū),也就是一個segment,他們是并行寫入的,包括校驗盤,也是并行寫入的,所以raid3的校驗盤沒有瓶頸,但是有延遲,因為增加了計算校驗的開銷。但現(xiàn)代控制器一般都使用專用的XOR硬件電路而不是cpu來計算xor,這樣就使得延遲降到最低。上面那個情況是IO size剛好等于一個條帶大小的時候,如果IO size小于一個條帶大小呢?我們接著分析,還是剛才那個環(huán)境,此時控制器接收到IO大小為2K的寫入請求,也就是4個連續(xù)扇區(qū),那么控制器就只能同時寫入兩個磁盤了,因為每個盤上的segment是2個扇區(qū),其他兩個磁盤此時就是空閑的,也只能得到兩倍的單盤傳輸速率。我們再來看看IO size大于一個條帶大小的情況,會發(fā)生什么。還是那個環(huán)境,控制器收到的IO size=16k。則控制器一次所能并行寫入的,是4k,這16k就需要分4批來寫入4個條帶。其實這里的分4批寫入,不是先后,而還是同時,也就是這16k中的第1、5、9、13k將由控制器連續(xù)寫入磁盤1,第2、6、10、14k,連續(xù)寫入磁盤2,依此類推,直到16k數(shù)據(jù)全部寫完,是并行一次寫完,這樣校驗盤也可以一次性計算校驗值并且和數(shù)據(jù)一同并行寫入。而不是“分批”。
通過比較,我們發(fā)現(xiàn),與其使得IO size小于一個條帶的大小,空閑一些磁盤,不如使得Io size大于或者等于條帶大小,使得沒有磁盤空余。因為上層IO size是不受控的,控制器說了不算,但是條帶大小是控制器說了算的,所以如果將條帶大小減少到很小,比如2個扇區(qū),一個扇區(qū),則每次上層IO,一般情況下都會占用所有磁盤,進行并發(fā)傳輸。可以提供和raid2一樣的傳輸速度,并避免raid2的諸多缺點。Raid3和raid2一樣,不能并發(fā)IO, 因為一個IO要占用全部盤,就算IO size小于strip size,因為校驗盤的獨享,也不能并發(fā)IO。
RAID3
IOPS
|
讀
|
寫
|
并發(fā)IO
|
順序IO
|
并發(fā)IO
|
順序IO
|
隨機IO
|
連續(xù)IO
|
隨機IO
|
連續(xù)IO
|
隨機IO
|
連續(xù)IO
|
隨機IO
|
連續(xù)IO
|
Io size大于strip size
|
不支持
|
不支持
|
提升極小
|
提升了N倍
|
不支持
|
不支持
|
提升極小
|
提升了N倍
|
Io size小于strip size
|
不支持
|
事物性IO可并發(fā),提升并發(fā)系數(shù)倍
|
提升極小
|
提升了N乘IO size/strip size倍
|
不支持
|
事物性IO可并發(fā),提升并發(fā)系數(shù)倍
|
提升極小
|
提升了N乘IO size/strip size倍
|
注:N=組成raid3的數(shù)據(jù)磁盤數(shù)量。和raid2相同,事物性連續(xù)IO可能并發(fā)。
和raid2一樣,raid3同樣也是最適合連續(xù)大塊IO的環(huán)境,但是它比raid2成本更低,更容易部署。
具體分析:
不管任何形式的raid,只要是面對隨機IO,其性能比單盤沒有大的優(yōu)勢,因為raid作所的只是提高傳輸速率,并發(fā)IO,容錯。隨機IO只能靠降低單個物理磁盤的尋道時間來解決。而raid不能優(yōu)化尋道時間。所以隨機IO,raid3也同樣沒有優(yōu)勢。
連續(xù)IO,因為尋道時間的影響因素可以忽略,raid3最拿手,因為象raid2一樣,raid3可以大大加快數(shù)據(jù)傳輸速率,因為他是多盤并發(fā)讀寫。所以理論上可以相對單盤提高N倍的速率。
Raid4
不管是Raid2還是raid3,他們都是為了大大提高數(shù)據(jù)傳輸率而設(shè)計,而不能并發(fā)IO。諸如數(shù)據(jù)庫等等應(yīng)用,他們的特點就是隨機IO和小塊IO。想提高這種環(huán)境的IOPS,根據(jù)公式:IOPS=IO并發(fā)系數(shù)/(尋道時間+數(shù)據(jù)傳輸時間),隨機讀導(dǎo)致尋道時間很大,靠提高傳輸許率已經(jīng)不是辦法。所以觀察這個公式,想在隨機IO頻發(fā)的環(huán)境中提高IOPS,唯一能夠做的,只有提高IO并發(fā)系數(shù),不能并發(fā)IO的,想辦法讓他并發(fā)IO,并發(fā)系數(shù)小的,想辦法提高系數(shù)。
在raid3的基礎(chǔ)上,raid4被發(fā)展起來。我們分析raid3的性能的時候,曾經(jīng)提到過一種情況,就是io size小于strip size的時候,此時有磁盤處于空閑狀態(tài),而如果抓住這個現(xiàn)象,同時讓隊列中的下一個IO來利用這些空閑的磁盤,豈不是正好達到并發(fā)IO的效果了么?所以raid4將一個segment的大小做的比較大,以至于平均IO size總是小于strip size,這樣就能保證每個IO少占用磁盤,甚至一個IO只占用一個磁盤。
是的,這個思想對于讀IO是對路子的,但是對于寫IO的話,有一個很難克服的問題,那就是校驗盤的爭用。考慮這樣一種情況:4塊數(shù)據(jù)盤+1塊校驗盤組成的raid4系統(tǒng),某時刻一個IO占用了前兩塊盤+校驗盤,此時雖然后兩塊是空閑的,可以同時接受新的IO請求,但是如果接受了新的IO請求,則新IO請求同樣也要使用校驗盤,由于一塊物理磁盤不能同時處理多個IO,所以新IO雖然占有了數(shù)據(jù)盤的寫權(quán)限,但是寫校驗盤的時候,仍然要等舊IO寫完后,才能寫入校驗,新IO才能完成,這樣的話,就和順序IO無異了,數(shù)據(jù)盤可并發(fā)而校驗盤不可并發(fā),這樣不能實現(xiàn)并發(fā)IO。
下面我們來說幾個概念。
整條寫、重構(gòu)寫與讀改寫
整條寫(Full-stripe Write):整條寫需要修改奇偶校驗群組中所有的條帶單元,因此新的奇偶校驗值可以根據(jù)所有新的條帶數(shù)據(jù)計算得到。不需要額外的讀、寫操作。因此,整條寫是最有效的寫類型。整條寫的例子,比如raid2,raid3。他們每次IO總是幾乎能保證占用所有盤,因此每個條帶上的每個segment都被寫更新,所以控制器可以直接利用這些更新的數(shù)據(jù)計算出校驗數(shù)據(jù)之后,在數(shù)據(jù)被寫入數(shù)據(jù)盤的同時,將計算好的校驗信息寫入校驗盤。
重構(gòu)寫(Reconstruct Write):如果要寫入的磁盤數(shù)目超過陣列磁盤數(shù)目的一半,采取重構(gòu)寫方式。在重構(gòu)寫中,從這個條帶中不需要修改的segment中讀取原來的數(shù)據(jù),再和本條帶中所有需要修改的segment上的新數(shù)據(jù)計算奇偶校驗值,并將新的segment數(shù)據(jù)和沒有更改過的segment數(shù)據(jù)以及新的奇偶校驗值一并寫入。顯然,重構(gòu)寫要牽涉更多的I/O操作,因此效率比整條寫低。重構(gòu)寫的例子,比如raid4中,如果數(shù)據(jù)盤為8塊,某時刻一個IO只更新了一個條帶的6個segment,剩余兩個沒有更新,則重構(gòu)寫模式下,會將沒有被更新的兩個segment的數(shù)據(jù)讀出,和需要更新的前6個segment的數(shù)據(jù)計算出校驗數(shù)據(jù),然后將這8個segment連同校驗數(shù)據(jù)一并寫入磁盤。可以看出,這個操作只是多出了讀兩個segment中數(shù)據(jù)的操作。
讀改寫(Read-Modify Write):如果要寫入的磁盤數(shù)目不足陣列磁盤數(shù)目的一半,采取讀改寫方式。讀改寫過程如下:(1)從需要修改的segment上讀取舊的數(shù)據(jù);(2)從條帶上讀取舊的奇偶校驗值;(3)根據(jù)舊數(shù)據(jù)、舊校驗值和需要修改的segment上的新數(shù)據(jù)計算這個條帶上的新的校驗值;(4)寫入新的數(shù)據(jù)和新的奇偶校驗值。這個過程中包含讀取、修改、寫入的一個循環(huán)周期,因此稱為讀改寫。讀改寫計算新校驗值的公式為:
新數(shù)據(jù)的校驗數(shù)據(jù)=(老數(shù)據(jù)
?EOR?
新數(shù)據(jù))
?EOR?
老校驗數(shù)據(jù)
。如果待更新的segment已經(jīng)超過了條帶中總segment數(shù)量的一半,則此時不適合使用讀改寫,因為讀改寫需要讀出這些segment中的數(shù)據(jù)和校驗數(shù)據(jù),而如果采用重構(gòu)寫,只需要讀取剩余不準備更新數(shù)據(jù)的segment中的數(shù)據(jù)即可,而后者數(shù)量比前者要少,所以超過一半,用重構(gòu)寫,不到一半,用讀改寫。整條更新,就用整條寫。
寫效率:整條寫
>
重構(gòu)寫
>
讀改寫
。
明白了這些概念之后,我們就可以繼續(xù)深入理解raid4了。如果僅僅根據(jù)爭用校驗盤來下結(jié)論說raid4不支持并發(fā)IO,在經(jīng)過了以上三個概念的描述之后,看來顯然是片面的。我們設(shè)想這樣一種情形,某時刻一個IO只占用了全部磁盤的幾塊盤,另一些磁盤空閑,如果此時讓隊列中下一個IO等待的話,那么當然不可實現(xiàn)并發(fā)IO。此時我們考慮:如果隊列中有這樣一個IO,它需要更新的LBA目標和正在進行的IO恰好在同一條帶上,并且處于空閑磁盤,而又不沖突,那么此時我們恰好就可以讓這個IO也搭一下正在進行的IO的順風車,反正都是要更新這個條帶的校驗segment,與其兩個IO先后更新,不如讓他們同時更新各自的數(shù)據(jù)segment,而控制器負責計算本條帶的校驗塊。這樣就完美的達到了IO并發(fā)。但是,有個問題,這種情況遇到的幾率真是小之又小。即便如此,控制器如果可以對隊列中的IO目標LBA進行掃描,將目標處于同一條帶的IO,讓其并發(fā)寫入,這就多少類似NCQ技術(shù)了,不過這種技術(shù)需要上層軟件的配合,因為亂序IO,會失去事務(wù)的順序性,所以還需要上層軟件作一些處理。
?
除了在控制器內(nèi)部實現(xiàn)這種算法之外,我們還可以直接在上層來實現(xiàn)這種模式。上層就是指操作系統(tǒng)的文件系統(tǒng)。因為文件系管理著底層磁盤。文件系統(tǒng)決定數(shù)據(jù)寫往磁盤上的哪些扇區(qū)。所以完全可以在文件系統(tǒng)這個層次上,將兩個不同事物的IO寫操作,盡量放到相同的條帶上,也就是說,比如一個條帶大小為16k,可以前8k放一個IO的數(shù)據(jù),后8k放也另一個IO的數(shù)據(jù),這兩個IO在經(jīng)過文件系統(tǒng)的計算之后,經(jīng)由磁盤控制器驅(qū)動程序,向磁盤發(fā)出同時寫入整個條帶的操作,這樣就構(gòu)成了整條寫,如果實在不能占滿整條,那么也應(yīng)該盡量達成重構(gòu)寫模式,這樣不但并發(fā)了IO,還使得寫效率增加。這種在文件系統(tǒng)專門為raid4做出優(yōu)化的方案,最點型的就是netapp公司的磁盤陣列操作系統(tǒng)data ontap,這個操作系統(tǒng)中文件系統(tǒng)模塊稱為WAFL。WAFL文件系統(tǒng)的設(shè)計方式確保能夠最大限度地減少校驗盤尋址操作。 上圖右半部對比顯示了WAFL如何分配同樣的數(shù)據(jù)塊,從而使得RAID 4更加有效。 WAFL總是把相關(guān)的數(shù)據(jù)塊寫到彼此鄰近的條帶中,消除校驗盤上的長時間尋址操作。只要可能,WAFL也把多重數(shù)據(jù)塊寫到同樣的條帶中,從而進一步減少校驗盤上的阻塞。FFS在上圖左半部中使用六道獨立的條帶,因此致使六個校驗盤塊需要更新。 上圖右半部中,WAFL使用僅僅3道條帶,即只有三個校驗塊需要更新。從而大大提高了RAID性能,消除了校驗盤瓶頸。
?
RAID4
IOPS
|
讀
|
寫
|
特別優(yōu)化的并發(fā)IO
|
順序IO
|
特別優(yōu)化的并發(fā)IO
|
順序IO
|
隨機IO
|
連續(xù)IO
|
隨機IO
|
連續(xù)IO
|
隨機IO
|
連續(xù)IO
|
隨機IO
|
連續(xù)IO
|
Io size/strip size較大
|
沖突
|
沖突
|
提升極小
|
提升了N倍
|
沖突
|
沖突
|
沒有提升
|
提升了N倍
|
Io size/strip size較小
|
提升極小
|
提升并發(fā)系數(shù)倍
|
幾乎沒有提升
|
幾乎沒有提升
|
提升并發(fā)系數(shù)倍
|
提升并發(fā)系數(shù)乘N倍
|
性能降底
|
性能降底
|
注:N為raid4數(shù)據(jù)盤數(shù)量。Io size/strip size太大則并發(fā)IO幾率很小。
值得注意的是,如果io size/strip size的值太小,則順序IO讀,不管是連續(xù)還是隨機IO,幾乎都沒有提升。順序IO寫,性能下降,因為io size很小,又是順序IO,則只能進行讀改寫,性能降底不少。
所以,如果要使用raid4,不進行特別優(yōu)化,是不行的,至少要讓他可以進行并發(fā)IO。我們觀察表格可知,并發(fā)IO模式下,性能都有所提升。然而如果要優(yōu)化到并發(fā)幾率很高,實則不容易。目前只有netapp的WAFL文件系統(tǒng)還在使用raid4,其他產(chǎn)品均未見使用。面臨淘汰,取而代之的是擁有高并發(fā)幾率的raid5系統(tǒng)。
Raid5