关于Raid0访问性能的一点探讨

来源:互联网 发布:汉仪菱心体简下载 mac 编辑:程序博客网 时间:2024/06/12 00:48

Raid0是利用两个或者多个磁盘构成的磁盘阵列,利用分片存储方式将数据散布到阵列中。使用Raid0的读写速度在理论上是要比单个盘快的,但是要具体问题具体分析,其读写速度取决于数据条纹(Stripe Size)的宽度以及每次读写请求的大小。


一个重要的指标IOPS,即I/O per second,也就是每秒进行IO操作的次数。很适合数据库这样的应用场合,用来衡量随机访问的性能。计算公式为IOPS=1/(寻道时间+传输时间)。从公式能够看出,如果寻道时间比传输时间大很多的时候,对性能是很不利的。


关于Raid0的并发IO的问题:并非所有的raid卡都支持Raid0阵列并发io的功能。并发IO,指多个IO可以同时被处理,比如IO1可以访问a盘,IO2可以同时访问b盘。并发IO的反义词是顺序IO。以两个磁盘的Raid0为例,其并发io的条件是条纹大小要大于IO请求的大小,使每个进程的IO请求不会跨切到另外的磁盘中。比如条纹大小为128KB,而每个IO请求大小为64KB,那么每个IO请求只会落到一块磁盘中,若Raid卡支持并发IO并且IO队列下一个请求时操作不同的磁盘时,则该请求将会并发的操作另一块磁盘。


关于Raid0顺序IO的问题:让一次IO能够充分利用阵列资源的方法就是尽量让IO的数据散布到多块磁盘上。在磁盘数目不变的条件下,减小条纹大小是一个有效的方法。Raid卡将该IO的数据分割,依次根据条纹大小散布到不同的磁盘中,这样就实现了该IO数据的条纹化,能够占用多块磁盘。这样该IO请求会同时读写多块磁盘,提高了性能。


条纹大小的矛盾:前面两段在条纹大小的选择方面出现了矛盾,即较小的条纹会降低IO并发执行的几率。因为如果条纹比较小时,每次IO请求会占用大多数甚至全部的磁盘,而IO等待队列中的其他请求无法并发的执行,只能等待本次IO操作完成后才能执行。另一方面,当条纹大小比较大时,单次的IO又不能充分利用多块磁盘同时读写来提高传输速度。条纹大小的设置是一个矛盾的问题,根据需求来采用不同的值是一个好方法,大容量的条纹会产生更高的读取性能,尤其在读取连续数据的时候。而随机读取数据的时候,最好设定条纹的容量小一点。


关于大量直接路径IO等待事件的讨论:在Oracle并行DDL性能测试中存在大量的直接路径IO的等待事件,表明Raid0 的IO请求队列中消耗了很多的等待时间。其原因很可能为多个并行服务器的IO操作中的IO请求要大于条纹大小,导致无法实现并发的IO操作,而且每次切换不同并行服务器的IO请求时都会转动磁头(不同并行服务器间是随机写,每个并行服务器内部是顺序写),转动磁头的时间消耗是比较大的,因此多个并行服务器对同一资源的竞争堆积了很多IO请求,导致了大量时间的等待。


原创粉丝点击