您的位置:首页 > 运维架构 > Linux

Linux内核RAID5写性能分析

2015-07-24 18:27 746 查看

Linux内核RAID5写性能分析

前面的几篇博文大致介绍了下Linux内核中RAID5源码实现写的过程,那么今天我们就来分析下RAID5写性能如何,具体来说,应该是根据bio请求的大小来分析写延迟。

Background

首先我们先确定下测试的模型:3+1 RAID5,并且有chunk_size=4∗pagechunk\_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:物理磁盘,并且加入内存计算时间α\alpha。

接下来采用如下表达方式来简便记录写过程:

in A ,rmw //请求落在A块中,并采用rmw的方式进行写

read A,D:yy//需要从磁盘中读取A,D两块中的数据,耗时yy

compute:α\alpha//内存计算parity,耗时α\alpha

write A,D:xx//将A,D两块中的数据从内存中写到磁盘上,耗时xx

total latency:x+y+αx+y+\alpha//总的耗时情况

写延迟计算

这里我们根据bio请求的大小,并且根据采用的rmw还是rcw的写决策来计算所花费的时间,从CPU的角度来整体看待这个时间基准。

bio_size < 4KB

in A , rmw, :A块非overwrite

read A,D : yy

compute: αα

write A,D : xx

total latency:x+y+α x+y+α

bio_size = 4KB

in A , rcw:A块overwrite

read B,C:yy

compute: αα

write A,D:xx

total:x+y+αx+y+α

4KB < bio_size <8KB

In A,E;A块overwrite,E块非overwrite

S0: rcw

Read B,C:yy

Compute: αα

Write A,D:xx

S1: rmw

Read E,H:yy

Compute: αα

Write E,H:xx

这里就不能单纯的累加了,要从CPU的角度考虑流水线的情况,并且考虑磁盘的并行性,具体耗时如下图:



图中y 0,3表示读0号盘和3号盘,由于可以并行,顾只消耗yy;x 0,3 表示将内存数据写到0号和3号磁盘上,还要考虑相同盘之间的IO顺序,因为一块盘不可能同时处理两个IO,因此有:

total latency:2x+y+α2x+y+\alpha

bio_size = 8KB

in A,E:A,E块均为overwrite

s0: rcw

read B,C:yy

compute: αα

write A,D:xx

s1: rcw

read F,G:yy

compute: αα

write F,H:xx

流水线情况:



total latency:2x+y+α2x+y+\alpha

8KB < bio_size < 12KB

In A,E,I:A,E块overwrite,I块非overwrite

S0: rcw

read B,C:yy

compute: αα

write A,D:xx

s1: rcw

read F,G:yy

compute: αα

write F,H:xx

s2: rmw

read I,L:yy

compute: αα

write I,L:xx

流水线情况:



total latency:3x+2y3x+2y

bio_size = 12KB

In A,E,I:A,E,I均为overwrite

S0: rcw

read B,C:yy

compute: αα

write A,D:xx

s1: rcw

read F,G:yy

compute: αα

write F,H:xx

s2: rcw

read J,K:yy

compute: αα

write J,K:xx

流水线情况:



total latency:3x+y+α3x+y+\alpha

12KB < bio_size <16KB

In A,E,I,M:A,E,I均为overwrite,M块非overwrite

S0: rcw

read B,C:yy

compute: αα

write A,D:xx

s1: rcw

read F,G:yy

compute: αα

write F,H:xx

s2: rcw

read J,K:yy

compute:αα

write J,K:xx

s3: rmw

read M,P:yy

compute: αα

write M,P:xx

流水线情况:



total latency:4x+3y4x+3y

bio_size = 16KB

In A,E,I,M:均为overwrite

S0: rcw

read B,C:yy

compute: αα

write A,D:xx

s1: rcw

read F,G:yy

compute:αα

write F,H:xx

s2: rcw

read J,K:yy

compute: αα

write J,K:xx

s3: rcw

read N,O:yy

compute: αα

write M,P:xx

流水线情况:



total latency:4x+y+α4x+y+\alpha

对于更大的bio请求,相应的计算方法和上述的计算方法一样,在此不一一赘述,只需要采用流水线技术并且保证不同盘的并发相同盘的IO互斥即可。

这只是简单的小例子,单纯的了解下如何计算RAID5写方式的延迟,希望能对你有帮助。

祝好~^_^
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: