上一篇 | 下一篇

即将告别北京,告别存储圈,特献礼一份。

发布: 2007-7-26 01:50 | 作者: webmaster | 来源: 本站原创 | 查看: 404次

另外,北京的存储同仁们,我请大家吃饭。
;?0Q:F9R$U M1hDOIT博客@,@"\&B4pvZ4Le

DfI2RFQ O}1P
@i;\5F)]zjbDOIT博客`-[0@M(JtXAwK5n

Z8up~ y5E
t'iSf9~_DOIT博客 }mUE,[u8[

I| `kWW J
)YL9GrAz
N8A:qzN8mj
cr w/ytGt)c
J2H`7\ w7~? `-b5WH以下转载于《计算机世界》3月26日之《网络存储》赠刊。DOIT博客Le^Np,w

L_7vc0X.{%gDOIT博客f z-M@2u6p]

Lc:G(^x3aDOIT博客wl6E9U$E E9F:X&^%H7A%V

0SSr5~TEu
v\4c"y&q2_                       深入分析各种raid模式
1Ih;Yg2Z0Ol5x
;|"} TULV6x x@
u}^r#g6C!_d-\"PDOIT博客c,}U]4l(t]5u

BO;eWru|]L?B9?FDOIT博客&C!~KZ hS&c7_

UJ${8@w4D                    中国航信研发中心   冬瓜头
(Z*G~-b_@T
}.I xv-A/W g)b%}+HDOIT博客 DZ|"{F @$O

Ztkp(~vw
pv%}7a/ajx^ d本文从低层原理上,深入透析了目前存在的7raid模式的组成原理,结构,并深刻分析了各种级别相对于单盘IO速率的变化。DOIT博客2Y$nZY~s
Raid0
Xl@(x U'uGRaid0是这样一种模式:我们拿5块盘的raid0为例子。DOIT博客 d2x a2hm"u n

-C j6` t.w!w#v上图中5个竖条,分别代表5个磁盘上的一个extent,也就是竖条的意思,每个磁盘被逻辑的划分为N个这种extent。然后再在磁盘相同偏移的extent上,横向逻辑分割,形成strip,一个strip横跨过的extent个数,称为strip lenth,而一个strip和一个extent交叉带,称为一个segment,一个segment中所包含的data block个数,称为strip depthData block,可以是N倍个扇区大小的容量,应该可以调节,或者不可调,随控制器而定。
y DO'] iRaid0便是将一系列连续编号的data block,分布到多个物理磁盘上,扩散IO,提高性能。其分布的方式,如图所示:这个例子中,条带深度为4,则0123data block,被放置到第一个条带的第一个segment中,然后4567block,放置到第一个条带的第二个segment中,依此类推,条带1放满后,继续放条带2。这种特性,称为“局部连续”,因为block只有在一个segment中是物理连续的,逻辑连续,就需要跨物理磁盘了。
&W2S#QIY;H3F3j"?对外来说,参与形成raid0的各个物理盘,会组成一个逻辑上连续,物理上也连续的虚拟磁盘。磁盘控制器对这个虚拟磁盘发出的指令,都被raid控制器截获,分析,根据block映射关系公式,转换成对组成raid0的各个物理盘的真实物理IO请求指令,收集或写入数据之后,再提交给主机磁盘控制器。
2C*Kj'NoRai0还有另一种非条带化模式,即写满其中一块物理磁盘之后,再接着写另一块,直到所有组成磁盘全部写满。这种模式,对IO写没有任何优化,但是对IO读,能提高一定的并发IO读几率。
4d/B2Q(C2e$L5p在进一步讲述raid0和其他raid级别之前,我们先来看一下IO的种类。IO按照可以分为:读/IO,大/小块IO,连续/随机IO,顺序/并发IO。下面我们来分别介绍每一种IO
:G&^F"C4?G"fh/IO,这个就不用多说了,读IO,就是发指令,从磁盘读取某段扇区的内容。指令一般是通知磁盘开始扇区位置,然后给出需要从这个初始扇区往后读取的连续扇区个数,同时给出动作是读,还是写。磁盘收到这条指令,就会按照指令的要求,读或者写数据。控制器发出的这种指令+数据,就是一次IO,读或者写。DOIT博客EBD9NNqj
/小块IO,指控制器的指令中给出的连续读取扇区数目的多少,如果数目很大,比如12864等等,就应该算是大块IO,如果很小,比如148等等,就应该算是小块IO,大块和小块之间,没有明确的界限。
\5W2qSJs-|'E ]%{连续/随机IO,连续和随机,是指本次IO给出的初始扇区地址,和上一次IO的结束扇区地址,是不是完全连续的,或者相隔不多的,如果是,则本次IO应该算是一个连续IO,如果相差太大,则算一次随机IO。连续IO,因为本次初始扇区和上次结束扇区相隔很近,则磁头几乎不用换道或换道时间极短;如果相差太大,则磁头需要很长的换道时间,如果随机IO很多,导致磁头不停换道,效率大大降底。
a+_I-F-A4{顺序/并发IO,这个的意思是,磁盘控制器每一次对磁盘组发出的指令套(指完成一个事物所需要的指令或者数据),是一条还是多条。如果是一条,则控制器缓存中的IO队列,只能一个一个的来,此时是顺序IO;如果控制器可以同时对磁盘组中的多块磁盘,同时发出指令套,则每次就可以执行多个IO,此时就是并发IO模式。并发IO模式提高了效率和速度。DOIT博客K{ebo?
说完了4IO模式,我们再来说2个概念:DOIT博客 }\1CXZOi.A
IO并发几率。单盘,IO并发几率为0,因为一块磁盘同时只可以进行一次IO。对于raid02块盘情况下,条带深度比较大的时候(条带太小不能并发IO,下面会讲到),并发2IO的几率为1/2。其他情况请自行运算。DOIT博客AU1fb;@(f)V4[g
IOPS。一个IO所用的时间=寻道时间+数据传输时间。IOPSIO并发系数/(寻道时间+数据传输时间),由于寻道时间相对传输时间,大几个数量级,所以影响IOPS的关键因素,就是降底寻道时间,而在连续IO的情况下,寻道时间很短,仅在换磁道时候需要寻道。在这个前提下,传输时间越少,IOPS就越高。
Cp'k-Q{每秒IO吞吐量。显然,每秒IO吞吐量=IOPS乘以平均IO SIZEIo size越大,IOPS越高,每秒IO吞吐量就越高。设磁头每秒读写数据速度为VV为定值。则IOPSIO并发系数/(寻道时间+IO SIZE/V,代入,得每秒IO吞吐量=IO并发系数乘IO SIZEV/V乘寻道时间+IO SIZE。我们可以看出影响每秒IO吞吐量的最大因素,就是IO SIZE和寻道时间,IO SIZE越大,寻道时间越小,吞吐量越高。相比能显著影响IOPS的因素,只有一个,就是寻道时间。DOIT博客0Z"V4Hy+h;Mw*^@

D)UA.Bi${9b下面我们来具体分析一个从上到下访问raid0磁盘的过程。假如某一时刻,主机控制器发出指令:读取初始扇区10000
@m'x!Wo zq^长度128Raid控制器接受到这个指令之后,立即进行计算,根据对应公式(这个公式是raid控制器在做逻辑条带化的时候制定的)算出10000号扇区所对应的物理磁盘的扇区号,然后依次计算出逻辑上连续的下128个扇区所在物理磁盘的扇区号,之后,分别向对应这些扇区的磁盘,再次发出指令,这次是真实的读取数据了,磁盘接受到指令,各自将数据提交给raid控制器,经过控制器在cache种的组合,再提交给主机控制器。DOIT博客9dN2C)LnA
分析以上过程,我们发现,如果这128个扇区,都落在同一个segment中的话,也就是说条带深度容量大于128个扇区的容量(64K),则这次IO就只能真实的从这一块物理盘上读取,性能和单盘相比会减慢,因为没有任何优化,反而还增加了raid控制器额外的计算开销。所以要提升性能,让一个IO尽量扩散到多块物理盘上,就要减小条带深度,磁盘数量不变的条件下,也就是减小条带大小strip size。让这个IO的数据被控制器分割,同时放满第一个segment、第二块物理磁盘上的第二个segment。。。。。。。依此类推,这样就能极大的占用多块物理盘。在这里大家可能存在一个误区,就是总是以为控制器是先放满第一个segment,再放满第二个segment,其实是同时进行的,因为控制器把每块盘要写入或者读取的数据都计算好了,是同时进行的。所以,raid0要提升性能,条带做的越小越好。但是这里又一个矛盾出现了,就是条带太小,导致并发IO几率降底,因为如果条带太小,则每次IO一定会占用大部分物理盘,而队列中的IO就只能等待这次IO结束后才能使用物理盘。而条带太大,又不能充分提高传输速度,这两个是一对矛盾,按照需求来采用不同的方式。
T&A/cR.Ux/^
.I'yI!Xj,ZR QDOIT博客 p$Lm d$N_ J:o6|
我们接着分析raid0相对于单盘的性能变化。根据以上总结出来的公式,可以推得以下表格:

RAID0

d;vKXD'}g0hX

`V0i}c2U1x

