青兕的英文译语怎么说-成都北大青鸟怎么样


2023年3月31日发(作者:格雷魔法学校)

Windows性能计数器--磁盘性能分析Disk

PhysicalDisk:

单次IO大小

tes/Read

tes/Write

IO响应时间

c/Read磁盘每次读取需要的时间,一般不超过一般不要超过

11~15ms。

c/Write一般小于12ms

IOPS(每秒读/写的IO数)

理论情况下,磁盘的随机读计数为125、顺序读计数为225

实际测试值与理论值对比,从而判断磁盘是否为瓶颈

DiskReads/sec

DiskWrites/sec

DiskTransfers/sec

IO吞吐率(磁盘每秒读/写字节数)

DiskBytes/sec

DiskReadBytes/sec

DiskWriteBytes/sec

磁盘队列长度

eueLength:

磁盘平均队列长度不应超过2,即:队列长度/磁盘数

磁盘有两个重要的参数:Seektime、Rotationallatency。

正常的I/O计数为:①1000/(Seektime+Rotationallatency)*0.75,在此范围

内属正常。当达到85%的I/O计数以上时则基本认为已经存在I/O瓶颈。理论

情况下,磁盘的随机读计数为125、顺序读计数为225。对于数据文件而言是随

机读写,日志文件是顺序读写。因此,数据文件建议存放于RAID5上,而日志文

件存放于RAID10或RAID1中。

附:

15000RPM:150随机IOPS

10000RPM:110随机IOPS

5400RPM:50随机IOPS

下面假设在有4块硬盘的RAID5中观察到的PhysicalDisk性能对象的部分

值:

eueLength12队列长度

c/Read.035读数据所用时间ms

c/Write.045写数据所用时间ms

DiskReads/sec320每秒读数据量

DiskWrites/sec100每秒写数据量

eueLength,12/4=3,每块磁盘的平均队列建议不超过2。

c/Read一般不要超过11~15ms。

c/Write一般建议小于12ms。

从上面的结果,我们看到磁盘本身的I/O能力是满足我们的要求的,原因是因为

有大量的请求才导致队列等待,这很可能是因为你的SQL语句导致大量的表扫描

所致。在进行优化后,如果还是不能达到要求,下面的公式可以帮助你计算使用

几块硬盘可以满足这样的并发要求:

Raid0--I/Osperdisk=背古诗词 (reads+writes)/numberofdisks

Raid1--I/Osperdisk=[reads+(2*writes)]/2

Raid5--I/Osperdisk=[reads+(4*writes)]/numberofdisks

Raid10--I/Osperdisk=[reads+(2*writes)]/numberofdisks

我们得到的结果是:(320+400)/4=180,这时你可以根据公式①来得到磁盘的正

常I/O值。假设现在正常I/O计数为125,为了达到这个结果:720/125=5.76。

就是说要用6块磁盘才能达到这样的要求。

但是上面的DiskReads/sec和DiskWrites/sec是个很难正确估算的值。因惠崇春江晚景的古诗 此

只能在系统比较忙时,大概估算一个平均值,作为计算公式的依据。另一个是你

很难从客户那里得到Seektime、Rotationallatency参数的值,这也只能用

理论值125进行计算。

前言

作为一个数据库管理员,关注系统的性能是日常最重要的工作之一,而在所关注

的各方面的性能只能IO性能却是最令人头痛的一块,面对着各种生涩的参数和

令人眼花缭乱的新奇的术语,再加上存储厂商的忽悠,总是让我们有种云里雾里

的感觉。本系列文章试图从基本概念开始对磁盘存储相关的各种概念进行综合归

纳,让大家能够对IO性能相关的基本概念,IO性能的监控和调整有个比较全面

的了解。

在这一部分里我们先舍弃各种结构复杂的存储系统,直接研究一个单独的磁盘的

性能问题,藉此了解各个衡量IO系统系能的各个指标以及之间的关系。

几个基本的概念

在研究磁盘性能之前我们必须先了解磁盘的结构,以及工作原理。不过在这里就

不再重复说明了,关系硬盘结构和工作原理的信息可以参考维基百科上面的相关

