io原理

一.单磁盘I/O性能分析

1.IO:输入输出

input(写入)  output(读出)

 

2.单个IO读写:完成一个写IO或者是读IO的操作。

一个读IO的操作:当控制磁盘的控制器接到操作系统的读IO操作指令的时候》控制器就会给磁盘发出一个读数据的指令—》并同时将要读取的数据块的地址传递给磁盘》然后磁盘会将读取到的数据传给控制器—》并由控制器返回给操作系统,完成

一个写IO的操作:控制器接到写的IO操作的指令和要写入的数据》并将其传递给磁盘》磁盘在数据写入完成之后将操作结果传递回控制器》再由控制器返回给操作系统,完成。

3.随机访问(Random Access)与连续访问(Sequential Access)

随机访问指的是本次IO所给出的扇区地址和上次IO给出扇区地址相差比较大,这样的话磁头在两次IO操作之间需要作比较大的移动动作才能重新开始读/写数据。

连续访问指的是这次IO给出的扇区地址与上次IO结束的扇区地址一致或者是接近的话,那磁头就能很快的开始这次IO操作,这样的多个IO操作称为连续访问。

因此尽管相邻的两次IO操作在同一时刻发出,但如果它们的请求的扇区地址相差很大的话也只能称为随机访问,而非连续访问。

4.顺序IO模式(Queue Mode)/并发IO模式(Burst Mode)

磁盘控制器可能会一次对磁盘组发出一连串的IO命令。

如果磁盘组一次只能执行一个IO命令时称为顺序IO

当磁盘组能同时执行多个IO命令时,称为并发IO

并发IO只能发生在由多个磁盘组成的磁盘组上,单块磁盘只能一次处理一个IO命令。

5.单次IO的大小(IO Chunk Size)

数据库存储有个基本的块大小(Block Size),不管是SQL Server还是Oracle,默认的块大小都是8KB,就是数据库每次读写都是以8k为单位的。那么对于数据库应用发出的固定8k大小的单次读写到了磁盘这个层面会是怎么样的呢,就是对于读写磁盘来说单个IO操作操作数据的大小是多少不是一个固定的值。

原因:首先操作系统为了提高 IO的性能而引入了文件系统缓存(File System Cache),系统会根据请求数据的情况将多个来自IO的请求先放在缓存里面,然后再一次性的提交给磁盘,也就是说对于数据库发出的多个8K数据块的读操作有可能放在一个磁盘读IO里就处理了。

还有对于有些存储系统也是提供了缓存(Cache)的,接收到操作系统的IO请求之后也是会将多个操作系统的 IO请求合并成一个来处理。

      不管是操作系统层面的缓存还是磁盘控制器层面的缓存,目的都只有一个,提高数据读写的效率。因此每次单独的IO操作大小都是不一样的,它主要取决于系统对于数据读写效率的判断。

当一次IO操作大小比较小的时候我们称为小的IO操作,比如说1K4K8K这样的;当一次IO操作的数据量比较大的时候称为大IO操作,比如说32K64K甚至更大。

在我们说到块大小(Block Size)的时候通常我们会接触到多个类似的概念,像我们上面提到的那个在数据库里面的数据最小的管理单位,Oralce称之为块(Block),大小一般为8KSQL Server称之为页(Page),一般大小也为8k

在文件系统里面我们也能碰到一个文件系统的块,在现在很多的Linux系统中都是4K(通过 /usr/bin/time -v可以看到),它的作用其实跟数据库里面的块/页是一样的,都是为了方便数据的管理。但是说到单次IO的大小,跟这些块的大小都是没有直接关系的,在英文里单次IO大小通常被称为是IO Chunk Size,不会说成是IO Block Size的。

 

IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。随机读写频繁的应用,如OLTP(Online Transaction Processing),IOPS是关键衡量指标。另一个重要指标是数据吞吐量(Throughput),指单位时间内可以成功传输的数据数量。对于大量顺序读写的应用,如VOD(Video On Demand),则更关注吞吐量指标。

传统磁盘本质上一种机械装置,如FC, SAS, SATA磁盘,转速通常为5400/7200/10K/15K rpm不等。影响磁盘的关键因素是磁盘服务时间,即磁盘完成一个I/O请求所花费的时间,它由寻道时间、旋转延迟和数据传输时间三部分构成。
寻道时间Tseek是指将读写磁头移动至正确的磁道上所需要的时间。寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms。
旋转延迟Trotation是指盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间。旋转延迟取决于磁盘转速,通常使用磁盘旋转一周所需时间的1/2表示。比如,7200 rpm的磁盘平均旋转延迟大约为60*1000/7200/2 = 4.17ms,而转速为15000 rpm的磁盘其平均旋转延迟约为2ms。
数据传输时间Ttransfer是指完成传输所请求的数据所需要的时间,它取决于数据传输率,其值等于数据大小除以数据传输率。目前IDE/ATA能达到133MB/s,SATA II可达到300MB/s的接口数据传输率,数据传输时间通常远小于前两部分时间。

因此,理论上可以计算出磁盘的最大IOPS,即IOPS = 1000 ms/ (Tseek + Troatation),忽略数据传输时间。假设磁盘平均物理寻道时间为3ms, 磁盘转速为7200,10K,15K rpm,则磁盘IOPS理论最大值分别为,
IOPS = 1000 / (3 + 60000/7200/2) = 140
IOPS = 1000 / (3 + 60000/10000/2) = 167
IOPS = 1000 / (3 + 60000/15000/2) = 200
固态硬盘SSD是一种电子装置, 避免了传统磁盘在寻道和旋转上的时间花费,存储单元寻址开销大大降低,因此IOPS可以非常高,能够达到数万甚至数十万。实际测量中,IOPS数值会受到很多因素的影响,包括I/O负载特征(读写比例,顺序和随机,工作线程数,队列深度,数据记录大小)、系统配置、操作系统、磁盘驱动等等.


6.IOPS(IO per Second)

      IO系统每秒所执行IO操作的次数称为IOPS

