问题1:
看到有些坛子里对这个问题的解释是做条带、配置初始参数、数据检查等等,那么为什么要这么久呢?为什么做RAID0的条带初始化就很快呢?有人说是把数据做校验,但是目前RAID中还没有数据,你校验个啥子呢?
是的RAID5创建后初始化需要很长时间同步确实是在做奇偶校验,为什么要做这个校验,这得需要了解到RAID5的写机制。
首先先说一下做了初始化的RAID5和没有做初始化的RAID5的差异:使用多磁盘创建RAID5时先进行初始化可以大幅度提升随机写性能。一般可以提升至少100%以上。(别听有些扯蛋的说没做初始化就不能保证数据冗余)
原因如下:
背景知识:RAID5的三种写方式
(1)完全划分的写(Full Stripe Write)
如果一次磁盘写操作的数据正好映射满一个Stripe,则该次写更新了校验组中所有的Strip,相应的校验块的校验值仅根据新的数据块的值就可以计算出来,该过程可以在RAID的缓存中直接完成,无需读盘操作。完全划分的写不需要任何多余的读操作,是RAID 5中效率最高的一种写操作。
(2)重构写(Reconstruct Write)
如果一次写磁盘的数据包括一个Stripe中的多数个数据块时,则在产生新的校验信息时必须先将没有更新的数据读到缓存中,计算出新的校验信息,然后将新用户数据与新校验信息一起写到磁盘的相应位置。重构写比完全划分的写多一个读旧数据操作,所以其效率比完全划分写的低。
(3)读修正写(Read-Modify-Write)
当用户数据只更新了Stripe中的极小部分的数据,为计算新的校验值,需要读出Stripe中原来的数据,然后将计算所得的新校验和新数据一起写到磁盘上,该操作称为“读修正写”。
三种写方式的性能分析
(1) 如果进行大块的顺序写,一条写命令的操作对象会覆盖到所有的磁盘,所以在这样的情况下,只需要把要写入的数据的校验值计算好,与数据一起写入硬盘。即Full Stripe Write,总共一次异或,一次写操作。这样的性能是最好的。不过应该注意到,此时所有的硬盘都在用来处理这条命令。
(2) 如果一次写命令没有覆盖所有的硬盘,此时有2种方法:
方法一:假设总共有16块硬盘,阵列的一个条带中的一个块是512B,这条写命令写入的数据是12*512B。那么我们可以先读出这个条带中的另外3块磁盘中的数据(不包括校验数据),然后把新数据和3块磁盘中的数据做异或,计算出新的校验值,然后一次性把数据全部写入。共一次读、一次异或、一次写。
可以发现在读3块磁盘中的数据时,需要写入的12块磁盘没有操作,完全可以用来做其它事情,这样我们的单位时间并发指令数就是4。
另外可以发现,如果写入新数据的大小是2*512B,那么用这种方法会很浪费,所以这种方式适用于新写入数据占磁盘数量一半以上的情况。
同时注意这个方式不需要使用到旧的校验值。
方法二:还是上面的环境,这次新写入的数据是2*512B。我们可以先读出这2块要修改数据的硬盘上的值,再读出旧的校验值,将新数据、旧数据、旧的校验值进行异或,异或的结果就是新的校验值(具体的数学推论可以参考RAID5原理的资料)。最后把新的数据写到2块磁盘中,把新的校验值写到校验磁盘中。总共两次读、两次异或、两次写。(当然两次读其实可以一起做,两次读也可以一起做)。
这样,实际操作用到的磁盘只有3块。其他的13块磁盘仍然可以用来做其他事情。并发指令数是4。这种情况如果用方法一的并发指数只有1.2。
需要注意的是,这个方式需要使用旧的校验值。
最终原因:
缘于随机写时的写方式
根据上面的分析,我们在进行小数据块随机写时,所进行的大部分写操作是用“读修正写”的方式进行的。
如果不选择初始同步,则没有条带初始数据校验的过程,所以创建阵列很快。但是此时磁盘中是没有旧的校验值的,导致不能使用“读修正写”的方式,而必须使用“重构写”的方式,导致并发性能降低
阅读(3533) | 评论(0) | 转发(0) |