词条——Harddiskdrive(英文)和硬盘驱动器(中文)。

读写IO(Read/WriteIO)操作

磁盘是用来给我们存取数据用的,因此当说到IO操作的时候,就会存在两种相

对应的操作,存数据时候对应的是写IO操作,取数据的时候对应的是读IO操

作。

单个IO操作

当控制磁盘的控制器接到操作系统的读IO操作指令的时候,控制器就会给磁盘

发出一个读数据的指令,并同时将要读取的数据块的地址传递给磁盘,然后磁盘

会将读取到的数据传给控制器,并由控制器返回给操作系统,完成一个写IO的

操作;同样的,一个写IO的操作也类似,控制器接到写的IO操作的指令和要写

入的数据,并将其传递给磁盘,磁盘在数据写入完成之后将操作结果传递回控制

器,再由控制器返回给操作系统,完成一个写IO的操作。单个IO操作指的就是

完成一个写IO或者是读IO的操作。

随机访问(RandomAccess)与连续访问(Sequential

Access)

随机访问指的是本次IO所给出的扇区地址和上次IO给出扇区地址相差比较大,

这样的话磁头在两次IO操作之间需要作比较大的移动动作才能重新开始读/写

数据。相反的,如果当次IO给出的扇区地址与上次IO结束的扇区地址一致或者

是接近的话,那磁头就能很快的开始这次IO操作,这样的多个IO操作称为连续

访问。因此尽管相邻的两次IO操作在同一时刻发出,但如果它们的请求的扇区

地址相差很大的话也只能称为随机访问,而非连续访问。

顺序IO模式(QueueMode)/并发IO模式(BurstMode)

磁盘控制器可能会一次对磁盘组发出一连串的IO命令,如果磁盘组一次只能执

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

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

个IO命令。

单个IO的大小(IOChunkSize)

熟悉数据库的人都会有这么一个概念,那就是数据库存储有个基本的块大小

(BlockSize),不管是SQLServer还是Oracle,默认的块大小都是8KB,就是

数据库每次读写都是以8k为单位的。那么对于数据库应用发出的固定8k大小的

单次读写到了写磁盘这个层面会是怎么样的呢,就是对于读写磁盘来说单个IO

操作操作数据的大小是多少呢,是不是也是卢梅坡的诗 一个固定的值?答案是不确定。首先

操作系统为了提高IO的性能而引入了文件系统缓存(FileSystemCache),系

统会根据请求数据的情况将多个来自IO的请求先放在缓存里面,然后再一次性

的提交给磁盘,也就是说对于数据库发出的多个8K数据块的读操作有可能放在

一个磁盘读IO里就处理了。还有对于有些存储系统也是提供了缓存(Cache)的,

接收到操作系统的IO请求之后也是会将多个操作系统的IO请求合并成一个来

处理。不管是操作系统层面的缓存还是磁盘控制器层面的缓存,目的都只有一个,

提高数据读写的效率。因此每次单独的IO操作大小都是不一样的,它主要取决

于系统对于数据读写效率的判断。

当一次IO操作大小比较小的时候我们成为小的IO操作,比如说1K,4K,8K这

样的;当一次IO操作的数据量比较的的时候称为大IO操作,比如说32K,64K

甚至更大。

在我们说到块大小(BlockSize)的时候通常我们会接触到多个类似的概念,像

我们上面提到的那个在数据库里面的数据最小的管理单位,Oralce称之为块

(Block),大小一般为8K,SQLServer称之为页(Page),一般大小也为8k。在

文件系统里面我们也能碰到一个文件系统的块,在现在很多的Linux系统中都是

4K(通过/usr/bin/time-v可以看到),它的作用其实跟数据库里面的块/页

是一样的,都是为了方便数据的管理。但是说到单次IO的大小,跟这些块的大

小都是没有直接关系的,在英文里单次IO大小通常被称为是IOChunkSize,

不会说成是IOBlockSize的。

IOPS(IOperSecond)

IOPS,IO系统每秒所执行IO操作的次数,是一个重要的用来衡量系统IO能力