对于磁盘来说一个完整的IO操作是这样进行的:当控制器对磁盘发出一个IO操作命令的时候》磁盘的驱动臂(Actuator Arm)带读写磁头(Head)离开着陆区(Landing Zone,位于内圈没有数据的区域)—》移动到要操作的初始数据块所在的磁道(Track)的正上方》这个过程被称为寻址(Seeking),对应消耗的时间被称为寻址时间(Seek Time);但是找到对应磁道还不能马上读取数据,这时候磁头要等到磁盘盘片(Platter)旋转到初始数据块所在的扇区(Sector)落在读写磁头正上方的之后才能开始读取数据,在这个等待盘片旋转到可操作扇区的过程中消耗的时间称为旋转延时(Rotational Delay);接下来就随着盘片的旋转,磁头不断的读/写相应的数据块,直到完成这次IO所需要操作的全部数据,这个过程称为数据传送(Data Transfer),对应的时间称为传送时间(Transfer Time)。完成这三个步骤之后一次IO操作也就完成了。

      

      在我们看硬盘厂商的宣传单的时候我们经常能看到3个参数,分别是平均寻址时间、盘片旋转速度以及最大传送速度,这三个参数就可以提供给我们计算上述三个步骤的时间。

  第一个寻址时间,考虑到被读写的数据可能在磁盘的任意一个磁道,既有可能在磁盘的最内圈(寻址时间最短),也可能在磁盘的最外圈(寻址时间最长),所以在计算中我们只考虑平均寻址时间,也就是磁盘参数中标明的那个平均寻址时间,这里就采用当前最多的10krmp硬盘的5ms。寻道时间是影响随机IO性能的首要因素

  第二个旋转延时,和寻址一样,当磁头定位到磁道之后有可能正好在要读写扇区之上,这时候是不需要额外额延时就可以立刻读写到数据,但是最坏的情况确实要磁盘旋转整整一圈之后磁头才能读取到数据,所以这里我们也考虑的是平均旋转延时,对于10krpm的磁盘就是(60s/15k)*(1/2) = 2ms

第三个传送时间,磁盘参数提供我们的最大的传输速度,当然要达到这种速度是很有难度的,但是这个速度却是磁盘纯读写磁盘的速度,因此只要给定了单次 IO的大小,我们就知道磁盘需要花费多少时间在数据传送上,这个时间就是IO Chunk Size / Max Transfer Rate

7.IOPS计算公式

  现在我们就可以得出这样的计算单次IO时间的公式:

  IO Time = Seek Time + 60 sec/Rotational Speed/2 + IO Chunk Size/Transfer Rate

  于是我们可以这样计算出IOPS

  IOPS = 1/IO Time = 1/(Seek Time + 60 sec/Rotational Speed/2 + IO Chunk Size/Transfer Rate)

  对于给定不同的IO大小我们可以得出下面的一系列的数据

4K (1/7.1 ms = 140 IOPS)
  5ms + (60sec/15000RPM/2) + 4K/40MB = 5 + 2 + 0.1 = 7.1
  8k (1/7.2 ms = 139 IOPS)
  5ms + (60sec/15000RPM/2) + 8K/40MB = 5 + 2 + 0.2 = 7.2
  16K (1/7.4 ms = 135 IOPS)
  5ms + (60sec/15000RPM/2) + 16K/40MB = 5 + 2 + 0.4 = 7.4
  32K (1/7.8 ms = 128 IOPS)
  5ms + (60sec/15000RPM/2) + 32K/40MB = 5 + 2 + 0.8 = 7.8
  64K (1/8.6 ms = 116 IOPS)
  5ms + (60sec/15000RPM/2) + 64K/40MB = 5 + 2 + 1.6 = 8.6

从上面的数据可以看出,当单次IO越小的时候,单次IO所耗费的时间也越少,相应的IOPS也就越大。

上面我们的数据都是在一个比较理想的假设下得出来的,这里的理想的情况就是磁盘要花费平均大小的寻址时间和平均的旋转延时,这个假设其实是比较符合我们实际情况中的随机读写,在随机读写中,每次IO操作的寻址时间和旋转延时都不能忽略不计,有了这两个时间的存在也就限制了IOPS的大小。现在我们考虑一种相对极端的顺序读写操作,比如说在读取一个很大的存储连续分布在磁盘的的文件,因为文件的存储的分布是连续的,磁头在完成一个读IO操作之后,不需要从新的寻址,也不需要旋转延时,在这种情况下我们能到一个很大的IOPS值,如下

  4K (1/0.1 ms = 10000 IOPS)
  0ms + 0ms + 4K/40MB = 0.1
  8k (1/0.2 ms = 5000 IOPS)
  0ms + 0ms + 8K/40MB = 0.2
  16K (1/0.4 ms = 2500 IOPS)
  0ms + 0ms + 16K/40MB = 0.4
  32K (1/0.8 ms = 1250 IOPS)
  0ms + 0ms + 32K/40MB = 0.8
  64K (1/1.6 ms = 625 IOPS)
  0ms + 0ms + 64K/40MB = 1.6

  相比第一组数据来说差距是非常的大的,因此当我们要用IOPS来衡量一个IO系统的系能的时候我们一定要说清楚是在什么情况的IOPS,也就是要说明读写的方式以及单次IO的大小,当然在实际当中,特别是在OLTP的系统的,随机的小IO的读写是最有说服力的。

