Linux内核RAID5写性能分析
前面的几篇博文大致介绍了下Linux内核中RAID5源码实现写的过程,那么今天我们就来分析下RAID5写性能如何,具体来说,应该是根据bio请求的大小来分析写延迟。
Background
首先我们先确定下测试的模型:3+1 RAID5,并且有
chunk_size=4∗page
,结构如下图。
上图中S0~S3均为stripe_head结构,A~P编号的块表示page编号,仅为下面表示容易些。如果不是很清楚stripe_head结构,或者容易将stripe与stripe_head结构搞混淆的同学可以查看我之前的博文:Linux内核中RAID5源码详解之基本架构与数据结构。
这里我们将一个chunk的大小设置为4*page,是为了更清楚的观察CPU中流水线情况,以便计算,而且这里只是提供了一种基本的计算方法,如果搞得太复杂,也没有那个必要的啦。
为了更清楚的计算写延迟,我们以CPU的角度观察bio请求从进入RAID5层到完成这个阶段所消耗的时间。并规定内存到磁盘 或者磁盘到内存的IO延迟为:
图中M:内存,D:物理磁盘,并且加入内存计算时间
α
。
接下来采用如下表达方式来简便记录写过程:
in A ,rmw //请求落在A块中,并采用rmw的方式进行写
read A,D: y //需要从磁盘中读取A,D两块中的数据,耗时y
compute: α //内存计算parity,耗时 α
write A,D: x //将A,D两块中的数据从内存中写到磁盘上,耗时x
total latency: x+y+α //总的耗时情况
写延迟计算
这里我们根据bio请求的大小,并且根据采用的rmw还是rcw的写决策来计算所花费的时间,从CPU的角度来整体看待这个时间基准。
bio_size < 4KB
in A , rmw, :A块非overwrite
read A,D : y
compute:α
write A,D : x
total latency:x+y+α bio_size = 4KB
in A , rcw:A块overwrite
read B,C: y
compute:α
write A,D: x
total:x+y+α 4KB < bio_size <8KB
In A,E;A块overwrite,E块非overwrite
S0: rcw
Read B,C: y
Compute:α
Write A,D: x
S1: rmw
Read E,H:y
Compute: α
Write E,H:x 这里就不能单纯的累加了,要从CPU的角度考虑流水线的情况,并且考虑磁盘的并行性,具体耗时如下图:
图中y 0,3表示读0号盘和3号盘,由于可以并行,顾只消耗 y ;x 0,3 表示将内存数据写到0号和3号磁盘上,还要考虑相同盘之间的IO顺序,因为一块盘不可能同时处理两个IO,因此有:total latency:
2x+y+α bio_size = 8KB
in A,E:A,E块均为overwrite
s0: rcw
read B,C: y
compute:α
write A,D: x
s1: rcw
read F,G:y
compute: α
write F,H:x
流水线情况:
total latency: 2x+y+α8KB < bio_size < 12KB
In A,E,I:A,E块overwrite,I块非overwrite
S0: rcw
read B,C: y
compute:α
write A,D: x
s1: rcw
read F,G:y
compute: α
write F,H:x
s2: rmw
read I,L: y
compute:α
write I,L: x
流水线情况:
total latency:3x+2y bio_size = 12KB
In A,E,I:A,E,I均为overwrite
S0: rcw
read B,C: y
compute:α
write A,D: x
s1: rcw
read F,G:y
compute: α
write F,H:x
s2: rcw
read J,K: y
compute:α
write J,K: x
流水线情况:
total latency:3x+y+α 12KB < bio_size <16KB
In A,E,I,M:A,E,I均为overwrite,M块非overwrite
S0: rcw
read B,C: y
compute:α
write A,D: x
s1: rcw
read F,G:y
compute: α
write F,H:x
s2: rcw
read J,K: y
compute:α
write J,K: x
s3: rmw
read M,P:y
compute: α
write M,P:x
流水线情况:
total latency: 4x+3ybio_size = 16KB
In A,E,I,M:均为overwrite
S0: rcw
read B,C: y
compute:α
write A,D: x
s1: rcw
read F,G:y
compute: α
write F,H:x
s2: rcw
read J,K: y
compute:α
write J,K: x
s3: rcw
read N,O:y
compute: α
write M,P:x
流水线情况:
total latency: 4x+y+α
对于更大的bio请求,相应的计算方法和上述的计算方法一样,在此不一一赘述,只需要采用流水线技术并且保证不同盘的并发和相同盘的IO互斥即可。
这只是简单的小例子,单纯的了解下如何计算RAID5写方式的延迟,希望能对你有帮助。
祝好~^_^