的一个参数。对于单个磁盘组成的IO系统来说,计算它的IOPS不是一件很难的

事情,只要我们知道了系统完成一次IO所需要的时间的话我们就能推算出系统

IOPS来。

现在我们就来推算一下磁盘的IOPS,假设磁盘的转速(RotationalSpeed)为15K

RPM,平均寻道时间为5ms,最大传输速率为40MB/s(这里将读写速度视为一样,

实际会差别比较大)。

对于磁盘来说一个完整的IO操作是这样进行的:当控制器对磁盘发出一个IO

操作命令的时候,磁盘的驱动臂(ActuatorArm)带读写磁头(Head)离开着陆区

(LandingZone,位于内圈没有数据的区域),移动到要操作的初始数据块所在的

磁道(Track)的正上方,这个过程被称为寻址(Seeking),对应消耗的时间被称为

寻址时间(SeekTime);但是找到对应磁道还不能马上读取数据,这时候磁头要等

到磁盘盘片(Platter)旋转到初始数据块所在的扇区(Sector)落在读写磁头正上

方的之后才能开始读取数据,在这个等待盘片旋转到可操作扇区的过程中消耗的

时间称为旋转延时(RotationalDelay);接下来就随着盘片的旋转,磁头不断的

读/写相应的数据块,直到完成这次IO所需要操作的全部数据,这个过程称为数

据传送(DataTransfer),对应的时间称为传送时间(TransferTime)。完成这三个

步骤之后一次IO操作也就完成了。

在我们看硬盘厂商的宣传单的时候我们经常能看到3个参数,分别是平均寻址时

间、盘片旋转速度以及最大传送速度,这三个参数就可以提供给我们计算上述三

个步骤的时间。

第一个寻址时间,考虑到被读写的数据可能在磁盘的任意一个磁道,既有可能在

磁盘的最内圈(寻址时间最短),也可能在磁盘的最外圈(寻址时间最长),所

以在计算中我们只考虑平均寻址时间,也就是磁盘参数中标明的那个平均寻址时

间,这里就采用当前最多的10krmp硬盘的5ms。

第二个旋转延时,和寻址一样,当磁头定位到磁道之后有可能正好在要读写扇区

之上,这时候是不需要额外额延时就可以立刻读写到数据,但是最坏的情况确实

要磁盘旋转整整一圈之后磁头才能读取到数据,所以这里我们也考虑的是平均旋

转延时,对于10krpm的磁盘就是(60s/15k)*(1/2)=2ms。

第三个传送时间,磁盘参数提供我们的最大的传输速度,当然要达到这种速度是

很有难度的,但是这个速度却是磁盘纯读写磁盘的速度,因此只要给定了单次

IO的大小,我们就知道磁盘需要花费多少时间在数据传送上,这个时间就是

IOChunkSize/MaxTransferRate。

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

IOTime=SeekTime+60sec/RotationalSpeed/2+IOChunk

Size/TransferRate

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

IOPS=1/IOTime=1/(SeekTime+60sec/RotationalSpeed/2

+IOChunkSize/TransferRate)

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

4K(1/7.1ms=140IOPS)

5ms+(60sec/15000RPM/2)+4K/40MB=5+2+0.1=

7.1

8k(1/7.2ms=139IOPS)

5ms+(60sec/15000RPM/2)+8K/40MB=5+2+0.2=

7.2

16K(1/7.4ms=135IOPS)

5ms+(60sec/15000RPM/2)+16K/40MB=5+2+0.4=

7.4

32K(1/7.8ms=128IOPS)

5ms+(60sec/15000RPM/2)+32K/40MB=5+2+0.8=

7.8

64K(1/8.6ms=116IOPS)

5ms+(60sec/15000RPM/2)+64K/40MB=5+2+1.6=

8.6

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

相应的IOPS也就越大。

上面我们的数据都是在一个比较理想的假设下得出来的,这里的理想的情况就是

磁盘要花费平均大小的寻址时间和平均的旋转延时,这个假设其实是比较符合我