传输速度(Transfer Rate)/吞吐率(Throughput)

  现在我们要说的传输速度(另一个常见的说法是吞吐率)不是磁盘上所表明的最大传输速度或者说理想传输速度,而是磁盘在实际使用的时候从磁盘系统总线上流过的数据量。有了IOPS数据之后我们是很容易就能计算出对应的传输速度来的

  Transfer Rate = IOPS * IO Chunk Size

  还是那上面的第一组IOPS的数据我们可以得出相应的传输速度如下

  4K: 140 * 4K = 560K / 40M = 1.36%
  8K: 139 * 8K = 1112K / 40M = 2.71%
  16K: 135 * 16K = 2160K / 40M = 5.27%
  32K: 116 * 32K = 3712K / 40M = 9.06%

  可以看出实际上的传输速度是很小的,对总线的利用率也是非常的小。

  这里一定要明确一个概念,那就是尽管上面我们使用IOPS来计算传输速度,但是实际上传输速度和IOPS是没有直接关系,在没有缓存的情况下它们共同的决定因素都是对磁盘系统的访问方式以及单个IO的大小。对磁盘进行随机访问时候我们可以利用IOPS来衡量一个磁盘系统的性能,此时的传输速度不会太大;但是当对磁盘进行连续访问时,此时的IOPS已经没有了参考的价值,这个时候限制实际传输速度却是磁盘的最大传输速度。因此在实际的应用当中,只会IOPS来衡量小IO的随机读写的性能而当要衡量大IO连续读写的性能的时候就要采用传输速度而不能是IOPS了。

8.IO响应时间(IO Response Time)

  最后来关注一下能直接描述IO性能的IO响应时间。IO响应时间也被称为IO延时(IO Latency)IO响应时间就是从操作系统内核发出的一个读或者写的IO命令到操作系统内核接收到IO回应的时间,注意不要和单个IO时间混淆了,单个IO时间仅仅指的是IO操作在磁盘内部处理的时间,而IO响应时间还要包括IO操作在IO等待队列中所花费的等待时间。

  计算IO操作在等待队列里面消耗的时间有一个衍生于利托氏定理(Little’s Law)的排队模型M/M/1模型可以遵循,由于排队模型算法比较复杂,到现在还没有搞太明白(如果有谁对M/M/1模型比较精通的话欢迎给予指导),这里就罗列一下最后的结果,还是那上面计算的IOPS数据来说:

  8K IO Chunk Size (135 IOPS, 7.2 ms)
  135 => 240.0 ms
  105 => 29.5 ms
  75 => 15.7 ms
  45 => 10.6 ms
  64K IO Chunk Size(116 IOPS, 8.6 ms)
  135 => 没响应了……
  105 => 88.6 ms
  75 => 24.6 ms
  45 => 14.6 ms

  从上面的数据可以看出,随着系统实际IOPS越接近理论的最大值,IO的响应时间会成非线性的增长,越是接近最大值,响应时间就变得越大,而且会比预期超出很多。一般来说在实际的应用中有一个70%的指导值,也就是说在IO读写的队列中,当队列大小小于最大IOPS70%的时候,IO的响应时间增加会很小,相对来说让人比较能接受的,一旦超过70%,响应时间就会戏剧性的暴增,所以当一个系统的IO压力超出最大可承受压力的70%的时候就是必须要考虑调整或升级了。

另外补充说一下这个70%的指导值也适用于CPU响应时间,这也是在实践中证明过的,一旦CPU超过70%,系统将会变得受不了的慢。很有意思的东西。

9.单碟容量

  单碟容量也是影响磁盘性能的一个间接因素。单碟容量越高,证明相同空间内的数据量越大,也就是数据密度越大。在相同的转速和寻道速度条件下,具有高数据密度的磁盘会显示出更高的性能。因为在相同的开销下,单碟容量高的磁盘会读出更多的数据。

10.接口速度

   接口速度是影响磁盘性能最不重要的一个因素。目前的接口速度理论上都已经满足了磁盘所能达到的最高外部传输带宽。在随机IO情况下,接口速度显的更加不重要,因为此时瓶颈机会全部在寻道速度上。

11.转速

   转速是影响硬盘连续IO时吞吐量性能的首要因素。读写数据时,磁头不会动,全靠盘片的转动来将对应扇区中的数据感应给磁头。所以盘片装的越快,数据传输时间就越短。在连续IO情况下,磁头臂寻道次数很少,所以要提高吞吐量或者IOPS的值,转速就是首要影响因素了。

二.缓存和raid如何提高IO

从上一篇文章:IO系统性能之一:衡量性能的几个指标的计算中我们可以看到一个15k转速的磁盘在随机读写访问的情况下IOps竟然只有140左右,但在实际应用中我们却能看到很多标有5000IOPS甚至更高的存储系统,有这么大IOPS的存储系统怎么来的呢?这就要归结于各种存储技术的使用了,在这些存储技术中使用最广的就是高速缓存(Cache)和磁盘冗余阵列(RAID)了,本文就将探讨缓存和磁盘阵列提高存储IO性能的方法。

