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