们实际情况中的随机读写,在随机读写中,每次IO操作的寻址时间和旋转延时

都不能忽略不计,有了这两个时间的存在也就限制了IOPS的大小。现在我们考

虑一种相对极端的顺序读写操作,比如说在读取一个很大的存储连续分布在磁盘

的文件,因为文件的存储的分布是连续的,磁头在完成一个读IO操作之后,不

需要从新的寻址,也不需要旋转延时,在这种情况下我们能到一个很大的IOPS

值,如下

4K(1/0.1ms=10000IOPS)

0ms+0ms+4K/40MB=0.1

8k(1/0.2ms=5000IOPS)

0ms+0ms+8K/40MB=0.2

16K(1/0.4ms=2500IOPS)

0ms+0ms+16K/40MB=0.4

32K(1/0.8ms=1250IOPS)

0ms+0ms+32K/40MB=0.8

64K(1/1.6ms=625IOPS)

0ms+0ms+64K/40MB=1.6

相比第一组数据来说差距是非常的大的,因此当我们要用IOPS来衡量一个IO

系统的系能的时候我们一定要说清楚是在什么情况的IOPS,也就是要说明读写

的方式以及单次IO的大小,当然在实际当中,特别是在OLTP的系统的,随机的

小IO的读写是最有说服力的。

传输速度(TransferRate)/吞吐率

(Throughput)

现在我们要说的传输速度(另一个常见的说法是吞吐率)不是磁盘上所表明的最

大传输速度或者说理想传输速度原唱 ,而是磁盘在实际使用的时候从磁盘系统总线上

流过的数据量。有了IOPS数据之后我们是很容易就能计算出对应的传输速度来

TransferRate=IOPS*IOChunkSize

还是那上面的第一组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了。

IO响应时间(IOResponseTime)

最后来关注一下能直接描述IO性能的IO响应时间。IO响应时间也被称为IO延

时(IOLatency),IO响应时间就是从操作系统内核发出的一个读或者写的IO命

令到操作金炉香烬漏声残 系统内核接收到IO回应的时间,注意不要和单个IO时间混淆了,单个

IO时间仅仅指的是IO操作在磁盘内部处理的时间,而IO响应时间还要包括IO

操作在IO等待队列中所花费的等待时间。

计算IO操作在等待队列里面消耗的时间有一个衍生于利托氏定理

(Little’sLaw)的排队模型M/M/1模型可以遵循,由于排队模型算法比较复杂,

到现在还没有搞太明白(如果有谁对M/M/1模型比较精通的话欢迎给予指导),

这里就罗列一下最后的结果,还是那上面计算的IOPS数据来说:

8KIOChunkSize(135IOPS,7.2ms)

135=>240.0ms

105=>29.5ms

75=>15.7ms

45=>10.6ms

64KIOChunkSize(116IOPS,8.6ms)

135=>没响应了……

105=>88.6ms

75=>24.6ms

45=>14.6ms

从上面的数据可以看出,随着系统实际IOPS越接近理论的最大值,IO的响应时

间会成非线性的增长,越是接近最大值,响应时间就变得越大,而且会比预期超

出很多。一般来说在实际的应用中有一个70%的指导值,也就是说在IO读写的

队列中,当队列大小小于最大IOPS的70%的时候,IO的响应时间增加会很小,

相对来说让人比较能接受的,一旦超过70%,响应时间就会戏剧性的暴增,所以

当一个系统的IO压力超出最大可承受压力的70%的时候就是必须要考虑调整或

升级了。

另外补充说一下这个70%的指导值也适用于CPU响应时间,这也是在实践中证明

过的,一旦CPU超过70%,系统将会变得受不了的慢。很有意思的东西。

从上一篇文章的计算中我们可以看到一个15k转速的磁盘在随机读写访问的情

况下IOPS竟然只有140左右,但在实际应用中我们却能看到很多标有5000IOPS

甚至更高的存储系统,有这么大IOPS的存储系统怎么来的呢糊的组词组什么 ?这就要归结于各

种存储技术的使用了,在这些存储技术中使用最广的就是高速缓存(Cache)和磁