1.高速缓存(Cache

在当下的各种存储产品中,按照速度从快到慢应该就是内存>闪存>磁盘>磁带了,然而速度越快也就意味着价格越高,闪存虽然说是发展势头很好,但目前来说却还是因为价格问题无法普及,因此现在还是一个磁盘作霸王的时代。与CPU和内存速度相比,磁盘的速度无疑是计算机系统中最大的瓶颈了,所以在必须使用磁盘而又想提高性能的情况下,人们想出了在磁盘中嵌入一块高速的内存用来保存经常访问的数据从而提高读写效率的方法来折中的解决,这块嵌入的内存就被称为高速缓存。

说到缓存,这东西应用现在已经是无处不在,从处于上层的应用,到操作系统层,再到磁盘控制器,还有CPU内部,单个磁盘的内部也都存在缓存,所有这些缓存存在的目的都是相同的,就是提高系统执行的效率。

当然在这里我们只关心跟IO性能相关的缓存,与IO性能直接相关的几个缓存分别是文件系统缓存(File System Cache)、磁盘控制器缓存(Disk Controller Cache)和磁盘缓存(Disk Cache,也称为Disk Buffer),不过当在计算一个磁盘系统性能的时候文件系统缓存也是不会考虑在内的,因此我们重点考察的就是磁盘控制器缓存和磁盘缓存。

不管是控制器缓存还是磁盘缓存,他们所起的作用主要是分为三部分:缓存数据、预读(Read-ahead)和回写(Write-back)。

缓存数据
首先是系统读取过的数据会被缓存在高速缓存中,这样下次再次需要读取相同的数据的时候就不用在访问磁盘,直接从缓存中取数据就可以了。当然使用过的数据也不可能在缓存中永久保留的,缓存的数据一般那是采取LRU算法来进行管理,目的是将长时间不用的数据清除出缓存,那些经常被访问的却能一直保留在缓存中,直到缓存被清空。

2.预读

预读是指采用预读算法在没有系统的IO请求的时候事先将数据从磁盘中读入到缓存中,然后在系统发出读IO请求的时候,就会实现去检查看看缓存里面是否存在要读取的数据,如果存在(即命中)的话就直接将结果返回,这时候的磁盘不再需要寻址、旋转等待、读取数据这一序列的操作了,这样是能节省很多时间的;如果没有命中则再发出真正的读取磁盘的命令去取所需要的数据。

缓存的命中率跟缓存的大小有很大的关系,理论上是缓存越大的话,所能缓存的数据也就越多,这样命中率也自然越高,当然缓存不可能太大,毕竟成本在那儿呢。如果一个容量很大的存储系统配备了一个很小的读缓存的话,这时候问题会比较大的,因为小缓存缓存的数据量非常小,相比整个存储系统来说比例非常低,这样随机读取(数据库系统的大多数情况)的时候命中率也自然就很低,这样的缓存不但不能提高效率(因为绝大部分读IO都还要读取磁盘),反而会因为每次去匹配缓存而浪费时间。

执行读IO操作是读取数据存在于缓存中的数量与全部要读取数据的比值称为缓存命中率(Read Cache Hit Radio),假设一个存储系统在不使用缓存的情况下随机小IO读取能达到150IOps,而它的缓存能提供10%的缓存命中率的话,那么实际上它的IOPS可以达到150/1-10%=166

3.回写

首先说一下,用于回写功能的那部分缓存被称为写缓存(Write Cache)。在一套写缓存打开的存储中,操作系统所发出的一系列写IO命令并不会被挨个的执行,这些写IO的命令会先写入缓存中,然后再一次性的将缓存中的修改推到磁盘中,这就相当于将那些相同的多个IO合并成一个,多个连续操作的小IO合并成一个大的IO,还有就是将多个随机的写IO变成一组连续的写IO,这样就能减少磁盘寻址等操作所消耗的时间,大大的提高磁盘写入的效率。

读缓存虽然对效率提高是很明显的,但是它所带来的问题也比较严重,因为缓存和普通内存一样,掉点以后数据会全部丢失,当操作系统发出的写IO命令写入到缓存中后即被认为是写入成功,而实际上数据是没有被真正写入磁盘的,此时如果掉电,缓存中的数据就会永远的丢失了,这个对应用来说是灾难性的,目前解决这个问题最好的方法就是给缓存配备电池了,保证存储掉电之后缓存数据能如数保存下来。

和读一样,写缓存也存在一个写缓存命中率(Write Cache Hit Radio),不过和读缓存命中情况不一样的是,尽管缓存命中,也不能将实际的IO操作免掉,只是被合并了而已。

控制器缓存和磁盘缓存除了上面的作用之外还承当着其他的作用,比如磁盘缓存有保存IO命令队列的功能,单个的磁盘一次只能处理一个IO命令,但却能接收多个IO命令,这些进入到磁盘而未被处理的命令就保存在缓存中的IO队列中。

RAIDRedundant Array Of Inexpensive Disks
如果你是一位数据库管理员或者经常接触服务器,那对RAID应该很熟悉了,作为最廉价的存储解决方案,RAID早已在服务器存储中得到了普及。在RAID的各个级别中,应当以RAID10RAID5(不过RAID5已经基本走到头了,RAID6正在崛起中,看看这里了解下原因)应用最广了。下面将就RAID0RAID1RAID5RAID6RAID10这几种级别的RAID展开说一下磁盘阵列对于磁盘性能的影响,当然在阅读下面的内容之前你必须对各个级别的RAID的结构和工作原理要熟悉才行,这样才不至于满头雾水,推荐查看wikipedia上面的如下条目:RAIDStandard RAID levelsNested RAID levels

4.RAID0

RAID0将数据条带化(striping)将连续的数据分散在多个磁盘上进行存取,系统发出的IO命令(不管读IO和写IO都一样)就可以在磁盘上被并行的执行,每个磁盘单独执行自己的那一部分请求,这样的并行的IO操作能大大的增强整个存储系统的性能。假设一个RAID0阵列有nn>=2)个磁盘组成,每个磁盘的随机读写的IO能力都达到140的话,那么整个磁盘阵列的IO能力将是140n。同时如果在阵列总线的传输能力允许的话RAID0的吞吐率也将是单个磁盘的n倍。

5.RAID1

RAID1在容量上相当于是将两个磁盘合并成一个磁盘来使用了,互为镜像的两个磁盘里面保存的数据是完全一样的,因此在并行读取的时候速度将是n个磁盘速度的总和,但是写入就不一样了,每次写入都必须同时写入到两个磁盘中,因此写入速度只有n/2

6.RAID5

我们那一个有nn>=3)个磁盘的RAID5阵列来看,首先看看RAID5阵列的读IORAID5是支持并行IO的,而磁盘上的数据呈条带状的分布在所有的磁盘上,因此读IO的速度相当于所有磁盘速度的总和。不过这是在没有磁盘损坏的情况下,当有一个磁盘故障的时候读取速度也是会下降的,因为中间需要花时间来计算丢失磁盘上面的数据。
读取数据的情况相对就要复杂的多了,先来看下RAID5奇偶校验数据写入的过程,我们把写入的数据称为D1,当磁盘拿到一个写IO的命令的时候,它首先会读取一次要入的地址的数据块中修改之前的数据D0,然后再读取到当前条带中的校验信息P0,接下来就根据D0P0D1这三组数据计算出数据写入之后的条带的奇偶校验信息P1,最后发出两个写IO的命令,一个写入D1,另一个写入奇偶校验信息P1。可以看出阵列在实际操作的时候需要读、读、写、写一共4IO才能完成一次写IO操作,也就是实际上的写入速度只有所有磁盘速度总和的1/4。从这点可以看出RAID5是非常不适合用在要大批量写入数据的系统上的。

