理解磁盘条带化

什么是条带化(striping)

     当多个进程同时访问一个磁盘时,可能会出现磁盘冲突。大多数磁盘系统都对访问次数(每秒的 I/O 操作,IOPS)和数据传输率(每秒传输的数据量,TPS)有限制。当达到这些限制时,后面需要访问磁盘的进程就需要等待,这时就是所谓的磁盘冲突。

    避免磁盘冲突是优化 I/O 性能的一个重要目标,而 I/O 性能的优化与其他资源(如CPU和内存)的优化有着很大的区别 ,I/O 优化最有效的手段是将 I/O 最大限度的进行平衡。

    条带化技术就是一种自动的将 I/O 的负载均衡到多个物理磁盘上的技术,条带化技术就是将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去。这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突,而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的 I/O 并行能力,从而获得非常好的性能。很多操作系统、磁盘设备供应商、各种第三方软件都能做到条带化。

    图 1 描述的是一个未经条带化处理的连续数据的分布,图 2 描述的是一个已经被条带化处理的连续数据的分布,从中比较,我们可以发现图 2 中对连续数据的读写都有最大的并发能力。

图 1. 未经条带化处理的连续数据
理解磁盘条带化

 

图 2. 已经被条带化处理的连续数据

理解磁盘条带化

    由于条带化在 I/O 性能问题上的优越表现,以致于在应用系统所在的计算环境中的多个层次或平台都涉及到了条带化的技术,如操作系统和存储系统这两个层次中都可能使用条带化技术。

影响条带化效果的两个因素

    当对数据做条带化时,数据被切成一块块的小数据块,各小数据块分布存储在不同的硬盘上。从这个描述中我们可以看出,影响条带化效果的因素有两个,一是条带大小(stripe size),即数据被切成的小数据块的大小,另一个条带宽度(stripe width),即数据被存储到多少块硬盘上。

    条带宽度(stripe width)是指同时可以并发读或写的条带数量。这个数量等于RAID中的物理硬盘数量。例如一个经过条带化的,具有4块物理硬盘的阵列的条带宽度就是4。增加条带宽度,可以增加阵列的读写性能。道理很明显,增加更多的硬盘,也就增加了可以同时并发读或写的条带数量。在其他条件一样的前提下,一个由8块18G硬盘组成的阵列相比一个由4块36G硬盘组成的阵列具有更高的传输性能。

    条带大小(stripe size),有时也被叫做block sizechunk sizestripe length 或者granularity。这个参数指的是写在每块磁盘上的条带数据块的大小。RAID的数据块大小一般在2KB到512KB之间(或者更大),其数值是2的次方,即2KB,4KB,8KB,16KB这样。

    条带大小对性能的影响比条带宽度难以量化的多。

    ·减小条带大小: 由于条带大小减小了,则文件被分成了更多个,更小的数据块。这些数据块会被分散到更多的硬盘上存储,因此提高了传输的性能,但是由于要多次寻找不同的数据块,磁盘定位的性能就下降了。

    ·增加条带大小: 与减小条带大小相反,会降低传输性能,提高定位性能。

    根据上边的论述,我们会发现根据不同的应用类型,不同的性能需求,不同驱动器的不同特点(如SSD硬盘),不存在一个普遍适用的"最佳条带大小"。所以这也是存储厂家,文件系统编写者允许我们自己定义条带大小的原因。不同条带大小,对于文件如何存储有很大的影响,请看下边这两幅图的对比:

理解磁盘条带化理解磁盘条带化
   这是一个由4块硬盘组成的RAID0阵列,左边的条带大小为4KB,右边的条带大小为64KB。

左边的图中的每一条细格表示4KB大小。

    图中红色文件大小是4KB,蓝色文件大小20KB,绿色文件大小为100KB,紫色文件大小为500KB。

    从图中我们可以看到,不同条带大小对"中型大小"文件的影响是很大的。对于红色的4KB文件来说,不论条带是4KB还64KB,它都分布在一块硬盘的一个数据块上。而对于紫色的500KB文件来说,无论条带是4KB还是64KB,它都会被分布在四块硬盘上。

    但是对于蓝色20KB的文件来说,如果采用64KB的条带大小,则它就会被分布在一块硬盘上,而不是像4KB条带时那样分布在四块硬盘上。同样绿色的100KB文件在64KB条带时,会被分布到2块硬盘,而4KB条带时则分布到4块硬盘上。可以看到,增加条带大小可以明显地增加定位性能。在上边的例子中,条带宽度理所当然是4。

    下图是使用16KB条带时的文件分布图,可以对应参考理解一下。
理解磁盘条带化
    那么我们应该选择多大的条带大小呢?最好的办法是尝试不同组合,根据应用的不同得到自己的经验规律。另外,不要过高估计不同条带大小间的性能差异。它有可能会差的很大,尤其是设置成4KB和256KB这样两个相对极端数值的时候,但对于相差不大的数值,它们的性能差异可能就不明显。对于大多数应用来说,可以参考这样的经验法则:大量的小文件读写时,采用较大的条带大小;少量的大文件的快速访问,采用比较小的条带;如果要平衡这两者,那么采用中间值。

参考资料:

http://www.pcguide.com/ref/hdd/perf/raid/concepts/perfStripe-c.html

http://www.itvue.com/Article/DB/DB2/200904/11214.html