盘冗余阵列(RAID)了,本文就将探讨缓存和磁盘阵列提高存储IO性能的方法。

高速缓存(Cache)

在当下的各种存储产品中,按照速度从快到慢应该就是内存>闪存>磁盘>磁带了,

然而速度越快也就意味着价格越高,闪存虽然说是发展势头很好,但目前来说却

还是因为价格问题无法普及,因此现在还是一个磁盘作霸王的时代。与CPU和内

存速度相比,磁盘的速度无疑是计算机系统中最大的瓶颈了,所以在必须使用磁

盘而又想提高性能的情况下,人们想出了在磁盘中嵌入一块高速的内存用来保存

经常访问的数据从而提高读写效率的方法来折中的解决,这块嵌入的内存就被称

为高速缓存。

说到缓存,这东西应用现在已经是无处不在,从处于上层的应用,到操作系统层,

再到磁盘控制器,还有CPU内部,单个磁盘的内部也都存在缓存,所有这些缓存

存在的目的都是相同的,就是提高系统执行的效率。当然在这里我们只关心跟

IO性能相关的缓存,与IO性能直接相关的几个缓存分别是文件系统缓存

(FileSystemCache)、磁盘控制器缓存(DiskControllerCache)和磁盘缓存

(DiskCache,也称为DiskBuffer),不过当在计算一个磁盘系统性能的时候文件

系统缓存也是不会考虑在内的,因此我们重点考察的就是磁盘控制器缓存和磁盘

缓存。

不管是控制器缓存还是磁盘缓存,他们所起的作用主要是分为三部分:缓存数据、

预读(Read-ahead)和回写(Write-back)。

缓存数据

首先是系统读取过的数据会被缓存在高速缓存中,这样下次再次需要读取相同的

数据的时候就不用在访问磁盘,直接从缓存中取数据就可以了。当然使用过的数

据也不可能在缓存中永久保留的,缓存的数据一般那是采取LRU算法来进行管

理,目的是将长时间不用的数据清除出缓存,那些经常被访问的却能一直保留在

缓存中,直到缓存被清空。

预读

预读是指采用预读算法在没有系统的IO请求的时候事先将数据从磁盘中读入到

缓存中,然后在系统发出读IO请求的时候,就会实现去检查看看缓存里面是否

存在要读取的数据,如果存在(即命中)的话就直接将结果返回,这时候的磁盘

不再需要寻址、旋转等待、读取数据这一序列的操作了,这样是能节省很多时间

的;如果没有命中则再发出真正的读取磁盘的命令去取所需要的数据。

缓存的命中率跟缓存的大小有很大的关系,理论上是缓存越大的话,所能缓存的

数据也就越多,这样命中率也自然越高,当然缓存不可能太大,毕竟成本在那儿

呢。如果一个容量很大的存储系统配备了一个很小的读缓存的话,这时候问题会

比较大的,因为小缓存的数据量非常小,相比整个存储系统来说比例非常低,这

样随机读取(数据库系统的大多数情况)的时候命中率也自然就很低,这样的缓

存不但不能提高效率(因为绝大部分读IO都还要读取磁盘),反而会因为每次

去匹配缓存而浪费时间。

执行读IO操作是读取数据存在于缓存中的数量与全荷花的诗句有哪些 部要读取数据的比值称为缓

存命中率(ReadCacheHitRadio),假设一个存储系统在不使用缓存的情况下随

机小IO读取能达到150IOPS,而它的缓存能提供10%的缓存命中率的话,那么实

际上它的IOPS可以达到150/(1-10%)=166。

回写

首先说一下,用于回写功能的那部分缓存被称为写缓存(WriteCache)。在一套写

缓存打开的存储中,操作系统所发出的一系列写IO命令并不会被挨个的执行,

这些写IO的命令会先写入缓存中,然后再一次性的将缓存中的修改推到磁盘中,

这就相当于将那些相同的多个IO合并成一个,多个连续操作的小IO合并成一个

大的IO,还有就是将多个随机的写IO变成一组连续的写IO,这样就能减少磁盘