7.RAID6

RAID6RAID5很类似,差别就在于RAID6多了一个用于校验的磁盘。就写IO速度上来说这两个是完全一样的,都是所有磁盘IO速度的总和。
在写IO上也很是类似,不同的是RAID将一个命令分成了三次读、三次写一共6IO命令才能完成,也就是RAID6实际写入磁盘的速度是全部磁盘速度之和的1/6。可以看出从写IORAID6RAID5差别是很大的。

8.RAID10

RAID0读写速度都很好,却没有冗余保护;RAID5RAID6都有同样的毛病就是写入的时候慢,读取的时候快。那么RAID1呢?嗯,这里要说的就是RAID1,其实不管是RAID10还是RAID01,其实都是组合大于2块磁盘时候的RAID1,当先镜像后条带时候就称为RAID10,先条带后镜像的时候称为RAID01。从性能上看RAID01RAID10都是一样的,都是RAID1嘛,但是RAID10在重建故障磁盘的时候性能比RAID01要快。
因为RAID10其实就是RAID1,所以它的性能与RAID1也就是一样的了,这里不需要再做过多的讨论。

四个性能指标的变化

9. IO响应时间(IO Response Time

在任何时候IO响应时间值得都是单个IO的响应时间,因此,不管磁盘是否组成了磁盘阵列,它的IO响应时间应该都是一样的。从前面的计算中我们可以看到,如果IO响应时间在10ms左右的话是很正常的,但是当IO响应时间比这个值超出太多的时候,你就要开始注意了,很可能就意味着此时你的磁盘系统已经成为了一个瓶颈。

10.估算磁盘总体IOPS

综合上面两个部分的讨论我们来估算一下阵列下的磁盘总体IOPS,在这里我们先假设组成阵列的单个磁盘的随机读写的IOPS140,读写缓存命中率都为10%,组成阵列的磁盘个数为4

因为不管是那种阵列,磁盘的读取性能都是所有磁盘之和,所以可以得出下面的读取IOPS

  read IOPS = disk_IOPS/1-read_cache_hit_ratio)*disk_num = 140/1-10%)*4 = 622

而写入性能就完全不一样了,根据上面的讨论我们可以得出下面结论:

  RAID0: 1 IO request => need 1 actual IO on disk
  RAID1: 1 IO request => need 2 actual IO on disk
  RAID5: 1 IO request => need 4 actual IO on disk
  RAID6: 1 IO request => need 6 actual IO on disk

由此我们也可以计算出写入IOPS估算公式:

  RAID0 write IOPS = disk_IOPS/1-write_cache_hit_ratio)*disk_num/acture_IO_num = 140/1-10%)*4/1 = 622
  RAID1 write IOPS = disk_IOPS/1-write_cache_hit_ratio)*disk_num/acture_IO_num = 140/1-10%)*4/2 = 311
  RAID5 write IOPS = disk_IOPS/1-write_cache_hit_ratio)*disk_num/acture_IO_num = 140/1-10%)*4/4 = 155
  RAID6 write IOPS = disk_IOPS/1-write_cache_hit_ratio)*disk_num/acture_IO_num = 140/1-10%)*4/6 = 103

实际上从通过上面的计算方法我们还可以估算当给定一个要求的IOPS的情况下,估计下使用各个阵列级别所需要的磁盘的数量。当然我们上面的计算方法只是一个估算,我们忽略很多其他的因素,得出的只是一个大概的数值,不过在实际的应用还是有一定的参考作用的。

本篇最后附送一个计算磁盘系统IOPS的网站――wmarow’s disk & disk array calculator,这个网站提供的计算公式还考虑了诸如阵列条带大小以及主机方面的因素,很有参考价值,至于怎么选择合适的条带大小,以后还会撰文解释。

