温故:

        在上一篇文章《​​如何在实际的运维中合理的选择RAID的级别​​》和大家聊了聊如何选择合适的RAID级别,总体来说就是考虑三点:1、用户的需求 2、安全性  3、性能 ,很多时候三者之间是要做出妥协的,毕竟用户的需求和你的想法不可能每次都重合的,具体情况具体分析吧

知新:

        今天想和大家聊聊影响RAID 0 性能的几个因素,我之前对这部分也不是很懂,也是在最近的学习中一点一点总结,有说的不对的地方还望指正。

一、RAID 0的读写原理

        在讲影响因素之前我们得先搞清楚RAID的原理,不搞清原理就没法分析影响因素。大家都了解,参与形成RAID 0的各个物理盘会组成一个在逻辑上和物理上都是连续的虚拟磁盘。RAID 0 是条带化(在多个磁盘的相同偏移处进行逻辑分割)写入磁盘。看下面这个图,数据在写入磁盘的时候不是写满一个条带再去写另一个条带,而是并发进行的,同时写入多个条带

影响RAID 0性能的因素_linux

         上面介绍了如何将数据写入磁盘,那么数据又是如何从中读取出来的呢?比如此时用户要读取数据并给电脑发出了指令,那么经过层层传递指令传到了主机控制器。主机控制器会发出一个指令:比如读取初始扇区6666,长度为256。

        然后RAID控制器收到指令后,会通过算法公式计算出这所谓的逻辑扇区6666在屋里磁盘上的实际扇区位置,然后还要计算出接下来256个连续的逻辑扇区在物理磁盘上所处的实际扇区位置。

        最后RAID控制器会对拥有这256个实际扇区的磁盘发出指令(这次是真正的读取数据),找到相应的数据后将结果再次反馈会RAID控制器,RAID控制器接收到数据后发送到Cache中组合起来,最终将结果反馈给主机控制器。

二、影响RAID 0性能的因素

        在讲影响因素之前,还要先普及几个小知识点,不然后面没法进行。条带(stripee)是在多个磁盘的相同偏移处进行逻辑分割形成的。一个条带所占用的单块磁盘的区域称之为段(segment)。一个条带横跨过多个磁盘的的扇区或数据块(data block)的个数或字节容量就是条带长度(Length)。一个segment中所包括的扇区或数据块的个数或字节容量就是条带的深度(Depth),也可以称之为宽度。至于数据块就是又N倍个扇区组成。

        如果大家觉得我上面讲的概念不好理解,大家可以对照着下面的图来看,下图是一个典型的RAID 0 系统。

影响RAID 0性能的因素_数据_02

 

        上面已经将这些概念讲完了,接下来咱们就说说都有哪些因素影响RAID 0 的性能。主要影响因素为条带宽度和条带长度。

2.1 条带深度

        为什么是条带深度呢?你这么想:一般来说同一份数据放在多块盘上扫描的话是要比放在一块盘上要快的多,毕竟是多个磁头同时扫描快于一个磁头嘛。既然搞清楚了这个问题,那么怎么解决呢?解决方法就是让数据尽可能的分布在多个磁盘上,怎么实现呢?将条带的宽度减小呗,即减小一个segment的容量。这里举一个小例子说明一下:假设以上面的图为例,每个数据块的容量为4k,当前有一个I/O(8K的数据)需要2个4k的数据块才能容纳下来,将条带深度由上图的两个数据块变成一个(即把segment的大小由8k变成4k),那么就可以将原本只需要放在磁盘1的segment中的数据放在磁盘1和磁盘2两块磁盘的segment中了。

        注意:数据在写入磁盘时并不是写满一个segment再去写另一个segment的,这个很好理解嘛。我在上面已经提到过数据在写入磁盘时是多个条带同时进行,那么就很容易举个例子了,第一条和第二条和第三条条带同时进行写动作,那么如果数据在写入磁盘时是写满一个segment再去写另一个segment的,那第二条条带上的segment岂不是要等第一条条带上的segment都写完才能开始?这不就互相矛盾了嘛。

2.2 条带长度

        在磁盘数量不变的条件下,也就是减小条带大小(Stripe SIZE,也就是条带长度)。让这个IO的数据被控制器分割,同时放满一个条带的第一个 Segment、第二个 Segment 等,依此类推,这样就能极大地占用多块物理盘。

        所以,RAID 0要提升性能,条带做的越小越好。但是又一个矛盾出现了,就是条带太小,导致并发IO几率降低。因为如果条带太小,则每次 IO一定会占用大部分物理盘,队列中的IO 就只能等待这次 IO 结束后才能使用物理盘。而条带太大,又不能充分提高传输速度。这两个是一对矛盾,要根据需求来采用不同的方式。如果随机小块 IO 多,则适当加大条带深度;如果连续大块IO多,则适当减小条带深度。