寻址等操作所消耗的时间,大大的提高磁盘写入的效率。

读缓存虽然对效率提高是很明显的,但是它所带来的问题也比较严重,因为缓存

和普通内存一样,掉点以后数据会全部丢失,当操作系统发出的写IO命令写入

到缓存中后即被认为是写入成功,而实际上数据是没有被真正写入磁盘的,此时

如果掉电,缓存中的数据就会永远的丢失了,这个对应用来说是灾难性的,目前

解决这个问题最好的方法就是给缓存配备电池了,保证存储掉电之后缓存数据能

如数保存下来。

和读一样,写缓存也存在一个写缓存命中率(WriteCacheHitRadio),不过和读

缓存命中情况不一样的是,尽管缓存命中,也不能将实际的IO操作免掉,只是

被合并了而已。

控制器缓存和磁盘缓存除了上面的作用之外还承当着其他的作用,比如磁盘缓存

有保存IO命令队列的功能,单个的磁盘一次只能处理一个IO命令,但却能接收

多个IO命令,这些进入到磁盘而未被处理的命令就保存在缓存中的IO队列中。

RAID(RedundantArrayOf

InexpensiveDisks)

如果你是一位数据库管理员或者经常接触服务器,那对RAID应该很熟悉了,作

为最廉价的存储解决方案,RAID早已在服务器存储中得到了普及。在RAID的各

个级别中,应当以RAID10和RAID5(不过RAID5已经基本走到头了,RAID6正在

崛起中,看看这里了解下原因)应用最广了。下面将就RAID0,RAID1,RAID5,

RAID6,RAID10这几种级别的RAID展开说一下磁盘阵列对于磁盘性能的影响,

当然在阅读下面的内容之前你必须对各个级别的RAID的结构和工作原理要熟悉

才行,这样才不至于满头雾水,推荐查看wikipedia上面的如下条目:RAID,

StandardRAIDlevels,NestedRAIDlevels。

RAID0

RAID0将数据条带化(striping)将连续的数据分散在多个磁盘上进行存取,系统

发出的IO命令《过华清宫》杜牧 古诗 (不管读IO和写IO都一样)就可以在磁盘上被并行的执行,每

个磁盘单独执行自己的那一部分请求,这样的并行的IO操作能大大的增强整个

存储系统的性能。假设一个RAID0阵列有n(n>=2)个磁盘组成,每个磁盘的随机

读写的IO能力都达到140的话,那么整个磁盘阵列的IO能力将是140*n。同时

如果在阵列总线的传输能力允许的话RAID0的吞吐率也将是单个磁盘的n倍。

RAID1

RAID1在容量上相当于是将两个磁盘合并成一个磁盘来使用了,互为镜像的两个

磁盘里面保存的数据是完全一样的,因此在并行读取的时候速度将是n个磁盘速

度的总和,但是写入就不一样了,每次写入都必须同时写入到两个磁盘中,因此

写入速度只有n/2。

RAID5

我们那一个有n(n>=3)个磁盘的RAID5阵列来看,首先看看RAID5阵列的读IO,

RAID5是支持并行IO的,而磁盘上的数据呈条带状的分布在所有的磁盘上,因

此读IO的速度相当于所有磁盘速度的总和。不过这是在没有磁盘损坏的情况下,

当有一个磁盘故障的时候读取速度也是会下降的,因为中间需要花时间来计算丢

失磁盘上面的数据。

读取数据的情况相对就要复杂的多了,先来看下RAID5奇偶校验数据写入的过

程,我们把写入的数据称为D1,当磁盘拿到一个写IO的命令的时候,它首先会

读取一次要写入的地址的数据块中修改之前的数据D0,然后再读取到当前条带

中的校验信息P0,接下来就根据D0,P0,D1这三组数据计算出数据写入之后的

条带的奇偶校验信息P1,最后发出两个写IO的命令,一个写入D1,另一个写入

奇偶校验信息P1。可以看出阵列在实际操作的时候需要读、读、写、写一共4

个IO才能完成一次写IO操作,也就是实际上的写入速度只有所有磁盘速度总