11.传输速度(Transfer Rate/吞吐率(Throughput

实际上估算除了随机读写的IOPS也就知道了随机读写的吞吐率。对于顺序读写的呢,还是跟前一篇所讲的一样,主要受限于磁盘的限制,不能再拿IOPS来衡量了。

  random_throughtput = random_IOPS  IO_chunk_size

三.磁盘阵列读写性能

Cache命中率、是否并发IO、随机或连续读写、raid级别、单次IO大小、数据块大小、IOPS大小(寻道时间+盘片延迟+传输时间)、IO响应时间、IO吞吐量有关

1.Raid0

无冗余、无校验 

       至少需要2块磁盘

       理论连续读写速度是单磁盘的2倍,随机读写速度按理论是有可能增加的,这取决于数据分片大小和读写的大小

       raid0持续读写仅在并发IO+分割块很大的时候,iops会增加很多

       raid0随机读写仅在并发IO+分割块很大的时候,iops显著增加

       安全性下降2

       容量是所有磁盘的总和

2.Raid1

通过磁盘数据镜像实现数据冗余

       至少需要2块或者2的倍数的磁盘

       读速度为单磁盘的2倍,随机和连续写速度与单磁盘相同(同时写入到两个磁盘)

       安全性能提高

       容量是所有磁盘的一半

3.Raid1+0

2个镜像结构组合成1个带区结构,也就是raid1+raid0的组合(先做raid1,再做raid0

         至少4块盘

         容量是所有盘的一半

         主要用于容量不大,要求速度和容错的小IO数据库环境下

         Raid1+0raid0+1容错方面更高

4.Raid0+1

2个冗余结构组合成1个镜像结构,也是raid0+raid1的组合(先做的raid0,再做raid1

         至少4块盘

         容量是所有盘的一半

5.Raid5

拥有校验数据,校验数据分布在每个磁盘上,每个条带组中有一个校验条带

      容量等于所有磁盘的总容量—1块磁盘的容量(校验数据占用一块盘容量)

至少需要三块磁盘

允许损坏一块盘,数据不会丢失

      用于大型文件存储,数据仓库,如医疗系统、视频编辑系统等从空间利用的角度建议采用raid5

      写性能较差,因为每次写数据多要计算校验并写入新校验:

把一个数字2变成数字4,那么对于RAID5,实际发生了4io
先读出2与校验6,可能发生读命中
然后在cache中计算新的校验
写入新的数字4与新的校验8

同样的单个操作,最终RAID10只需要2io

      读性能很好

6.Raid写惩罚

写速度上的性能损失。

      RAID 5要经过5个步骤,差不多就是“读”--“算”--“写”的过程

        读出老数据

读出校验数据

计算新校验数据

写新数据

写新校验数据

      普通硬盘的写操作当然就是有一个步骤:“写”

      假设你是4块盘做的RAID5,条带大小为1MB

那么,如果写入一个2MB的数据,那么DISK11MBDISK21MBDISK3不动,DISK41MB校验码,如果再写2MB数据,那么为了充分利用空间,DISK31MB,下一个条带:DISK11MB校验码,DISK21MBDISK3/4不动。

问题出现在:第二次写入数据时,DISK31MB,那么该条带的DISK1DISK2的数据没变,但是DISK4记录的是校验码,校验码是改变了点,那么具体操作为——写DISK3、读DISK1/DISK2/DISK4、计算校验码、写校验码——这就是OVERHEAD,多一次读写

      RAID 5盘阵中有一块盘损坏,如果还要写数据,就要对所有的未损坏盘全部进行写操作。当然恢复一个损坏的磁盘,要把所有的数据全部读一边才能计算出损坏磁盘上的数据。例如,一个由5块磁盘构成的RAID 5,进行修复时需要把其他四块盘上的数据全部读一遍;由10块盘构成的RAID5,进行修复时需要把其他9块盘上的数据全部读一遍。

      5块盘构成的RAID5中,差不多恢复一个146G的磁盘需要2个小时的时间。而在这两个小时过程中一定不能发生第二块盘损坏,否则就只能是“丢数据”了。

四.磁盘阵列瓶颈

我们知道,在存储系统的采购过程中,厂商往往能够提供漂亮的性能参数,但实际运行中,该系统的实际性能表现并不能达到我们所期望的状态,那么在运行环境中存储系统的实际性能究竟受哪些环节和瓶颈的影响呢?

之所以要和大家来讨论这个问题,是因为在本人的工作中曾遇到一个实际的Case,在这个case中,一个恢复压力很大的standby(这里主要是写,而且是小io的写),采用了RAID5的方案,发现性能很差,后来改造成了RAID10,就很好的避免了性能的问题。
阵列的瓶颈主要体现在2个方面:带宽 IOPS(单位时间传输的数据量,和单位时间完成的I/O数)

1.影响带宽的主要因素

存储系统的带宽主要取决于阵列的构架,光纤通道的大小(我们今天讨论的阵列一般都是光纤阵列, SCSI这样的SSA阵列,暂时不在讨论范围之列)以及硬盘的个数。

所谓阵列构架影响存储系统带宽,指的是存储系统内部架构会存在一些内部带宽,类似于PC的系统总线,尽管阵列的构架因不同厂商不同型号的产品而各有不同,不过一般情况下,内部带宽都设计的很充足,不会是瓶颈的所在。

光纤通道对带宽的影响还是比较大的,例如数据仓库环境中,对数据的流量要求很大,而一块2Gb的光纤卡,所能支撑的最大流量应当是2GB/8= 250Mb/s的实际流量,必须配备4块光纤卡才能达到1Gb/s的实际流量,所以对于数据仓库的环境来说,升级到光纤4Gb并非是厂商过于超前的产品更新,在大流量的数据环境下绝对有必要考虑更换4GB的光纤卡。

但是对于存储系统的带宽来说,硬盘接口的带宽限制是最重要的。当前面的瓶颈不再存在的时候,带宽就完全取决于硬盘的个数了,我下面列一下不同规格的硬盘所能支撑的流量大小,数据取自硬盘厂商的标准参数:

eee

如果我们假定一个阵列有12015K rpm转速的光纤硬盘,那么硬盘上最大的可以支撑的数据流量为120*13=1560Mb/s,当前端接口不成为瓶颈的时候,1560Mb/s就是理论上的最大数据流量。

而如果要实现上述的最大带宽,如果前端采用2GB的光纤卡,可能需要配置6块才能够,而4GB的光纤卡,配置3-4块就够了。因此我们可以知道,前端的光纤接口必须与后端磁盘个数相匹配。

但是否考虑到这些因素就足够了呢,存储系统的整体性能还受到多方面因素的影响,下面我们将分析存储系统的另外一个重要的性能指标:IOPS

2.影响IOPS的主要因素

我们前面已经说过了,厂商所提供的IOPS值是在理想状态下测试出来的,对实际的运行性能的参考并不大,所以我们有必要通过以下几个方面来衡量该系统的实际IOPS的可能表现。

决定IOPS的主要因素取决于阵列的算法,cache命中率,以及磁盘个数。

阵列的算法也因为不同厂商不同型号的产品而不同,如我们最近遇到在HDS USP上面,可能因为ldev(lun)存在队列或者资源限制,而单个ldevIOPS就上不去。所以,决定采购某型号的存储之前,有必要了解这个存储的一些算法规则与限制。

cache命中率对实际IOPS有决定性的影响,Cache命中率取决于数据的分布,cache size的大小,数据访问的规则,以及cache的算法,如果完整的讨论下来,这里将变得很复杂,可以有一天来慢慢讨论。

我们这里把这些内部原理都省略掉,只强调:对于一个存储阵列来说,读cache的命中率越高,一般就表示它可以支持更多的IOPS,为什么这么说呢?这个就与我们下面要讨论的硬盘IOPS有关系了。

每个物理硬盘能处理的IOPS是有限制的,如

fff


同样,如果一个阵列有12015K rpm转速的光纤硬盘,那么,它能支撑的最大IOPS120*150=18000,这个为硬件限制的理论值,如果超过这个值,硬盘的响应可能会变的非常缓慢而不能正常提供业务。较高的读cache命中率,能降低硬盘的IOPS负荷,让硬盘在较小的压力下良好工作。

 

五.不同RAIDIOPS性能的影响

在我们的上一篇文章“RAID5RAID10,哪种RAID适合你()”中曾经讨论过,在RAID5RAID10的不同机制上,读数据时,IOPS性能其实没有差别。但是,相同的业务,在写入数据时,采用不同的RAID机制最终落在磁盘上的IOPS是有差别的,我们评估的正是磁盘的整体IOPS,如果达到了磁盘的限制,性能肯定是上不去了。

那我们假定一个case,业务应用的IOPS10000,读cache命中率是30%,读IOPS60%,写IOPS40%,磁盘个数为120,那么分别计算在RAID5RAID10的情况下,每个磁盘的IOPS为多少。

RAID5:
1. 
单块盘的IOPS = (10000*(1-0.3)*0.6 + 4 * (10000*0.4))/120
2. = (4200 + 16000)/120
3. = 168

这里的10000*(1-0.3)*0.6表示是读的IOPS,比例是0.6,除掉cache命中,实际只有4200个读IOPS

4 * (10000*0.4) 表示写的IOPS,因为每一个写,在RAID5中,实际发生了4io,所以写的IOPS16000个。

为了考虑RAID5在写操作的时候,那2个读操作也可能发生命中,所以更精确的计算应该为:
1. 
单块盘的IOPS = (10000*(1-0.3)*0.6 + 2 * (10000*0.4)*(1-0.3) + 2 * (10000*0.4))/120
2. = (4200 + 5600 + 8000)/120
3. = 148

这样我们计算出来单个盘的IOPS148个,基本达到磁盘IOPS极限,在这种情况下,磁盘的工作状态是非常不理想的。

RAID10IOPS性能的影响
1. 
单块盘的IOPS = (10000*(1-0.3)*0.6 + 2 * (10000*0.4))/120
2. = (4200 + 8000)/120
3. = 102

可以看到,因为RAID10对于一个写操作,只发生2io,所以,同样的压力,同样的磁盘,每个盘的IOPS只有102个,还远远低于磁盘的极限IOPS

这里回到我们先前讨论的case上来,在我们先前采用RAID5的时候,通过分析,每个磁盘的IOPS在高峰时期,快达到200了,导致响应速度巨慢无比。改造成RAID10,每个磁盘的IOPS降到100左右,很好的避免了这个性能问题。

因此,综合本文的上篇“RAID5RAID10,哪种RAID适合你,我们可以得出结论:

影响读数据的关键因素是cache命中率,在读数据的情况下,RAID5RAID10性能本身没有太大差别。但是对于写数据的一些应用,尤其是小I/O频繁写入的一些应用,如企业ERP生产系统等等,RAID10相比RAID5可能产生较大的性能差异。而大型文件存储,数据仓库,如医疗PACS系统、视频编辑系统则从空间利用的角度,建议采用RAID5

下面我们来说说什么是 RAID

RAID是英文Redundant Array of Independent Disks的缩写,翻译成中文意思是独立磁盘冗余阵列,有时也简称磁盘阵列(Disk Array)。

简单的说,RAID是一种把多块独立的硬盘(物理硬盘)按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据备份技术。组成磁盘阵列的不同方式成为RAID级别(RAID Levels)。数据备份的功能是在用户数据一旦发生损坏后,利用备份信息可以使损坏数据得以恢复,从而保障了用户数据的安全性。在用户看起来,组成的磁盘组就像是一个硬盘,用户可以对它进行分区,格式化等等。总之,对磁盘阵列的操作与单个硬盘一模一样。不同的是,磁盘阵列的存储速度要比单个硬盘高很多,而且可以提供自动数据备份。

  RAID技术的两大特点:一是速度、二是安全,由于这两项优点,RAID技术早期被应用于高级服务器中的SCSI接口的硬盘系统中,随着近年计算机技术的发展,PC机的CPU的速度已进入GHz 时代。IDE接口的硬盘也不甘落后,相继推出了ATA66ATA100硬盘。这就使得RAID技术被应用于中低档甚至个人PC机上成为可能。RAID通常是由在硬盘阵列塔中的RAID控制器或电脑中的RAID卡来实现的。

RAID技术经过不断的发展,现在已拥有了从 RAID 0  6 七种基本的RAID 级别。另外,还有一些基本RAID级别的组合形式,如RAID 10RAID 0RAID 1的组合),RAID 50RAID 0RAID 5的组合)等。不同RAID 级别代表着不同的存储性能、数据安全性和存储成本。但我们最为常用的是下面的几种RAID形式。

(1) RAID 0
(2) RAID 1
(3) RAID 0+1
(4) RAID 3
(5) RAID 5

ggg


RAID
级别的选择有三个主要因素:可用性(数据冗余)、性能和成本。如果不要求可用性,选择RAID0以获得最佳性能。如果可用性和性能是重要的而成本不是一个主要因素,则根据硬盘数量选择RAID 1。如果可用性、成本和性能都同样重要,则根据一般的数据传输和硬盘的数量选择RAID3、RAID5。

 

原帖出处:it168(http://storage.it168.com/h/2007-06-12/200706121108656.shtml)

raid10写入不用依赖cache命中率,只要一味的写入、读取即可

raid5写入要通过一系列的计算、校验,过程比较复杂,但是读取时候的性能一般都比较好

存储是目前IT产业发展的一大热点,而RAID技术是构造高性能、海量存储的基础技术,也是构建网络存储的基础技术。专家认为,磁盘阵列的性能优势得益于磁盘运行的并行性,提高设备运行并行度可以提高磁盘的性能和数据安全性

20年来,RAID 推出了一系列级别,包括RAID 0RAID 1RAID 2RAID 3RAID4RAID 5,以及各种组合如RAID 0+1 等。其中最广泛的包括RAID5RAID10。但是一直以来,关于RAID5RAID10的性能优劣的争端还是非常多的,甚至很多人包括很多公司都那拿出了测试数据。而这些测试数据复杂难懂相互矛盾,更加让用户感到迷惑,不知道如何选择。

在这里,我将就这两种RAID的内部运行原理来分析一下,看看我们在什么情况下应当适合选哪一种RAID方式。根据我的经验与分析:象小io数据库类型操作,如ERP等等应用,建议采用RAID10,而大型文件存储,数据仓库,如医疗PACS系统、视频编辑系统则从空间利用的角度,建议采用RAID5。下面请看详细的性能对比:

本文分为上下两篇,上文侧重分析两种RAID的内部运行原理,下文将根据不同的影响磁盘性能的因素来分析,RAID方案对磁盘系统的影响,参考“RAID5RAID10,哪种RAID更适合你() ”

为了方便对比,我这里拿同样多驱动器的磁盘来做对比,RAID5选择3D+1PRAID方案,RAID10选择2D+2DRaid方案,分别如图

RAID5+RAID10

那么,我们分析如下三个过程:读,连续写,随机写,但是,在介绍这三个过程之前,我需要介绍另外一个磁盘阵列中的重要概念:cache.

1.磁盘读写速度的关键之一:Cache

cache技术最近几年,在磁盘存储技术上,发展的非常迅速,作为高端存储,cache已经是整个存储的核心所在,就是中低端存储,也有很大的cache存在,包括最简单的RAID卡,一般都包含有几十,甚至几百兆的RAID cache

cache的主要作用是什么呢?作为缓存,cache的作用具体体现在读与写两个不同的方面:作为写,一般存储阵列只要求数据写到cache就算完成了写操作,当写cache的数据积累到一定程度,阵列才把数据刷到磁盘,可以实现批量的写入。所以,阵列的写是非常快速的。至于cache数据的保护,一般都依赖于镜相与电池(或者是UPS)。

cache在读数据方面的作用一样不可忽视,因为如果所需要读取的数据能在cache中命中的话,将大大减少磁盘寻道所需要的时间。因为磁盘从开始寻道到找到数据,一般都在6ms以上,而这个时间,对于那些密集型I/O的应用可能不是太理想。但是,如果能在cache保存的数据中命中,一般响应时间则可以缩短在1ms以内。

//不要迷信存储厂商的IOPS(每秒的io数)数据,他们可能全部在cache命中的基础上做到的,但是实际上,你的cache命中率可能只有10%//

介绍完cache,我们就可以解释RAID5RAID10在不同的模式下,工作效率问题了,那么我们来分别分析读操作、连续写和离散写三方面的问题。

2.读操作方面的性能差异

如我上文的介绍,磁盘阵列读操作的关键更多的体现在cache的命中率上。所以,RAID5RAID10在读数据上面,他们基本是没有差别的,除非是读的数据能影响cache命中率,导致命中率不一样。

连续写方面的性能差异
连续写的过程,一般表示写入连续的大批量的数据,如媒体数据流,很大的文件等等。连续写操作大多数产生于医疗PACS系统、高教图书馆系统、视频编辑系统等等应用环境下。

根据我本人的经验,在连续写操作过程,如果有写cache存在,并且算法没有问题的话,RAID5RAID10甚至会更好一些,虽然也许并没有太大的差别。(这里要假定存储有一定大小足够的写cache,而且计算校验的cpu不会出现瓶颈)。

因为这个时候的RAID校验是在cache中完成,如4块盘的RAID5,可以先在内存中计算好校验,同时写入3个数据+1个校验。而RAID10只能同时写入2个数据+2个镜相。

连续写

如上图所示,4块盘的RAID5可以在同时间写入123cache,并且在cache计算好校验之后,我这里假定是6(实际的校验计算并不是这样的,我这里仅仅是假设),同时把三个数据写到磁盘。而4块盘的RAID10不管cache是否存在,写的时候,都是同时写2个数据与2个镜相。

根据我前面对缓存原理的介绍,写cache是可以缓存写操作的,等到缓存写数据积累到一定时期再写到磁盘。但是,写到磁盘阵列的过程是迟早也要发生的,所以RAID5RAID10在连续写的情况下,从缓存到磁盘的写操作速度会有较小的区别。不过,如果不是连续性的强连续写,只要不达到磁盘的写极限,差别并不是太大。

3.离散写方面的性能差异

这里可能会较难理解,但是,这一部分也是最重要的部分。企业中的绝大部分数据库应用,如ERP系统等等在数据写入的时候其实都是离散写。

例如oracle数据库每次写一个数据块的数据,如8K;由于每次写入的量不是很大,而且写入的次数非常频繁,因此联机日志看起来会像是连续写。但是因为不保证能够添满RAID5的一个条带(保证每张盘都能写入),所以很多时候更加偏向于离散写入。

ddd

我们从上图看一下离散写的时候,RAID5RAID10工作方式有什么不同。如上图:我们假定要把一个数字2变成数字4,那么对于RAID5,实际发生了4io
先读出2与校验6,可能发生读命中
然后在cache中计算新的校验
写入新的数字4与新的校验8

如上图我们可以看到:对于RAID10,同样的单个操作,最终RAID10只需要2io,而RAID5需要4io

这里我忽略了RAID5在那两个读操作的时候,可能会发生读命中操作的情况。也就是说,如果需要读取的数据已经在cache中,可能是不需要4io的。这也证明了cacheRAID5 的重要性,不仅仅是计算校验需要,而且对性能的提升尤为重要。我本人曾经测试过,在RAID5的阵列中,如果关闭写cacheRAID5的性能将差很多倍。

当然,我并不是说cacheRAID10就不重要了,因为写缓冲,读命中等,都是提高速度的关键所在,不过的是,RAID10cache的依赖性没有RAID5那么明显而已。

到这里,大家应当也大致明白了RAID5RAID10的原理与差别了,一般来说,象小io的数据库类型操作,建议采用RAID10,而大型文件存储,数据仓库,则从空间利用的角度,可以采用RAID5

 

Raid-dp加盘和raid5加盘区别

1.raid-dp加盘

Raid-dp加盘,两块独立的校验盘不需要重新计算,不用重组raid,原来有数据的磁盘不需要重做条带,当新数据写入的时候,新次磁盘生成条带,随后校验盘有update

2.raid5加盘

Raid5加盘,需要重新计算校验数据,需要重组raid。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值