-W0L8J"hRf+Z

IOPSDOIT博客PO.g"BQ joZ,`%r

DOIT博客6@C r7R uL'X)hM

DOIT博客Q|SWeo%wFZ

DOIT博客;A4O5P XF

0Fup7?o"|EE7eDOIT博客6Gg N+]L

O8ZY%} ]$@1A(L1[

/w9L O"[7Q

aq[onn

并发IO

LM-U#T1ZNtDOIT博客7o3T!l'_{t"h%uO

DOIT博客|,V"W9D9y F

顺序IODOIT博客n+NT(C B,R1`

lg3B\E QrYDOIT博客1?{!]BN

并发IO

!b0Jb:j9Z/~j]

1{z5By&u YJ5UDOIT博客0@A Mvc

顺序IO

JpX?ZeDOIT博客"t ~.B&b*TJ Rv

:]D`q(s a

随机IODOIT博客_c*l%_ |7m"w

7\7q%g\,eb#Fb0dDOIT博客?|!Rr)p|

连续IO

J#GU1i.c@T9Z

PM9[#lg:|q;l

FB @A6e3Qxt

随机IO

GX"q_'ODOIT博客6N2X0?9Sp1u

DOIT博客+NCo,UPyrH|

连续IO

!e"b2x aCXrDOIT博客#HT@^p!a

DOIT博客|"I ?+{6v:B'C}%s

随机IO

3l&yh8GX

#[ Cw,A2y:dt _ H,EDOIT博客q bLg+H*iI1i2a

连续IO

#dji8p e'uDOIT博客0Y0Y._^!?#U2F

ye%KDg x:`

随机IODOIT博客.cOz?P.N1Tu8Oz m

DOIT博客M vXC;E;F+mGiz

y*X3NJ#y n-u

连续IODOIT博客 t-Z XXX;]/eb

DOIT博客"n#}H%Ga#@*NbvZ

DOIT博客 MW.e3u)O8I

Io size/strip size较大DOIT博客f#Hw7F;rL Ht1n(?

DOIT博客-]"s-Lrh5b

3]&Z$FG#M u

不支持

A8^uv EoDOIT博客 V6EE"wDx6K dv!|

DOIT博客'p'j#u?FE

不支持

kE+^Q6b4k%o8TF

I@^p)rA*`_DOIT博客1IE)zQ7\\

提升极小

4D;n'aG4pDOIT博客(d$Jya3u

DOIT博客 Jw fbm/f

提升了N乘系数倍

I9n!R`B:X

` }z n zH&Rmm

-M-y-{6Wk|_%J

不支持

H E J#P5y!q

:MfL#a9woDOIT博客kQ1_y s i8\

不支持DOIT博客_ oE-n$J2r1[AE

DOIT博客f+B+Xy D#rk

DOIT博客!`9s_F1v@ A |

提升极小DOIT博客-d1R0[ tV

DOIT博客VgR(NX} e

z{"IIsD)@9h8r8_'m

提升了N乘系数倍DOIT博客,nV _e^G:~

dX\:o N#SDOIT博客L0l]:Q,s j+~tQklN

Io size/strip size较小

@%Sx Rj%z

e zvw-G#?Q)ACDOIT博客b3U+rh Z2SG:n!u8F

提升了(1+并发系数)倍

;Z}*vhKjA,@*qu%EDOIT博客PG'\VfaGmOC+A

2O#X,x+Ilc

提升了(1+并发系数+系数)系数倍

0m!}C.U ho`DOIT博客 X;p v Nch$u:{

3m%_@qV W

提升极小DOIT博客l!a aO(EA:\*nDP

DOIT博客EX}"[!GT

DOIT博客:Dou1m1f

提升了系数倍DOIT博客3A0]?cFp

DOIT博客@:ACR:mWn

6|6O8z,xD#`L&~

提升了(1+并发系数)倍

9pt9u3X.i JZdGc

%t`i?4E6V!K Z9\|DOIT博客 W^*ONe A3P%NT#s&J

提升了(1+并发系数+系数)倍DOIT博客tT4SqH$y

DOIT博客_P5Ul-u"d }

DOIT博客+IM6uY/dB`gf'G

提升极小DOIT博客`"FQ,Q4LA]}w8r n

8`.|6^f8NV|*a!S

6he%f3[a|Vj,XL

提升了系数倍DOIT博客.iNp3Vr1s-Hog$j

j"|!L#Q@QZ{#\

"dG.E)od-S
注:并发IOIO size/strip size是一对矛盾,两者总是对立。N=组成raid0的磁盘数目。系数=io size/strip size和初始LBA地址所处的strip偏移综合系数,大于等于1。并发系数=并发IO的数量DOIT博客Ri/kr0hX

Q4uW\&^c
`;r:|d"f,D9rz O
q)h fvl*S:JYEd
d4uo?#HDOIT博客:Mq1VD1| T8[
[size=10.5pt]Raid1DOIT博客 t^{l'U!U;^yHU ^+XN
[size=10.5pt]Raid1是这样一种模式,我们拿[size=10.5pt]2块盘的例子来说明:[size=10.5pt]
SqU!_3`'p+V5m n+qm[size=10.5pt]DOIT博客@l7B T2~$b(N
DOIT博客'j-N,oK2uW)K?eT/Q
[size=10.5pt]
Fw(\B5Y2^N
O'y't4y@7mP[size=10.5pt]Raid1[size=10.5pt]raid0不同,[size=10.5pt]raid0对数据没有任何保护措施,每个[size=10.5pt]block都没有备份或者校验保护措施。[size=10.5pt]Raid对虚拟逻辑盘上的每个物理[size=10.5pt]block,都在物理盘上有一份镜像备份。也就是说数据有两份。对于[size=10.5pt]raid1的写[size=10.5pt]IO,速度不但没有提升,而且有所下降,因为数据要同时向多块物理盘写,时间以最慢的你个为准,因为是同步的。而对于[size=10.5pt]raid1的读[size=10.5pt]IO请求,不但可以并发,而且就算顺序[size=10.5pt]IO的时候,控制器也可以象[size=10.5pt]raid0一样,从两块物理盘上同时读数据,提升速度。[size=10.5pt]Raid1没有[size=10.5pt]srip的概念。同样我们总结出一个表格:[size=10.5pt]

RAID1

@7N(^ zW5Cq4L

NyX3yRT

'e]t a#V

IOPSDOIT博客 Zu:h*iUh ~G1jJ

cm0detq1f

!m1{8{ su:p6IN M0q-M

DOIT博客+~ l&@]Q9@

DOIT博客O%I,_6U"z3ua@%C

bVy(Jqzz!R,S.[

0K%?l^9tT$tF7U#e

/e(Q X(v#[/aNR8Z M

:Cdx Rc

并发IO

5X9N X J~fDOIT博客zMQ4o Hi;m*U

DOIT博客bq U.bx

顺序IODOIT博客XCQ7pQ [c j

DOIT博客$nj9c'f6Z_R s

0j.N*H8xP2q,`(s

并发IO

LVt7c8|1kG!VDOIT博客:i+ZuFf `!A i3vM*et

;f#Ip8^t(c.[q

顺序IODOIT博客sh3b f u

DOIT博客XHC7cSP/t!d

DOIT博客0J`$y;?Kb3z1OW

随机IO

NRy_5kb

l/G-@6iSO5a"u S y BDOIT博客Ln(J4kb U\

连续IO

F/G8cd&B3n MjDOIT博客(i\b `(@V

K(T'\t _6Pzq

随机IODOIT博客2e*dJTj,mQS

DOIT博客 r`q$M UnC&V

DOIT博客 @Te b9g7o8K(k9Sw

连续IO

(j1t:B'D[ J$Q[$dVDOIT博客dB*UX F V7jG

DOIT博客`0PDsiQ#jQl

随机IO

2C _(w1d;w0Z us2C2xb@DOIT博客S|+vugz$t,][*^1T_

DOIT博客f"Zo]b&N qZ!U:F

连续IO

^A&M H l+So&s+EDOIT博客2v(~^v _

DOIT博客-Pt1idp4G

随机IODOIT博客&P#R9`A/q o}2T&I

DOIT博客&ogxa/C9J

DOIT博客E(K-Q%I.eH8sS

连续IODOIT博客g}d.[4?q0P@8I

s5F9VDS)T#dDOIT博客q(cg4iQb

Cu0|)mz L#lDOIT博客$| `0vL8l

DOIT博客:G9SkR;SN,phBy

提升N或者并发系数倍DOIT博客SXE"fQ)VH6A

'd1Z s"r.\Q

7v8[%M(o6x l

提升N倍或者并发系数DOIT博客deS)teB!K3` l,wo

t5YB#i@^f7j}fDOIT博客$pJ*[1T+E!e

提升极小DOIT博客/y]4d1ne

F#@.V1{4iH

*uZ)R^Uus,f0Q:P

提升了N

/eJeLKeD K

_ I|"U5YH$n

}*D A Q&vf)]

不支持

o5v du^H MDOIT博客Ld2XeD\T

:p'xa(x1fh)K,{'R

事物性IO可并发,提升并发系数倍DOIT博客vbs@5|Z.Z'e+[v9un

DOIT博客s,U[!k(x-qX e*P

DOIT博客})xRI&B9Q

没有提升DOIT博客1?ib4W*lQX

DOIT博客Y"J*Q3R6w| |

,YZ&}0r+sK {

没有提升

/j7p0g5a,K;|3?M2k ?DOIT博客,ke"U9T"{ T?

DOIT博客MBa V)t)k

注:raid1没有strip的概念。N=组成raid1镜像物理盘的数目。
+c-\1?^UqI[size=10.5pt]DOIT博客S zl@*gd[?P;n
DOIT博客f%z3i*sj X e
在读、并发[size=10.5pt]IO的模式下,由于可以并发[size=10.5pt]N[size=10.5pt]IO,每个[size=10.5pt]IO占用一个物理盘,这就相当于提升了[size=10.5pt]N倍的[size=10.5pt]IOPS。由于每个[size=10.5pt]IO只独占了一个物理盘,所以速度相对于单盘并没有改变,所以不管是随机还是顺序[size=10.5pt]IO,相对单盘都不变。[size=10.5pt]
kH*SB`w`在读、顺序[size=10.5pt]IO、随机[size=10.5pt]IO模式下,由于[size=10.5pt]IO不能并发,所以此时一个[size=10.5pt]IO可以同时读取[size=10.5pt]N个盘上的内容,但是是在随机[size=10.5pt]IO模式下,那么寻道时间影响很大,纵使同时分块读取多个磁盘的内容,也架不住寻道时间的抵消,所以性能提升极小[size=10.5pt]
S_`6U8`8U在读、顺序[size=10.5pt]IO、连续[size=10.5pt]IO模式下,寻道时间影响到了最低,此时传输速率为主要矛盾,同时读取多块磁盘的数据,时间减少为[size=10.5pt]1/N,所以性能提升了[size=10.5pt]N倍。[size=10.5pt]
8L[8CA}x&FN[size=10.5pt]IO的时候和读[size=10.5pt]IO情况相同,就不做分析了。写[size=10.5pt]IO因为要同时向每块磁盘写入备份数据,所以不能并发[size=10.5pt]IO,也不能分块并行。但是如果控制器把优化算法做到极至的话,还是可以并发[size=10.5pt]IO的,比如控制器从[size=10.5pt]IO队列中提取连续的多个[size=10.5pt]IO,可以将这些[size=10.5pt]IO合并,并发写入磁盘。前提这几个[size=10.5pt]IO必须是事物性的,也就是说[size=10.5pt]LBA必须连续,不然不能作为一个大的合并[size=10.5pt]IO,而且和文件系统也有关系,文件系统碎片越少,并发几率越高。[size=10.5pt]DOIT博客!eo7?(j a6Q
[size=10.5pt]DOIT博客gu1LeF t.q`#B2y0cN
[size=10.5pt]
#mXe~%jN;Y c[size=10.5pt]DOIT博客(`v}'~i
[size=10.5pt]Raid2DOIT博客D:n#\&G @/C
[size=10.5pt]
%Wg&{-g"s.E4qMoE[size=10.5pt]raid2是一种比较特殊的[size=10.5pt]raid模式,他是一种专用[size=10.5pt]raid,现在早已被淘汰。他的基本思想是,[size=10.5pt]IO到来之后,控制器将数据分割开,在每块物理磁盘读或者写[size=10.5pt]1bit。这里有个疑问,磁盘的最小[size=10.5pt]IO单位是扇区,[size=10.5pt]512字节,如何写入[size=10.5pt]1bit呢?其实这个写入[size=10.5pt]1bit,并非只写入[size=10.5pt]1bit。我们知道上层[size=10.5pt]IO,可以先经过文件系统,然后才通过磁盘控制器驱动来向磁盘发出[size=10.5pt]IO,最终的[size=10.5pt]IO大小,都是[size=10.5pt]N倍的扇区,也就是[size=10.5pt]Nx512字节,[size=10.5pt]N大于等于[size=10.5pt]1,不可能发生[size=10.5pt]N小于[size=10.5pt]1的情况,即使你需要的数据只有几个字节,那么也同样要读出或者写入整个扇区,也就是[size=10.5pt]512字节。明白这个原则之后,我们再来看一下[size=10.5pt]raid2中所谓的“每个磁盘写[size=10.5pt]1bit”是个什么概念。[size=10.5pt]IO最小单位为扇区,[size=10.5pt]512字节,我们就拿一个[size=10.5pt]4块数据盘+[size=10.5pt]3块校验盘的[size=10.5pt]raid2系统给大家来说明一下。这个环境中,[size=10.5pt]raid2的一个条带大小是[size=10.5pt]4bit[size=10.5pt]1bit[size=10.5pt]4块数据盘),而[size=10.5pt]IO最小单位是一个扇区,那么如果分别向每块盘写[size=10.5pt]1bit,就需要分别向每块盘写一个扇区,每个扇区只包含[size=10.5pt]1bit有效数据,这显然是不好的,因为太浪费空间,没有意义。因为[size=10.5pt]IO数据到来时,我们拿以下[size=10.5pt]IO请求为例:写入初始扇区10000
d2TWF:v长度1,这个IO目的是要向LBA10000写入一个扇区的数据,也就是512字节。Raid2控制器接受到这512字节的数据之后,先将其放入cache,然后计算需要写入的物理磁盘的信息,比如定位到物理扇区,分割数据成bit,然后一次性写入物理磁盘扇区。也就是说第一块物理盘,控制器会写入本次IO数据的第159131721。。。。。。。。。。。等等位,第二块物理盘会写入2610141822。。。。。。。。。。等等位,其他两块物理盘同样方式写入。直到这样将数据写完。我们可以计算出来,这512字节的数据写完之后,此时每块物理盘只包含128字节的数据,也就是一个扇区的四分之一,那么这个扇区剩余的部分,就是空的。如果要利用起这部分空间,那么等下次IO到来之后,控制器对数据进行bit分割,将要填入这些空白区域的数据,控制器将首先读出原来的数据,然后和新数据合并之后,一并再写回这个扇区,这样做效率和速度都大打折扣。我们可以发现,其实raid2就是将原本连续的一个扇区的数据,以位为单位,分割存放到不连续的多块物理盘上,因为这样可以全组并行读写,提高性能。每个物理磁盘扇区其实是包含了N个扇区的“残体”。那么如果出现需要更新这个IO4个扇区中某一个扇区的情况,怎么办?这种情况下,必须先读出原来的数据,和新数据合并,然后在一并写入。其实这种情况出现的非常少。我们知道上层IO的产生,一般是需要先经过os的文件系统,然后才到磁盘控制器这一层的。所以磁盘控制器产生的IO,一般都是事务性的,也就是这个IO中的所有扇区,很大几率上对于上层文件系统来说,是一个完整的事务,所以很少会发生只针对这个事务中某一个原子进行读写的情况。这样的话,每次IO很大几率都会包含入这些逻辑上连续的扇区的,所以不必担心经常会发生那种情况,即便发生了,控制器也只能按照那种低效率的做法来做,不过总体影响较小。但是如果随机IO比较多,那么这些IO初始LBA,很有可能就会命中在一个两个事务交接的扇区处,这种情况,就导致速度和效率大大降低了。连续IO出现这种情况的几率非常小了。
:Y0f-}7[ PO Z[size=10.5pt]Raid2因为每次读写都需要全组磁盘联动,所以为了最大化其性能,最好保证每块磁盘主轴同步,使得同一时刻每块磁盘磁头所处的扇区逻辑编号都一致,并存并取,达到最佳性能,如果不能同步,则会产生等待,影响速度。[size=10.5pt]
C0b&sY$s*R%t/M基于[size=10.5pt]raid2的并存并取的特点,[size=10.5pt]raid2不能实现并发[size=10.5pt]IO,因为每次[size=10.5pt]IO都占用了每块物理磁盘。[size=10.5pt]DOIT博客r:T C%Dag4Gi
[size=10.5pt]Raid2的校验盘对系统不产生瓶颈,但是产生延迟,因为多了计算校验的动作。校验位和数据位是一同并行写入或者读取的。[size=10.5pt]Raid2采用海明码来校验数据,这种码可以判断修复一位错误的数据,并且使用校验盘的数量太多,[size=10.5pt]4块数据盘需要[size=10.5pt]3块校验盘,但是随着数据盘数量的增多,校验盘所占的比例会显著减小。[size=10.5pt]DOIT博客!Q#vqsY2F%A%jl
[size=10.5pt]Raid2[size=10.5pt]raid0有些不同,[size=10.5pt]raid0不能保证每次[size=10.5pt]IO都是多磁盘并行,因为[size=10.5pt]raid0的分块相对[size=10.5pt]raid2以位为单位来说是太大了,而[size=10.5pt]raid2由于她每次[size=10.5pt]IO都保证是多磁盘并行,所以其数据传输率是单盘的[size=10.5pt]N倍,为了最好的利用这个特性,就需要将这个特性的主导地位体现出来,而根据IOPSIO并发系数/(寻道时间+数据传输时间),寻道时间比数据传输时间大几个数量级,所以为了体现数据传输时间减少这个优点,就必须避免寻道时间的影响,而避免其影响的最佳做法就是:尽量产生连续IO而不是随机IO,所以,raid2最适合连续IO的情况。另外,根据每秒IO吞吐量=IO并发系数乘IO SIZEV/V乘寻道时间+IO SIZE,如果将IO size也增大,则每秒IO吞吐量也将显著提高。所以,raid2最适合的应用,就是:产生连续IO,大块IO的情况,不言而喻,文件服务,视频流服务等等这些应用,适合raid2,不过,raid2的缺点太多,比如校验盘数量多,算法复杂等等,它逐渐的被raid3替代了。[size=10.5pt]

RAID2

S6Qiu};o%S/~ ]DOIT博客1v5{4r5Xz

DOIT博客-e@%t6t Y$`ji%m

IOPSDOIT博客|N^{RAm)R&[

W4a&v(Ao*o3Xw

)yc*VB;D:l

DOIT博客/n[G3^a$D

6I2Q}2mTp3_ IDOIT博客)i\#b0A2z0T

{/D)qn5NDOIT博客F$H5kc TU3^(qMJq7s

x:KSj'm6C6z Z

顺序IODOIT博客[/[ iU;v8AR&MfxP

P!qF!@ P&wsDOIT博客@%?@9F'u;v`*d

顺序IODOIT博客zk{ov-TB0E

u;K(ef9r [dDOIT博客9OpsR p t5O+XT*wc-c

非事务性随机IO

kMU?0sh"u{X6mDOIT博客6A?M)H3t}

H3q5HNL O(L

事务性随机IODOIT博客^XKjn Z_.a{-[q

DOIT博客fJ2l'`K;c

DOIT博客3F1H:rq Z6h-H

连续IO

kp'b5Z0{DOIT博客4B B7Hq#EP

DOIT博客%DfH0oc2^]Q G@3l-L?D

非事务性随机IODOIT博客L eD gJU

DOIT博客|g`%[)w8b

U8Q([T Z2d:_ K

事务性随机IO

#`!P%p}9~5@&F U

/`r9Bmng

2vS[8Yd `4S

连续IODOIT博客4d F5hjQ

#u.NQu0cY

1{s$fo6QA

IO满足公式条件DOIT博客"L$H v7A*W aR

JFxa(w:dKDOIT博客ZR2tL7GC1H

提升极小DOIT博客s8P;ev2O2_+F6L&Vh

zSS NWI0D

\Z xn-c

提升极小

C6?;\3v{UDOIT博客1{@(K"ys? O&@'tOQ A

DOIT博客zt_B"AY

提升N

3^OhM v9d,R]

7b"X/Kk#L{$uR8nDOIT博客#cj+V"q1Tf

性能降低DOIT博客3Kp AL4p

O_&q8d.X)i}

3}8P7F1~[7@#}\ D R

提升极小DOIT博客ojdR Zc7FK

?2vm9lA x*T%_pDOIT博客!eO9m w%s C$K(xv2Q

提升N

^Sjsl\KAQ

M(Oc-qG"T|I

6{;|"^z'I/z;_U
注:[size=10.5pt]N=数据盘数量。[size=10.5pt]Raid2不能并发[size=10.5pt]IO
J@(oR[Og0Y[size=10.5pt]
g/@ Gb-~wA[size=10.5pt]DOIT博客H$o2Z2g `s.D
[size=10.5pt]DOIT博客G}.` m;P-{A]
[size=10.5pt]DOIT博客"Q@zu!UA"t
[size=10.5pt]
L0yXMl[size=10.5pt]Raid3
+b_ fB.|\X1}~#P[size=10.5pt]
?`"{*O3H由于[size=10.5pt]raid2缺点比较多,比如非事务性[size=10.5pt]IO对他的影响,校验盘数量太多等等。[size=10.5pt]Raid2的劣势,就在于它的将数据以[size=10.5pt]bit为单位,分割,将原本物理连续的扇区,转变成物理不连续,逻辑连续的,这样就导致了它对非事务性[size=10.5pt]IO的效率低下。为了从根本上解决这个问题,[size=10.5pt]raid3出现了。既然要从根本上解决这个问题,首先就是需要抛弃[size=10.5pt]raid2对扇区进行分散的做法。[size=10.5pt]Raid3保留了扇区的物理连续。[size=10.5pt]Raid2将数据以[size=10.5pt]bit为单位分割,这样为了保证每次[size=10.5pt]IO占用全部磁盘的并行性。而[size=10.5pt]raid3同样也保留了这个特点,但是没有以[size=10.5pt]bit为单位来分散数据,而就是以扇区或者几个扇区为单位来分散数据。[size=10.5pt]Raid3还采用了高效的[size=10.5pt]XOR校验算法,但是这种算法只能判断数据是否有误,不能判断出哪一位有误,更不能修正。[size=10.5pt]XOR校验使得[size=10.5pt]raid3不管多少块数据盘,只需要一块校验盘就足够了。[size=10.5pt]DOIT博客L:O f"@r
[size=10.5pt]Raid3的每一个条带,其长度很小,深度为[size=10.5pt]1。这样的话,每个[size=10.5pt]segment的大小一般就是[size=10.5pt]1个扇区或者几个扇区的容量。以上图的例子来看,[size=10.5pt]4块数据盘,一块校验盘,每个[size=10.5pt]segment,也就是图中的一个[size=10.5pt]block portion,假如为[size=10.5pt]2个扇区大小,也就是[size=10.5pt]1k,则整个条带大小为[size=10.5pt]4k,如果一个[size=10.5pt]segment大小为[size=10.5pt]8个扇区,即[size=10.5pt]4k,则整个条带大小为[size=10.5pt]16K[size=10.5pt]
8X \]sH Y3G^我们还是用一个例子来说明[size=10.5pt]raid3的作用机制。比如,一个[size=10.5pt]4数据盘,[size=10.5pt]1校验盘的[size=10.5pt]raid3系统,[size=10.5pt]segment size[size=10.5pt]2个扇区大小即[size=10.5pt]1k[size=10.5pt]raid3控制器接受到了这么一个[size=10.5pt]IO写入初始扇区10000DOIT博客%UL$[La4D6p I#V,y}
长度8,即总数据量为8512字节=4k。则控制器先定位LBA10000所对应的真实物理LBA,假如LBA10000恰好在第一个条带的第一个segment的第一个扇区上,那么控制器将这个IO数据里的第12512字节写入这个扇区,同一时刻,第34512字节会被同时写入这个条带的第二个segment中的两个扇区,其后的数据同样被写入第34segment中,此时恰好是4k的数据量。也就是说这4kIO数据,同时被写入了4块磁盘,每块磁盘写入了两个扇区,也就是一个segment,他们是并行写入的,包括校验盘,也是并行写入的,所以raid3的校验盘没有瓶颈,但是有延迟,因为增加了计算校验的开销。但现代控制器一般都使用专用的XOR硬件电路而不是cpu来计算xor,这样就使得延迟降到最低。上面那个情况是IO size刚好等于一个条带大小的时候,如果IO size小于一个条带大小呢?我们接着分析,还是刚才那个环境,此时控制器接收到IO大小为2K的写入请求,也就是4个连续扇区,那么控制器就只能同时写入两个磁盘了,因为每个盘上的segment2个扇区,其他两个磁盘此时就是空闲的,也只能得到两倍的单盘传输速率。我们再来看看IO size大于一个条带大小的情况,会发生什么。还是那个环境,控制器收到的IO size16k。则控制器一次所能并行写入的,是4k,这16k就需要分4批来写入4个条带。其实这里的分4批写入,不是先后,而还是同时,也就是这16k中的第15913k将由控制器连续写入磁盘1,第261014k,连续写入磁盘2,依此类推,直到16k数据全部写完,是并行一次写完,这样校验盘也可以一次性计算校验值并且和数据一同并行写入。而不是“分批”。DOIT博客 eF qK9B{oO
通过比较,我们发现,与其使得IO size小于一个条带的大小,空闲一些磁盘,不如使得Io size大于或者等于条带大小,使得没有磁盘空余。因为上层IO size是不受控的,控制器说了不算,但是条带大小是控制器说了算的,所以如果将条带大小减少到很小,比如2个扇区,一个扇区,则每次上层IO,一般情况下都会占用所有磁盘,进行并发传输。可以提供和raid2一样的传输速度,并避免raid2的诸多缺点。Raid3raid2一样,不能并发IO因为一个IO要占用全部盘,就算IO size小于strip size,因为校验盘的独享,也不能并发IO[size=10.5pt]

RAID3DOIT博客/hl1u ^dm0mx

gs8\MPB;Y

O8Uff`mzj

IOPS

UP_hP+H[ n[DOIT博客(Y7B#f vJ;oD

DOIT博客*}5Jq i(D:R }%U

nI-Gn?w\DOIT博客~@_4b+r(IuS

$P4_h)[ Em,a

#f+l5~Z[7v'k

#DLKYG7yQ8X4wJ }

s ctNDb K

并发IO

a$A.[0VWk:Ox

r0L!P?a9~/S%iH6Q$]DOIT博客S2E:J \5x.sMyBy

顺序IO

Ji [2KYtDOIT博客k%mm@GNy-T^B

DOIT博客n6Pg5z-x@

并发IO

z8T`+K*x

4| rP.o*V_M lDOIT博客[ wN m R:w?v@V

顺序IO

%[DB'C5RPh7Y:Oz^5F'X"XDOIT博客XHF#i})y

E6P~6H/Ey d1F

随机IO

\7fm)}:j-M&\ V

;B^r4Cn O6{)] ~"r

u iY3e&E0lF

连续IODOIT博客:e7U~!j`M#b%@ j0J;}Q3q

UV5w3KV%wB6`DOIT博客5|Y:H"D a:[ jJ

随机IODOIT博客 c_E%d}

DOIT博客f*i"X"{ r&P R3D

?6u+S8N)]!I$WO$W

连续IO

Xjxjzm{DOIT博客&vX,y.D3A E6[K8r

8{x*KA{Ya+pK

随机IODOIT博客6i%OEo3`

DOIT博客2Nk#KJ}2q o

DOIT博客)rS.HtX!a-};|5g

连续IODOIT博客#lU8p(U z!f9L

DOIT博客R;B X e*LC x5M

#D8?3f_6i e4a

随机IODOIT博客Xu3OK iLc

P4D1Ra;L-B(qrDOIT博客*Rd:U!Vs(r%K W

连续IO

2eMG M&H9tDDOIT博客\3u8nn7hrze'j

yM*AEu'oe

Io size大于strip size

G}~6Qh*mA%SDOIT博客k/IzT&\%k]$u#b6yP

^7}"q"^5sA+T9_

不支持

1P9x&a0\t

-_mjsF f0f-JDOIT博客9y'{,nj nL9F!S [

不支持

2[3e$V{X9wD)xDOIT博客7ZD Y/f_5aPZ

DOIT博客esF]1I"e+Z5U

提升极小DOIT博客3v9Rje@7I#S

DOIT博客9xjks;n

*Q A7dZ@4Pm!qZED

提升了N

D%[.u y8f&d2f#[r

.l6t'S)y:v:m{'p1eYDOIT博客H#aL1ON4{(Q

不支持DOIT博客#@[ aN^kS

DOIT博客W;WT(^:c/g

DOIT博客u fD2Iy;f7T

不支持

i2YMQIbW'LoDOIT博客2[{:GEPblG

_ W7o-nZ f+{-N2}

提升极小

q%u`QtDOIT博客 Vd?d D,Zq8s

DOIT博客pVE"Z~K;d+M8l

提升了NDOIT博客mv*T{S[ fp9X"?&H

DOIT博客/nw Oa(WO.~

v8sC*x6Q7s S| ?|

Io size小于strip size

4FZNw7NqE$L.I

oE1m U)XMd

b(Zd+]kc p(A-R`Z

不支持DOIT博客c6t\u I.~)C~ H[&Q

Z&nx}9wS_8n ~F8dDOIT博客V%Xx0W(@"C

事物性IO可并发,提升并发系数倍

:[ p2N6r%n#y*^%n QZ

2sf+VO7\TQgDOIT博客4Y0|ytw8R

提升极小

E ~:I-c \

t.i%zo1N;u*zDOIT博客;^?N#h!vF9y3R&q

提升了NIO size/strip size

C$q2R~q`0S5J

/n"] \3kW5VDOIT博客;x[/A&uw#x

不支持

L:DcaO!hD L

Mw*ob{.`DOIT博客.Yx.ev4](k9f_

事物性IO可并发,提升并发系数倍DOIT博客 d$\vf }3z(bO A*jz2`e0W

f0G*r+^+O sTYFDOIT博客4UHfxG0@

提升极小

|C?#Y6N

p,\9i$f hGQ

!s L#GT$~OI

提升了NIO size/strip sizeDOIT博客 ZN3| eP

JO\9t7|^SQ IDOIT博客)wAZZ1Xc8CS

注:[size=10.5pt]N=组成[size=10.5pt]raid3的数据磁盘数量。和[size=10.5pt]raid2相同,事物性连续[size=10.5pt]IO可能并发。[size=10.5pt]DOIT博客]%i0U@#n W?3p,`r
[size=10.5pt]raid2一样,[size=10.5pt]raid3同样也是最适合连续大块[size=10.5pt]IO的环境,但是它比[size=10.5pt]raid2成本更低,更容易部署。[size=10.5pt]
T {:[ c[c"^&X具体分析:[size=10.5pt]
k$Q/a;M8{o不管任何形式的[size=10.5pt]raid,只要是面对随机[size=10.5pt]IO,其性能比单盘没有大的优势,因为[size=10.5pt]raid作所的只是提高传输速率,并发[size=10.5pt]IO,容错。随机[size=10.5pt]IO只能靠降低单个物理磁盘的寻道时间来解决。而[size=10.5pt]raid不能优化寻道时间。所以随机[size=10.5pt]IO[size=10.5pt]raid3也同样没有优势。[size=10.5pt]DOIT博客U+|Su-}!Ov
连续[size=10.5pt]IO,因为寻道时间的影响因素可以忽略,[size=10.5pt]raid3最拿手,因为象[size=10.5pt]raid2一样,[size=10.5pt]raid3可以大大加快数据传输速率,因为他是多盘并发读写。所以理论上可以相对单盘提高[size=10.5pt]N倍的速率。[size=10.5pt]
Nz(E _igf%}@[size=10.5pt]
4G2i${0JA/i[size=10.5pt]DOIT博客tKy$An
[size=10.5pt]DOIT博客wB1P\-|1l
[size=10.5pt]
]9i B,^ @U(_9o[size=10.5pt]DOIT博客#J(~ S,E/g m
[size=10.5pt]DOIT博客Yg%lsFG}t8c C
[size=10.5pt]
0|}F5L"W:aQ[size=10.5pt]
F pG p~K/az[size=10.5pt]DOIT博客 HSf:H)J
[size=10.5pt]
OKl7ciO7yCC/N?*m2~[size=10.5pt]
t&o3~IK"d6C[size=10.5pt]
-iLB$v0nx4vx[size=10.5pt]DOIT博客3bsT3ev+N!s
[size=10.5pt]DOIT博客$V-Y6xY ] Z,y
[size=10.5pt]Raid4
3?&M"Bh/TQ9W[size=10.5pt]DOIT博客#d p:]/q!Ku4{
不管是[size=10.5pt]Raid2还是[size=10.5pt]raid3,他们都是为了大大提高数据传输率而设计,而不能并发[size=10.5pt]IO。诸如数据库等等应用,他们的特点就是随机[size=10.5pt]IO和小块[size=10.5pt]IO。想提高这种环境的[size=10.5pt]IOPS,根据公式:IOPSIO并发系数/(寻道时间+数据传输时间),随机读导致寻道时间很大,靠提高传输许率已经不是办法。所以观察这个公式,想在随机IO频发的环境中提高IOPS,唯一能够做的,只有提高IO并发系数,不能并发IO的,想办法让他并发IO,并发系数小的,想办法提高系数。[size=10.5pt]
7GX,BXzcn+k)nP[size=10.5pt]raid3的基础上,[size=10.5pt]raid4被发展起来。我们分析[size=10.5pt]raid3的性能的时候,曾经提到过一种情况,就是[size=10.5pt]io size小于[size=10.5pt]strip size的时候,此时有磁盘处于空闲状态,而如果抓住这个现象,同时让队列中的下一个[size=10.5pt]IO来利用这些空闲的磁盘,岂不是正好达到并发[size=10.5pt]IO的效果了么?所以[size=10.5pt]raid4将一个[size=10.5pt]segment的大小做的比较大,以至于平均[size=10.5pt]IO size总是小于[size=10.5pt]strip size,这样就能保证每个[size=10.5pt]IO少占用磁盘,甚至一个[size=10.5pt]IO只占用一个磁盘。[size=10.5pt]
tG0Wyh mQ是的,这个思想对于读[size=10.5pt]IO是对路子的,但是对于写[size=10.5pt]IO的话,有一个很难克服的问题,那就是校验盘的争用。考虑这样一种情况:[size=10.5pt]4块数据盘+[size=10.5pt]1块校验盘组成的[size=10.5pt]raid4系统,某时刻一个[size=10.5pt]IO占用了前两块盘+校验盘,此时虽然后两块是空闲的,可以同时接受新的[size=10.5pt]IO请求,但是如果接受了新的[size=10.5pt]IO请求,则新[size=10.5pt]IO请求同样也要使用校验盘,由于一块物理磁盘不能同时处理多个[size=10.5pt]IO,所以新[size=10.5pt]IO虽然占有了数据盘的写权限,但是写校验盘的时候,仍然要等旧[size=10.5pt]IO写完后,才能写入校验,新[size=10.5pt]IO才能完成,这样的话,就和顺序[size=10.5pt]IO无异了,数据盘可并发而校验盘不可并发,这样不能实现并发[size=10.5pt]IO[size=10.5pt]
:h.QX-q `;?rsvK'U)d下面我们来说几个概念。[size=10.5pt]
'm:E,iYg0cO Sv|5wU

整条写、重构写与读改写[size=10.5pt]

xA"Hg_&N]E mDOIT博客v#c0Y B1a BkU#J

DOIT博客+k@E g%`e

整条写([size=10.5pt]Full-stripe Write):整条写需要修改奇偶校验群组中所有的条带单元,因此新的奇偶校验值可以根据所有新的条带数据计算得到。不需要额外的读、写操作。因此,整条写是最有效的写类型。整条写的例子,比如[size=10.5pt]raid2[size=10.5pt]raid3。他们每次[size=10.5pt]IO总是几乎能保证占用所有盘,因此每个条带上的每个[size=10.5pt]segment都被写更新,所以控制器可以直接利用这些更新的数据计算出校验数据之后,在数据被写入数据盘的同时,将计算好的校验信息写入校验盘。[size=10.5pt]

0{q5MjN9Z h9B4H O

$W;R-v/M|%`^DOIT博客i-r'm?+Si

重构写([size=10.5pt]Reconstruct Write):如果要写入的磁盘数目超过阵列磁盘数目的一半,采取重构写方式。在重构写中,从这个条带中不需要修改的[size=10.5pt]segment中读取原来的数据,再和本条带中所有需要修改的[size=10.5pt]segment上的新数据计算奇偶校验值,并将新的[size=10.5pt]segment数据和没有更改过的[size=10.5pt]segment数据以及新的奇偶校验值一并写入。显然,重构写要牵涉更多的[size=10.5pt]I/O操作,因此效率比整条写低。重构写的例子,比如[size=10.5pt]raid4中,如果数据盘为[size=10.5pt]8块,某时刻一个[size=10.5pt]IO只更新了一个条带的[size=10.5pt]6[size=10.5pt]segment,剩余两个没有更新,则重构写模式下,会将没有被更新的两个[size=10.5pt]segment的数据读出,和需要更新的前[size=10.5pt]6[size=10.5pt]segment的数据计算出校验数据,然后将这[size=10.5pt]8[size=10.5pt]segment连同校验数据一并写入磁盘。可以看出,这个操作只是多出了读两个[size=10.5pt]segment中数据的操作。[size=10.5pt]

,k,HU_m?T6x?9I

X6Q@'ye.vC

{R*gC9jN

读改写([size=10.5pt]Read-Modify Write):如果要写入的磁盘数目不足阵列磁盘数目的一半,采取读改写方式。读改写过程如下:([size=10.5pt]1)从需要修改的[size=10.5pt]segment上读取旧的数据;([size=10.5pt]2)从条带上读取旧的奇偶校验值;([size=10.5pt]3)根据旧数据、旧校验值和需要修改的[size=10.5pt]segment上的新数据计算这个条带上的新的校验值;([size=10.5pt]4)写入新的数据和新的奇偶校验值。这个过程中包含读取、修改、写入的一个循环周期,因此称为读改写。读改写计算新校验值的公式为:新数据的校验数据=(老数据[size=10.5pt] EOR新数据)[size=10.5pt] EOR老校验数据。如果待更新的[size=10.5pt]segment已经超过了条带中总[size=10.5pt]segment数量的一半,则此时不适合使用读改写,因为读改写需要读出这些[size=10.5pt]segment中的数据和校验数据,而如果采用重构写,只需要读取剩余不准备更新数据的[size=10.5pt]segment中的数据即可,而后者数量比前者要少,所以超过一半,用重构写,不到一半,用读改写。整条更新,就用整条写。写效率:整条写[size=10.5pt]>重构写[size=10.5pt]>读改写[size=10.5pt]DOIT博客a:F C2X(R%k&J7V

Om5ly9R[$aG

E.@(^ N#E sL#c

[size=10.5pt]

#o-rXy(s2ut.{q9I'ZDOIT博客I ^+Z#p7CgS

DOIT博客_Sr Cfs\n't1N

明白了这些概念之后,我们就可以继续深入理解[size=10.5pt]raid4了。如果仅仅根据争用校验盘来下结论说[size=10.5pt]raid4不支持并发[size=10.5pt]IO,在经过了以上三个概念的描述之后,看来显然是片面的。我们设想这样一种情形,某时刻一个[size=10.5pt]IO只占用了全部磁盘的几块盘,另一些磁盘空闲,如果此时让队列中下一个[size=10.5pt]IO等待的话,那么当然不可实现并发[size=10.5pt]IO。此时我们考虑:如果队列中有这样一个[size=10.5pt]IO,它需要更新的[size=10.5pt]LBA目标和正在进行的[size=10.5pt]IO恰好在同一条带上,并且处于空闲磁盘,而又不冲突,那么此时我们恰好就可以让这个[size=10.5pt]IO也搭一下正在进行的[size=10.5pt]IO的顺风车,反正都是要更新这个条带的校验[size=10.5pt]segment,与其两个[size=10.5pt]IO先后更新,不如让他们同时更新各自的数据[size=10.5pt]segment,而控制器负责计算本条带的校验块。这样就完美的达到了[size=10.5pt]IO并发。但是,有个问题,这种情况遇到的几率真是小之又小。即便如此,控制器如果可以对队列中的[size=10.5pt]IO目标[size=10.5pt]LBA进行扫描,将目标处于同一条带的[size=10.5pt]IO,让其并发写入,这就多少类似[size=10.5pt]NCQ技术了,不过这种技术需要上层软件的配合,因为乱序[size=10.5pt]IO,会失去事务的顺序性,所以还需要上层软件作一些处理。[size=10.5pt]

(w*XZ/k7Q.gDOIT博客Nr#\k'ZDsZ1X c

DOIT博客ijyi fRrn-a2d

除了在控制器内部实现这种算法之外,我们还可以直接在上层来实现这种模式。上层就是指操作系统的文件系统。因为文件系管理着底层磁盘。文件系统决定数据写往磁盘上的哪些扇区。所以完全可以在文件系统这个层次上,将两个不同事物的[size=10.5pt]IO写操作,尽量放到相同的条带上,也就是说,比如一个条带大小为[size=10.5pt]16k,可以前[size=10.5pt]8k放一个[size=10.5pt]IO的数据,后[size=10.5pt]8k放也另一个[size=10.5pt]IO的数据,这两个[size=10.5pt]IO在经过文件系统的计算之后,经由磁盘控制器驱动程序,向磁盘发出同时写入整个条带的操作,这样就构成了整条写,如果实在不能占满整条,那么也应该尽量达成重构写模式,这样不但并发了[size=10.5pt]IO,还使得写效率增加。这种在文件系统专门为[size=10.5pt]raid4做出优化的方案,最点型的就是[size=10.5pt]netapp公司的磁盘阵列操作系统[size=10.5pt]data ontap,这个操作系统中文件系统模块称为[size=10.5pt]WAFLWAFL文件系统的设计方式确保能够最大限度地减少校验盘寻址操作。上图右半部对比显示了WAFL如何分配同样的数据块,从而使得RAID 4更加有效。WAFL总是把相关的数据块写到彼此邻近的条带中,消除校验盘上的长时间寻址操作。只要可能,WAFL也把多重数据块写到同样的条带中,从而进一步减少校验盘上的阻塞。FFS在上图左半部中使用六道独立的条带,因此致使六个校验盘块需要更新。上图右半部中,WAFL使用仅仅3道条带,即只有三个校验块需要更新。从而大大提高了RAID性能,消除了校验盘瓶颈。[size=10.5pt]

J)j,?&{v[$C8T4qDOIT博客,H_edM@4\p

DOIT博客i'qFt6`!j+S;wM

[size=10.5pt]

RAID4

{k:oiF2A)G!t,Tw

fz1UfC

:DF}Nt7r'y5M

IOPS

6g~{$yh7\)f?1B

)@^!d]0vN

&Nz/rm+m | x4S

DOIT博客-^4upC C$Asm

\(T x7`9H1v/th\.ODOIT博客+c&T-yOM#tbH

N] `N/[C7x/D1I;Z[IDOIT博客.A:X a;Z$c"Vm{

@ Dq)y&J

特别优化的并发IODOIT博客 _L6B;ek?lU

DOIT博客9tU#Tl[6d7Q

EC.n&P?

顺序IODOIT博客3_9l K:_w{9b5V3@!{

DOIT博客$[y)a'[ ]E

9o-?^8vmEE\+|4J

特别优化的并发IO

W YT3Q/p/P r]vDOIT博客)C/h~uLp i

ev$R]]C/Mz8v

顺序IO

cpjkvDOIT博客@7]W R2l1sF

6z!JiSj,w Y/X

随机IO

t!O6T4}0p1{P

2CBM ^3Tc ?']DOIT博客 Z0Gu6c,Z6v

连续IO

%~#MK0@5T2c3L,N3x^L

5RWgu c*A$AX#lPDOIT博客yFO5\W `%O#F CBZC

随机IO

&J*\K%x(R,p!_

w&@E6Q RF#h [ e*KDOIT博客n ^X9^ ExLE

连续IODOIT博客9i#k'rD1[

E7u;@W#f2YQ

t(|2Fky0n_i;R

随机IODOIT博客&O,M%Z~(^'~P

DOIT博客.~:FR+^i/sJ

DOIT博客r(meJ6l _No}

连续IODOIT博客$D2^ Y.A3g J

r.Y:e!^nDOIT博客+b;ns1o"Wwq6lX

随机IODOIT博客m2@N6OC`u

DOIT博客ib t|9X [

DOIT博客$V:zlU Ue

连续IO

5]xJ@9fE_DOIT博客S1t8nd{@q

[xsc"u-f

Io size/strip size较大

a9VK&~)m0sY/?6mDOIT博客2?zA-rP8|?}M.n

DOIT博客1v8pUk bN

冲突DOIT博客']s;i'|vY u

DOIT博客LwBS&~+YA

DOIT博客+vZf4J5pg"[1Z,L

冲突

&h9\2Ea:j@,? zi-x

M:VQ(l%ADOIT博客6^Z$}N+Q9b qd|oh

提升极小DOIT博客(i2vD [{N fr

DOIT博客T Aj!j W

DOIT博客z!vI\9|s

提升了NDOIT博客s(o7s7E3P@q}4oW

DOIT博客(w#k5gA3x6Z

@4} a)N@)|.T

冲突

A2B5|&Z%Wq"h

-lV8@]jPipNDOIT博客`3[7W U,X

冲突DOIT博客8v} h?q+?3sv{

b;G1Pb\5hDOIT博客zR],_X Z+r j

没有提升DOIT博客&A f|K@A$y

D r}o&m;p

3g)uSVN6Ir

提升了NDOIT博客&we]w'H'ogw)n

DOIT博客!{1yrOs.xw%^

DOIT博客C6Z$V AQ!X@6d9] z

Io size/strip size较小DOIT博客d{*B5Z(~#SF-D4O

Y"|-{d#x+}DOIT博客Ndee$Nh`yG

提升极小

(T S7Ol$_U8V JDOIT博客m:}F$K JU8J6o@NJ+l

DOIT博客/C$U*^COB!xb]

提升并发系数倍

(hmP;?I{ dRDOIT博客\q6Y~ e+?V:d

)Q5m!{hX2J

几乎没有提升

$jx'g M$f6l ^DOIT博客hO/}v r.t Bu

aW|&@)m1O w

几乎没有提升DOIT博客3@(H)^'@1\c

DOIT博客 jm'l2o(x*a.R O

DOIT博客 r-q.Jj*~.G.Mm(^|.L

提升并发系数倍DOIT博客m#_5ShY

DOIT博客 T{Efnh lkM6u

O7f1bxR$j @

提升并发系数乘NDOIT博客Z+VGu!y1}Q+]

8Kg dA8U-^R)G6YcDOIT博客9J^4e;I!K%cPf

性能降底

~BB| {%j5Gnvp

(d{x5RJ

8Oj{Zpg

性能降底

bs.O@jn6Z4cDOIT博客 F&iihe.A]

DOIT博客)T[#p!Sj#A

注:[size=10.5pt]N[size=10.5pt]raid4数据盘数量。[size=10.5pt]Io size/strip size太大则并发[size=10.5pt]IO几率很小。[size=10.5pt]DOIT博客f4T&o\ rt^
值得注意的是,如果[size=10.5pt]io size/strip size的值太小,则顺序[size=10.5pt]IO读,不管是连续还是随机[size=10.5pt]IO,几乎都没有提升。顺序[size=10.5pt]IO写,性能下降,因为[size=10.5pt]io size很小,又是顺序[size=10.5pt]IO,则只能进行读改写,性能降底不少。[size=10.5pt]DOIT博客^s%qQ#xA
所以,如果要使用[size=10.5pt]raid4,不进行特别优化,是不行的,至少要让他可以进行并发[size=10.5pt]IO。我们观察表格可知,并发[size=10.5pt]IO模式下,性能都有所提升。然而如果要优化到并发几率很高,实则不容易。目前只有[size=10.5pt]netapp[size=10.5pt]WAFL文件系统还在使用[size=10.5pt]raid4,其他产品均未见使用。面临淘汰,取而代之的是拥有高并发几率的[size=10.5pt]raid5系统。[size=10.5pt]DOIT博客/X.b;fe6O_d0W;P
[size=10.5pt]DOIT博客ddYn RPF8e
[size=10.5pt]
0]}7Ie.i$G:m7m8a[size=10.5pt]DOIT博客/EO] kD};RJ%fK
[size=10.5pt]
%K!s+zo'`D[size=10.5pt]DOIT博客z*TP)m7noFt
[size=10.5pt]DOIT博客%Lo&jNlM@6w R
[size=10.5pt]
(c"a D cj0w.G+Q3~KQ-Oa[size=10.5pt]DOIT博客)E8R.A0{[Y
[size=10.5pt]
8S-h-F8i!XW[size=10.5pt]
i6zIB(z,I@q[size=10.5pt]DOIT博客C \8^ ASt/r5?T${j
[size=10.5pt]
;VW xW\:D_[size=10.5pt]
zyPT7b2h[size=10.5pt]Raid5
Z4zg[ pE-Y;v[size=10.5pt]DOIT博客[I$D]f6P,c5u$K:`
[size=10.5pt]
q&p)FN2v V%z-D\*G[size=10.5pt]DOIT博客ll3D5Ay3UU^lrp
为了解决[size=10.5pt]raid4系统不能并发[size=10.5pt]IO困难的窘境,[size=10.5pt]raid5相应而出。[size=10.5pt]Raid4并发困难,是因为他的校验盘争用的问题,如果能找到一种机制,能有效解决这个问题,则实现并发就会非常容易。[size=10.5pt]Raid5恰恰解决了校验盘争用这个问题。[size=10.5pt]Raid5采用分布式校验盘的做法,将校验盘打散在[size=10.5pt]raid组中的每块磁盘上。如图所示。每个条带都有一个校验[size=10.5pt]segment,但是不同条带中其位置不同,在相邻条带之间循环分布。为了保证并发[size=10.5pt]IO[size=10.5pt]raid5同样将条带大小做的较大,以保证每次[size=10.5pt]IO数据不会占满整个条带,造成队列其他[size=10.5pt]IO等待。所以,[size=10.5pt]raid5如果要保证高并发率,那么每个[size=10.5pt]IO几乎都是读改写模式,尤其是在随机[size=10.5pt]IO的情况下,所以[size=10.5pt]raid5拥有较高的写惩罚,但是在随机[size=10.5pt]IO频发的环境下,仍然能保持较高的[size=10.5pt]IOPS[size=10.5pt]DOIT博客4s~4s G%F
们来分析一下[size=10.5pt]raid5具体的作用机制。以上图为例的环境,条带大小[size=10.5pt]80k,每个[size=10.5pt]segment大小[size=10.5pt]16k。某一时刻,上层产生一个写[size=10.5pt]IO写入初始扇区10000DOIT博客oO{#P}]
长度8,即写入4k的数据。控制器收到这个IO之后,首先定位真实LBA地址,假设定位到了第1个条带的第2segment(位于图中的磁盘2)的第1个扇区(仅仅是假设),则控制器首先对这个segment所在的磁盘发起IO写请求,读出这8个扇区中原来的数据到cache,与此同时控制器也向这个条带的校验segment所在的磁盘(即图中的磁盘1)发起IO读请求,读出对应的校验扇区数据并保存到cache,随后利用XOR校验电路来计算新的校验数据,利用公式:新数据的校验数据=(老数据[size=10.5pt] EOR新数据)[size=10.5pt] EOR老校验数据。现在[size=10.5pt]cache中存在:老数据,新数据,老校验数据,新校验数据。然后控制器立即再次向相应的磁盘同时发起[size=10.5pt]IO写请求,将新数据写入数据[size=10.5pt]segment,将新校验数据写入校验[size=10.5pt]segment,并删除老数据和老校验数据。[size=10.5pt]
*Oj4|6s(b"`.M S在上述过程中,这个[size=10.5pt]IO占用的,始终只有[size=10.5pt]1[size=10.5pt]2两块盘,因为所要更新的数据[size=10.5pt]segment我们假设位于[size=10.5pt]2盘的[size=10.5pt]1条带的[size=10.5pt]2[size=10.5pt]segment,而这个条带对应的校验[size=10.5pt]segment位于[size=10.5pt]1盘,自始至终其他任何磁盘都没有用到。那么如果此时队列中有这么一个[size=10.5pt]IO,他的[size=10.5pt]LBA初始目标假如位于图中下方红框所示的数据[size=10.5pt]segment中([size=10.5pt]4盘),[size=10.5pt]IO长度也不超过[size=10.5pt]segment的大小,而这个条带对应的校验[size=10.5pt]segment位于[size=10.5pt]3盘上,这两块盘未被其他任何[size=10.5pt]IO占用,所以,此时控制器就可以并发的处理这个[size=10.5pt]IO,和上方红框所示的[size=10.5pt]IO,达到并发。[size=10.5pt]DOIT博客r;j9P}Z p6m&\w
[size=10.5pt]Raid5相对于经过特别优化的[size=10.5pt]raid4来说,在底层就实现了并发,可以脱离文件系统的干预,任何文件系统的[size=10.5pt]IO,都可以实现高并发几率,而不像基于[size=10.5pt]wafl文件系统的[size=10.5pt]raid4,需要在文件系统上规划计算出并发环境。[size=10.5pt]DOIT博客;MgvA*L8LM
[size=10.5pt]Raid5磁盘数量越多,可并发的几率就越大。[size=10.5pt]

RAID5DOIT博客o'FB6~Yiz&?p&p p

ls&P!H8H/K x,^{

%x*_ ] Q?zf\N,b

IOPS

"mv&\-]Q~y1@

|B+A~ b1n_+?

bQ&GP-nVL)R(K:Q

DOIT博客H d}$az

ZZJ+V8v'TDOIT博客{xZ1X zX)hkf

_;aE&We

1W c n:u)X'e"d(QJ4fDOIT博客5CeG{f+PQ S"I{5Hf8y

并发IODOIT博客vI(w5R]P7A4o!Z2t

@*[0j$Q'e7KjDOIT博客s$Q+c#\fAE

顺序IO

F'WSK e(XrMoDOIT博客}:X U4geS!R`,_

DOIT博客"Lt;zo)~-r&F

并发IO

P i1E*O5A)i

a m)g;Z"lpb

2vU.LB(o jcHS

顺序IODOIT博客NJ0{%_,m1k)r

)ng,_6n1a/P,e_J&aDOIT博客&\,U"i7a[ko

随机IO

{.pk4n7C TL}F

n|:W7G B5O gk+E6\3b ~%w

?Ai!md4Q;m{)M

连续IODOIT博客#Ad6om2|0c0dz

5Hn N Tnx:@DOIT博客!itw}_H,i2Yr w

随机IO

b2VW}n*B1qDOIT博客)W!L h+Eu@O.A0ze

E V5B[ f

连续IODOIT博客&}};op(K#n@

DOIT博客K'MY`8zL`!y/A,tZ

DOIT博客n6v6c/ZVF6I

随机IO

|z[fGqTvDOIT博客:Z+b8s bL(X!^

I7Y#~.SZ(z2wE

连续IO

1Nr4F.{n2y }

/}g6f2g5osDOIT博客B5}OK3l9s^.iv_:\0s

随机IO

B$Cdg`$f}DOIT博客"\1xZn,tT

zlvUC8E/`VIa

连续IO

C H(K-v&f$flDOIT博客5Y3m@$n K1o*D

DOIT博客&J3QO+Cc2aQ/l

Io size近似strip size

'g|4pgdg'Q:C |

"E `.o5gF6GK&i

uT ?%g9z @LL

不支持DOIT博客q$j,s/y.X.~P9[2K

DOIT博客V1K%g$|[D d6j.y

DOIT博客"O1e.|.AW

不支持DOIT博客9} P#`8](M#V|

DOIT博客#D+Wo8I'o p(c I

DOIT博客 RoA-BO7n(c5\g.q

提升极小

5tX O%shf+xDOIT博客zd4J8O*@ b:G

DOIT博客H0zjq;x~{3?

提升了NDOIT博客Z$wr:Rv4u0o

&g_vw9a |2Q$Ymv m

2C@@4W?'H(yXes

不支持DOIT博客9B^1CQ T0?T

DOIT博客z6Q~@'a1sYk

DOIT博客btC+G(a

不支持DOIT博客*kKHC g;s;U

DOIT博客7D8w2W k Zx

DOIT博客{Vx f yS:T

提升极小DOIT博客.c Af"]P

DOIT博客1C7|-niI

DOIT博客|)eoh%bX {)v

提升了N

Z-u ^&q${N)Q l

T0s2H&YgS6|'Z6Q

p J{9x[WM(L#h

IO size大于segment size重构写DOIT博客Ky y0e2w-c

~-m'g/~ VW FkD9CDOIT博客] I!|%PZa%X\

提升并发系数倍DOIT博客4{d)]:r$\6SK#l{ B

!d%Elq ez YP6Ubd

[%f&L8d,Z7e _o

提升并发系数倍DOIT博客&miR3SJ/a%{k

'l-{NH3K+f])S)I}3lDOIT博客5U Uq&Y\

几乎没有提升

9S3n-Xy4]"IW9k r

2W"`t#Bfm7cnDOIT博客#m {*^O9@B'Gcx

提升了IO size/segment sizeDOIT博客.fb If1?7]

DOIT博客5Z$la3o9iC\*~

#^:ES:hXo

提升并发系数倍

fy Pf;pADOIT博客 B.c*b-ylot

DOIT博客&j T@ZCgO

提升并发系数倍

%}z{`F0W$X

%h o t8J3jS#sDOIT博客\'W[&a9@pxu-O

性能下降DOIT博客}*HSS]

DOIT博客 AS+p/?_C {

DOIT博客;f&o+h Xm{O _-W a,m

提升极小

1Y2qj#do??0rDOIT博客Ve(bF1p$]z9u Y

DOIT博客"pA\ A4`T@

Io size小于segment size读改写DOIT博客:BXfc$v9q

cCN:t4_c

*x(q}3T g wR

提升并发系数倍DOIT博客8jL,h;fKE

.b maZR5BL3~T

7RwG.\HFO

提升并发系数倍

Dt)['H w)L2Oh sDOIT博客JGC0j~

[ {#W SF

提升极小DOIT博客HBU.N c

DOIT博客6l,A/I~rE

DOIT博客R9CG-m!l

没有提升

`rFR(j JBr9_y

e}(E|C D3NI8j9G.`DOIT博客Y*l)I~1r\]1J

提升并发系数倍

$q;tEhu-wg

"fu7m#}6RH b PDOIT博客s"m$L-`?#z

提升并发系数倍

.m[Vl k;KI:c6J6Z

0E)Y _ ].}f6L)sO#m7kDOIT博客In3w kx7x

性能下降DOIT博客5f8Sq(_6B}T

@W8_n&o)c4D2GG1XDOIT博客3_ io,hE#R

性能下降DOIT博客g|;Y\vu

DOIT博客 ud;|_!o7WcC Sr.C

'{iOF7YtPNq
[size=10.5pt]raid5最适合小块[size=10.5pt]IO,并发[size=10.5pt]IO的情况下,性能都较单盘有所提升。[size=10.5pt]
k[q/xJ7Kbry[size=10.5pt]
u {bR%Ae^M[size=10.5pt]
)n p k~,Ke gz#?g)D[size=10.5pt]Raid6DOIT博客9I,X!o7] E5\3FQ
[size=10.5pt]
z8tP}1oNnK[size=10.5pt]raid6之前的任何[size=10.5pt]raid级别,最多能保障在坏掉一块盘的时候,数据仍然可以访问,但是如果同时坏掉两块盘,则数据将会丢失。为了增加[size=10.5pt]raid5的保险系数,[size=10.5pt]raid6被创立。[size=10.5pt]Raid6[size=10.5pt]raid5多增加了一块校验盘,同时也是分布打散在每块盘上,用另一个方程式来计算新的校验数据,这样,[size=10.5pt]raid6同时在一个条带上保存了两份数学上不相关的校验数据,这样能够保证同时坏两块盘的情况下,数据依然可以通过联立这两个数学关系等式来求解丢失的数据。[size=10.5pt]Raid6[size=10.5pt]raid5在写的时候,会同时读取或者写入额外的一份校验数据,不过由于是并行同时操作,所以比[size=10.5pt]raid5慢不了多少。其他特性和[size=10.5pt]raid5类似。[size=10.5pt]

RAID6