和的1/4。从这点可以看出RAID5是非常不适合用在要大批量写入数据的系统上

的。

RAID6

RAID6和RAID5很类似,差别就在于RAID6多了一个用于校验的磁盘。就读IO

速度上来说这两个是完全一样的,都是所有磁盘IO速度的总和。

在写IO上也很是类似,不同的是RAID将一个命令分成了三次读、三次写一共6

次IO命令才能完成,也就是RAID6实际写入磁盘的速度是全部磁盘速度之和的

1/6。可以看出从写IO看RAID6比RAID5差别是很大的。

RAID10

RAID0读写速度都很好,却没有冗余保护;RAID5和RAID6都有同样的毛病就

是写入的时候慢,读取的时候快。那么RAID1呢?嗯,这里要说的就是RAID1,

其实不管是RAID10还是RAID01,其实都是组合大于2块磁盘时候的RAID1,当

先镜像后条带时候就称为RAID10,先条带后镜像的时候称为RAID01。从性能上

看RAID01和RAID10都是一样的,都是RAID1嘛,但是RAID10在重建故障磁盘

的时候性能比RAID01要快。因无怨的青春席慕容 为RAID10其实就是RAID1,所以它的性能与

RAID1也就是一样的了,这里不需要再做过多的讨论。

四个性能指标的变化

IO响应时间(IOResponseTime)

在任何时候IO响应时间值得都是单个IO的响应时间,因此,不管磁盘是否组成

了磁盘阵列,它的IO响应时间应该都是一样的。从前面的计算中我们可以看到,

如果IO响应时间在10ms左右的话是很正常的,但是当IO响应时间比这个值超

出太多的时候,你就要开始注意了,很可能就意味着此时你的磁盘系统已经成为

了一个瓶颈。

IOPS

综合上面两个部分的讨论我们来估算一下阵列下的磁盘总体IOPS,在这里我们

先假设组成阵列的单个磁盘的随机读写的IOPS为140,读写缓存命中率都为10%,

组成阵列的磁盘个数为4。

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

读取IOPS:

readIOPS=disk_IOPS/(1-read_cache_hit_ratio)*disk_num=140/(1-1

0%)*4=622

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

RAID0:1IOrequest=>need1actualIOondisk

RAID1:1IOrequest=>need2actualIOondisk

RAID5:1IOrequest=>need4actualIOondisk

RAID6:1IOrequest=>need6actualIOondisk

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

RAID0writeIOPS=disk_IOPS/(1-write_cache_hit_ratio)*disk_num/act

ure_IO_num=140/(1-10%)*4/1=622

RAID1writeIOPS=disk_IOPS/(1-write_cache_hit_ratio)*disk_num/act

ure_IO_num=140/(1-10%)*4/2=311

RAID5writeIOPS=disk_IOPS/(1-write_cache_hit_ratio)*disk_num/act

ure_IO_num=140/(1-10%)*4/4=155

RAID6writeIOPS=disk_IOPS/(1-write_cache_hit_ratio)*disk_num/act

ure_IO_num=140/(1-10%)*4/6=103

实际上从通过上面的计算方法我们还可以估算当给定一个要求的IOPS的情况

下,估计下使用各个阵列级别所需要的磁盘的数量。当然我们上面的计算方法只

是一个估算,我们忽略很多其他的因素,得出的只是一个大概的数值,不过在实

际的应用还是有一定的参考作用的。

本篇最后附送一个计算磁盘系统IOPS的网站――wmarow’sdisk&diskarray

calculator,这个网站提供的计算公式还考虑了诸如阵列条带大小以及主机方面

的因素,很有参考价值,至于怎么选择合适的条带大小,请参考【延伸阅读】部

分。

传输速度(TransferRate)/吞吐率(Throughput)

实际上估算除了随机读写的IOPS也就知道了随机读写的吞吐率。对于顺序读写

的呢,还是跟前一篇所讲的一样,主要受限于磁盘的限制,不能再拿IOPS来衡

量了。

random_throughtput=random_IOPS*IO_chunk_size

更多推荐

harddisk是什么意思ddisk在线翻译读音