Linux内核RAID5写性能分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenyouxu/article/details/47045173

Linux内核RAID5写性能分析


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


Background

首先我们先确定下测试的模型:3+1 RAID5,并且有chunk_size=4page,结构如下图。
这里写图片描述
上图中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的角度来整体看待这个时间基准。

  1. bio_size < 4KB

    in A , rmw, :A块非overwrite
    read A,D : y
    compute: α
    write A,D : x
    total latency:x+y+α

  2. bio_size = 4KB

    in A , rcw:A块overwrite
    read B,C:y
    compute: α
    write A,D:x
    total:x+y+α

  3. 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号盘,由于可以并行,顾只消耗yx 0,3 表示将内存数据写到0号和3号磁盘上,还要考虑相同盘之间的IO顺序,因为一块盘不可能同时处理两个IO,因此有:

    total latency:2x+y+α

  4. 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+α

  5. 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

  6. 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+α

  7. 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+3y

  8. bio_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写方式的延迟,希望能对你有帮助。

祝好~^_^

没有更多推荐了,返回首页