下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 IO系统性能

IO系统性能.doc

IO系统性能

摩羯旭然
2013-07-23 0人阅读 举报 0 0 暂无简介

简介:本文档为《IO系统性能doc》,可适用于IT/计算机领域

【转载】IO系统性能之一:衡量性能的几个指标(::)HYPERLINK"javascript:"INCLUDEPICTURE"http:simgsinajscnblogstyleimagescommonsgtransgif"*MERGEFORMATINET转载标签:io杂谈分类:HW原文:http:wwwdbabetacomioperformenceseveralconceptshtmlIO系统性能之一:衡量性能的几个指标前言几个基本的概念单个IO的大小(IOChunkSize)IOPS(IOperSecond)传输速度(TransferRate)吞吐率(Throughput)IO响应时间(IOResponseTime)延伸阅读注意:本系列文章中所涉及的性能都是指磁盘(MagneticDisks)IO性能不考虑网络以及其他的性质的IO性能。top前言作为一个数据库管理员关注系统的性能是日常最重要的工作之一而在所关注的各方面的性能只能IO性能却是最令人头痛的一块面对着各种生涩的参数和令人眼花缭乱的新奇的术语再加上存储厂商的忽悠总是让我们有种云里雾里的感觉。本系列文章试图从基本概念开始对磁盘存储相关的各种概念进行综合归纳让大家能够对IO性能相关的基本概念IO性能的监控和调整有个比较全面的了解。在这一部分里我们先舍弃各种结构复杂的存储系统直接研究一个单独的磁盘的性能问题藉此了解各个衡量IO系统系能的各个指标以及之间的关系。top几个基本的概念在研究磁盘性能之前我们必须先了解磁盘的结构以及工作原理。不过在这里就不再重复说明了关系硬盘结构和工作原理的信息可以参考维基百科上面的相关词条Harddiskdrive(英文)和硬盘驱动器(中文)。读写IO(ReadWriteIO)操作磁盘是用来给我们存取数据用的因此当说到IO操作的时候就会存在两种相对应的操作存数据时候对应的是写IO操作取数据的时候对应的是是读IO操作。单个IO操作当控制磁盘的控制器接到操作系统的读IO操作指令的时候控制器就会给磁盘发出一个读数据的指令并同时将要读取的数据块的地址传递给磁盘然后磁盘会将读取到的数据传给控制器并由控制器返回给操作系统完成一个写IO的操作同样的一个写IO的操作也类似控制器接到写的IO操作的指令和要写入的数据并将其传递给磁盘磁盘在数据写入完成之后将操作结果传递回控制器再由控制器返回给操作系统完成一个写IO的操作。单个IO操作指的就是完成一个写IO或者是读IO的操作。随机访问(RandomAccess)与连续访问(SequentialAccess)随机访问指的是本次IO所给出的扇区地址和上次IO给出扇区地址相差比较大这样的话磁头在两次IO操作之间需要作比较大的移动动作才能重新开始读写数据。相反的如果当次IO给出的扇区地址与上次IO结束的扇区地址一致或者是接近的话那磁头就能很快的开始这次IO操作这样的多个IO操作称为连续访问。因此尽管相邻的两次IO操作在同一时刻发出但如果它们的请求的扇区地址相差很大的话也只能称为随机访问而非连续访问。顺序IO模式(QueueMode)并发IO模式(BurstMode)磁盘控制器可能会一次对磁盘组发出一连串的IO命令如果磁盘组一次只能执行一个IO命令时称为顺序IO当磁盘组能同时执行多个IO命令时称为并发IO。并发IO只能发生在由多个磁盘组成的磁盘组上单块磁盘只能一次处理一个IO命令。top单个IO的大小(IOChunkSize)熟悉数据库的人都会有这么一个概念那就是数据库存储有个基本的块大小(BlockSize)不管是SQLServer还是Oracle默认的块大小都是KB就是数据库每次读写都是以k为单位的。那么对于数据库应用发出的固定k大小的单次读写到了写磁盘这个层面会是怎么样的呢就是对于读写磁盘来说单个IO操作操作数据的大小是多少呢是不是也是一个固定的值?答案是不确定。首先操作系统为了提高IO的性能而引入了文件系统缓存(FileSystemCache)系统会根据请求数据的情况将多个来自IO的请求先放在缓存里面然后再一次性的提交给磁盘也就是说对于数据库发出的多个K数据块的读操作有可能放在一个磁盘读IO里就处理了。还有对于有些存储系统也是提供了缓存(Cache)的接收到操作系统的IO请求之后也是会将多个操作系统的IO请求合并成一个来处理。不管是操作系统层面的缓存还是磁盘控制器层面的缓存目的都只有一个提高数据读写的效率。因此每次单独的IO操作大小都是不一样的它主要取决于系统对于数据读写效率的判断。当一次IO操作大小比较小的时候我们成为小的IO操作比如说KKK这样的当一次IO操作的数据量比较的的时候称为大IO操作比如说KK甚至更大。在我们说到块大小(BlockSize)的时候通常我们会接触到多个类似的概念像我们上面提到的那个在数据库里面的数据最小的管理单位Oralce称之为块(Block)大小一般为KSQLServer称之为页(Page)一般大小也为k。在文件系统里面我们也能碰到一个文件系统的块在现在很多的Linux系统中都是K(通过usrbintimev可以看到)它的作用其实跟数据库里面的块页是一样的都是为了方便数据的管理。但是说到单次IO的大小跟这些块的大小都是没有直接关系的在英文里单次IO大小通常被称为是IOChunkSize不会说成是IOBlockSize的。topIOPS(IOperSecond)IOPSIO系统每秒所执行IO操作的次数是一个重要的用来衡量系统IO能力的一个参数。对于单个磁盘组成的IO系统来说计算它的IOPS不是一件很难的事情只要我们知道了系统完成一次IO所需要的时间的话我们就能推算出系统IOPS来。现在我们就来推算一下磁盘的IOPS假设磁盘的转速(RotationalSpeed)为KRPM平均寻道时间为ms最大传输速率为MBs(这里将读写速度视为一样实际会差别比较大)。对于磁盘来说一个完整的IO操作是这样进行的:当控制器对磁盘发出一个IO操作命令的时候磁盘的驱动臂(ActuatorArm)带读写磁头(Head)离开着陆区(LandingZone位于内圈没有数据的区域)移动到要操作的初始数据块所在的磁道(Track)的正上方这个过程被称为寻址(Seeking)对应消耗的时间被称为寻址时间(SeekTime)但是找到对应磁道还不能马上读取数据这时候磁头要等到磁盘盘片(Platter)旋转到初始数据块所在的扇区(Sector)落在读写磁头正上方的之后才能开始读取数据在这个等待盘片旋转到可操作扇区的过程中消耗的时间称为旋转延时(RotationalDelay)接下来就随着盘片的旋转磁头不断的读写相应的数据块直到完成这次IO所需要操作的全部数据这个过程称为数据传送(DataTransfer)对应的时间称为传送时间(TransferTime)。完成这三个步骤之后一次IO操作也就完成了。在我们看硬盘厂商的宣传单的时候我们经常能看到个参数分别是平均寻址时间、盘片旋转速度以及最大传送速度这三个参数就可以提供给我们计算上述三个步骤的时间。第一个寻址时间考虑到被读写的数据可能在磁盘的任意一个磁道既有可能在磁盘的最内圈(寻址时间最短)也可能在磁盘的最外圈(寻址时间最长)所以在计算中我们只考虑平均寻址时间也就是磁盘参数中标明的那个平均寻址时间这里就采用当前最多的krmp硬盘的ms。第二个旋转延时和寻址一样当磁头定位到磁道之后有可能正好在要读写扇区之上这时候是不需要额外额延时就可以立刻读写到数据但是最坏的情况确实要磁盘旋转整整一圈之后磁头才能读取到数据所以这里我们也考虑的是平均旋转延时对于krpm的磁盘就是(sk)*()=ms。第三个传送时间磁盘参数提供我们的最大的传输速度当然要达到这种速度是很有难度的但是这个速度却是磁盘纯读写磁盘的速度因此只要给定了单次IO的大小我们就知道磁盘需要花费多少时间在数据传送上这个时间就是IOChunkSizeMaxTransferRate。现在我们就可以得出这样的计算单次IO时间的公式:IOTime=SeekTimesecRotationalSpeedIOChunkSizeTransferRate于是我们可以这样计算出IOPSIOPS=IOTime=(SeekTimesecRotationalSpeedIOChunkSizeTransferRate)对于给定不同的IO大小我们可以得出下面的一系列的数据K(ms=IOPS)   ms(secRPM)KMB==k(ms=IOPS)   ms(secRPM)KMB==K(ms=IOPS)   ms(secRPM)KMB==K(ms=IOPS)   ms(secRPM)KMB==K(ms=IOPS)   ms(secRPM)KMB==从上面的数据可以看出当单次IO越小的时候单次IO所耗费的时间也越少相应的IOPS也就越大。上面我们的数据都是在一个比较理想的假设下得出来的这里的理想的情况就是磁盘要花费平均大小的寻址时间和平均的旋转延时这个假设其实是比较符合我们实际情况中的随机读写在随机读写中每次IO操作的寻址时间和旋转延时都不能忽略不计有了这两个时间的存在也就限制了IOPS的大小。现在我们考虑一种相对极端的顺序读写操作比如说在读取一个很大的存储连续分布在磁盘的的文件因为文件的存储的分布是连续的磁头在完成一个读IO操作之后不需要从新的寻址也不需要旋转延时在这种情况下我们能到一个很大的IOPS值如下K(ms=IOPS)   msmsKMB=k(ms=IOPS)   msmsKMB=K(ms=IOPS)   msmsKMB=K(ms=IOPS)   msmsKMB=K(ms=IOPS)   msmsKMB=相比第一组数据来说差距是非常的大的因此当我们要用IOPS来衡量一个IO系统的系能的时候我们一定要说清楚是在什么情况的IOPS也就是要说明读写的方式以及单次IO的大小当然在实际当中特别是在OLTP的系统的随机的小IO的读写是最有说服力的。top传输速度(TransferRate)吞吐率(Throughput)现在我们要说的传输速度(另一个常见的说法是吞吐率)不是磁盘上所表明的最大传输速度或者说理想传输速度而是磁盘在实际使用的时候从磁盘系统总线上流过的数据量。有了IOPS数据之后我们是很容易就能计算出对应的传输速度来的TransferRate=IOPS*IOChunkSize还是那上面的第一组IOPS的数据我们可以得出相应的传输速度如下K:*K = KM= K:*K =KM=K:*K=KM=K:*K=KM=可以看出实际上的传输速度是很小的对总线的利用率也是非常的小。这里一定要明确一个概念那就是尽管上面我们使用IOPS来计算传输速度但是实际上传输速度和IOPS是没有直接关系在没有缓存的情况下它们共同的决定因素都是对磁盘系统的访问方式以及单个IO的大小。对磁盘进行随机访问时候我们可以利用IOPS来衡量一个磁盘系统的性能此时的传输速度不会太大但是当对磁盘进行连续访问时此时的IOPS已经没有了参考的价值这个时候限制实际传输速度却是磁盘的最大传输速度。因此在实际的应用当中只会用IOPS来衡量小IO的随机读写的性能而当要衡量大IO连续读写的性能的时候就要采用传输速度而不能是IOPS了。topIO响应时间(IOResponseTime)最后来关注一下能直接描述IO性能的IO响应时间。IO响应时间也被称为IO延时(IOLatency)IO响应时间就是从操作系统内核发出的一个读或者写的IO命令到操作系统内核接收到IO回应的时间注意不要和单个IO时间混淆了单个IO时间仅仅指的是IO操作在磁盘内部处理的时间而IO响应时间还要包括IO操作在IO等待队列中所花费的等待时间。计算IO操作在等待队列里面消耗的时间有一个衍生于利托氏定理(Little’sLaw)的排队模型MM模型可以遵循由于排队模型算法比较复杂到现在还没有搞太明白(如果有谁对MM模型比较精通的话欢迎给予指导)这里就罗列一下最后的结果还是那上面计算的IOPS数据来说:KIOChunkSize(IOPS,ms)   =>ms   =>ms    =>ms    =>ms KIOChunkSize(IOPS,ms)   =>没响应了……   =>ms    =>ms    =>ms从上面的数据可以看出随着系统实际IOPS越接近理论的最大值IO的响应时间会成非线性的增长越是接近最大值响应时间就变得越大而且会比预期超出很多。一般来说在实际的应用中有一个的指导值也就是说在IO读写的队列中当队列大小小于最大IOPS的的时候IO的响应时间增加会很小相对来说让人比较能接受的一旦超过响应时间就会戏剧性的暴增所以当一个系统的IO压力超出最大可承受压力的的时候就是必须要考虑调整或升级了。另外补充说一下这个的指导值也适用于CPU响应时间这也是在实践中证明过的一旦CPU超过系统将会变得受不了的慢。很有意思的东西。top延伸阅读·HardDiskDrivewikipedia·磁盘驱动器wikepedia·SATAIOPSMeasurement·磁盘驱动器性能相关概念·Little’sLaw·MMModelIO系统性能之二:缓存和RAID如何提高磁盘IO性能高速缓存(Cache)RAID(RedundantArrayOfInexpensiveDisks)四个性能指标的变化IO响应时间(IOResponseTime)IOPS传输速度(TransferRate)吞吐率(Throughput)延伸阅读从上一篇文章的计算中我们可以看到一个k转速的磁盘在随机读写访问的情况下IOPS竟然只有左右但在实际应用中我们却能看到很多标有IOPS甚至更高的存储系统有这么大IOPS的存储系统怎么来的呢?这就要归结于各种存储技术的使用了在这些存储技术中使用最广的就是高速缓存(Cache)和磁盘冗余阵列(RAID)了本文就将探讨缓存和磁盘阵列提高存储IO性能的方法。top高速缓存(Cache)在当下的各种存储产品中按照速度从快到慢应该就是内存>闪存>磁盘>磁带了然而速度越快也就意味着价格越高闪存虽然说是发展势头很好但目前来说却还是因为价格问题无法普及因此现在还是一个磁盘作霸王的时代。与CPU和内存速度相比磁盘的速度无疑是计算机系统中最大的瓶颈了所以在必须使用磁盘而又想提高性能的情况下人们想出了在磁盘中嵌入一块高速的内存用来保存经常访问的数据从而提高读写效率的方法来折中的解决这块嵌入的内存就被称为高速缓存。说到缓存这东西应用现在已经是无处不在从处于上层的应用到操作系统层再到磁盘控制器还有CPU内部单个磁盘的内部也都存在缓存所有这些缓存存在的目的都是相同的就是提高系统执行的效率。当然在这里我们只关心跟IO性能相关的缓存与IO性能直接相关的几个缓存分别是文件系统缓存(FileSystemCache)、磁盘控制器缓存(DiskControllerCache)和磁盘缓存(DiskCache,也称为DiskBuffer)不过当在计算一个磁盘系统性能的时候文件系统缓存也是不会考虑在内的因此我们重点考察的就是磁盘控制器缓存和磁盘缓存。不管是控制器缓存还是磁盘缓存他们所起的作用主要是分为三部分:缓存数据、预读(Readahead)和回写(Writeback)。缓存数据首先是系统读取过的数据会被缓存在高速缓存中这样下次再次需要读取相同的数据的时候就不用在访问磁盘直接从缓存中取数据就可以了。当然使用过的数据也不可能在缓存中永久保留的缓存的数据一般那是采取LRU算法来进行管理目的是将长时间不用的数据清除出缓存那些经常被访问的却能一直保留在缓存中直到缓存被清空。预读预读是指采用预读算法在没有系统的IO请求的时候事先将数据从磁盘中读入到缓存中然后在系统发出读IO请求的时候就会实现去检查看看缓存里面是否存在要读取的数据如果存在(即命中)的话就直接将结果返回这时候的磁盘不再需要寻址、旋转等待、读取数据这一序列的操作了这样是能节省很多时间的如果没有命中则再发出真正的读取磁盘的命令去取所需要的数据。缓存的命中率跟缓存的大小有很大的关系理论上是缓存越大的话所能缓存的数据也就越多这样命中率也自然越高当然缓存不可能太大毕竟成本在那儿呢。如果一个容量很大的存储系统配备了一个很小的读缓存的话这时候问题会比较大的因为小缓存缓存的数据量非常小相比整个存储系统来说比例非常低这样随机读取(数据库系统的大多数情况)的时候命中率也自然就很低这样的缓存不但不能提高效率(因为绝大部分读IO都还要读取磁盘)反而会因为每次去匹配缓存而浪费时间。执行读IO操作是读取数据存在于缓存中的数量与全部要读取数据的比值称为缓存命中率(ReadCacheHitRadio)假设一个存储系统在不使用缓存的情况下随机小IO读取能达到IOPS而它的缓存能提供的缓存命中率的话那么实际上它的IOPS可以达到()=。回写首先说一下用于回写功能的那部分缓存被称为写缓存(WriteCache)。在一套写缓存打开的存储中操作系统所发出的一系列写IO命令并不会被挨个的执行这些写IO的命令会先写入缓存中然后再一次性的将缓存中的修改推到磁盘中这就相当于将那些相同的多个IO合并成一个多个连续操作的小IO合并成一个大的IO还有就是将多个随机的写IO变成一组连续的写IO这样就能减少磁盘寻址等操作所消耗的时间大大的提高磁盘写入的效率。读缓存虽然对效率提高是很明显的但是它所带来的问题也比较严重因为缓存和普通内存一样掉点以后数据会全部丢失当操作系统发出的写IO命令写入到缓存中后即被认为是写入成功而实际上数据是没有被真正写入磁盘的此时如果掉电缓存中的数据就会永远的丢失了这个对应用来说是灾难性的目前解决这个问题最好的方法就是给缓存配备电池了保证存储掉电之后缓存数据能如数保存下来。和读一样写缓存也存在一个写缓存命中率(WriteCacheHitRadio)不过和读缓存命中情况不一样的是尽管缓存命中也不能将实际的IO操作免掉只是被合并了而已。控制器缓存和磁盘缓存除了上面的作用之外还承当着其他的作用比如磁盘缓存有保存IO命令队列的功能单个的磁盘一次只能处理一个IO命令但却能接收多个IO命令这些进入到磁盘而未被处理的命令就保存在缓存中的IO队列中。topRAID(RedundantArrayOfInexpensiveDisks)如果你是一位数据库管理员或者经常接触服务器那对RAID应该很熟悉了作为最廉价的存储解决方案RAID早已在服务器存储中得到了普及。在RAID的各个级别中应当以RAID和RAID(不过RAID已经基本走到头了RAID正在崛起中看看这里了解下原因)应用最广了。下面将就RAIDRAIDRAIDRAIDRAID这几种级别的RAID展开说一下磁盘阵列对于磁盘性能的影响当然在阅读下面的内容之前你必须对各个级别的RAID的结构和工作原理要熟悉才行这样才不至于满头雾水推荐查看wikipedia上面的如下条目:RAIDStandardRAIDlevelsNestedRAIDlevels。RAIDRAID将数据条带化(striping)将连续的数据分散在多个磁盘上进行存取系统发出的IO命令(不管读IO和写IO都一样)就可以在磁盘上被并行的执行每个磁盘单独执行自己的那一部分请求这样的并行的IO操作能大大的增强整个存储系统的性能。假设一个RAID阵列有n(n>=)个磁盘组成每个磁盘的随机读写的IO能力都达到的话那么整个磁盘阵列的IO能力将是*n。同时如果在阵列总线的传输能力允许的话RAID的吞吐率也将是单个磁盘的n倍。RAIDRAID在容量上相当于是将两个磁盘合并成一个磁盘来使用了互为镜像的两个磁盘里面保存的数据是完全一样的因此在并行读取的时候速度将是n个磁盘速度的总和但是写入就不一样了每次写入都必须同时写入到两个磁盘中因此写入速度只有n。RAID我们那一个有n(n>=)个磁盘的RAID阵列来看首先看看RAID阵列的读IORAID是支持并行IO的而磁盘上的数据呈条带状的分布在所有的磁盘上因此读IO的速度相当于所有磁盘速度的总和。不过这是在没有磁盘损坏的情况下当有一个磁盘故障的时候读取速度也是会下降的因为中间需要花时间来计算丢失磁盘上面的数据。读取数据的情况相对就要复杂的多了先来看下RAID奇偶校验数据写入的过程我们把写入的数据称为D当磁盘拿到一个写IO的命令的时候它首先会读取一次要入的地址的数据块中修改之前的数据D然后再读取到当前条带中的校验信息P接下来就根据DPD这三组数据计算出数据写入之后的条带的奇偶校验信息P最后发出两个写IO的命令一个写入D另一个写入奇偶校验信息P。可以看出阵列在实际操作的时候需要读、读、写、写一共个IO才能完成一次写IO操作也就是实际上的写入速度只有所有磁盘速度总和的。从这点可以看出RAID是非常不适合用在要大批量写入数据的系统上的。RAIDRAID和RAID很类似差别就在于RAID多了一个用于校验的磁盘。就写IO速度上来说这两个是完全一样的都是所有磁盘IO速度的总和。在写IO上也很是类似不同的是RAID将一个命令分成了三次读、三次写一共次IO命令才能完成也就是RAID实际写入磁盘的速度是全部磁盘速度之和的。可以看出从写IO看RAID比RAID差别是很大的。RAIDRAID读写速度都很好却没有冗余保护RAID和RAID都有同样的毛病就是写入的时候慢读取的时候快。那么RAID呢?嗯这里要说的就是RAID其实不管是RAID还是RAID其实都是组合大于块磁盘时候的RAID当先镜像后条带时候就称为RAID先条带后镜像的时候称为RAID。从性能上看RAID和RAID都是一样的都是RAID嘛但是RAID在重建故障磁盘的时候性能比RAID要快。因为RAID其实就是RAID所以它的性能与RAID也就是一样的了这里不需要再做过多的讨论。top四个性能指标的变化topIO响应时间(IOResponseTime)在任何时候IO响应时间值得都是单个IO的响应时间因此不管磁盘是否组成了磁盘阵列它的IO响应时间应该都是一样的。从前面的计算中我们可以看到如果IO响应时间在ms左右的话是很正常的但是当IO响应时间比这个值超出太多的时候你就要开始注意了很可能就意味着此时你的磁盘系统已经成为了一个瓶颈。topIOPS综合上面两个部分的讨论我们来估算一下阵列下的磁盘总体IOPS在这里我们先假设组成阵列的单个磁盘的随机读写的IOPS为读写缓存命中率都为组成阵列的磁盘个数为。因为不管是那种阵列磁盘的读取性能都是所有磁盘之和所以可以得出下面的读取IOPS:readIOPS=diskIOPS(readcachehitratio)*disknum=()*=而写入性能就完全不一样了根据上面的讨论我们可以得出下面结论:RAID:IOrequest=>needactualIOondiskRAID:IOrequest=>needactualIOondiskRAID:IOrequest=>needactualIOondiskRAID:IOrequest=>needactualIOondisk由此我们也可以计算出写入IOPS估算公式:RAIDwriteIOPS=diskIOPS(writecachehitratio)*disknumactureIOnum=()*=RAIDwriteIOPS=diskIOPS(writecachehitratio)*disknumactureIOnum=()*=RAIDwriteIOPS=diskIOPS(writecachehitratio)*disknumactureIOnum=()*=RAIDwriteIOPS=diskIOPS(writecachehitratio)*disknumactureIOnum=()*=实际上从通过上面的计算方法我们还可以估算当给定一个要求的IOPS的情况下估计下使用各个阵列级别所需要的磁盘的数量。当然我们上面的计算方法只是一个估算我们忽略很多其他的因素得出的只是一个大概的数值不过在实际的应用还是有一定的参考作用的。本篇最后附送一个计算磁盘系统IOPS的网站――wmarow’sdiskdiskarraycalculator这个网站提供的计算公式还考虑了诸如阵列条带大小以及主机方面的因素很有参考价值至于怎么选择合适的条带大小请参考【延伸阅读】部分。top传输速度(TransferRate)吞吐率(Throughput)实际上估算除了随机读写的IOPS也就知道了随机读写的吞吐率。对于顺序读写的呢还是跟前一篇所讲的一样主要受限于磁盘的限制不能再拿IOPS来衡量了。randomthroughtput=randomIOPS*IOchunksizetop延伸阅读·DiskBuffer·TheLinuxPageCacheandpdflush·RAID·StandardRAIDlevels·NestedRAIDlevels·wmarow’sdiskdiskarraycalculator·Pickingtherightstripesize IO系统性能之三:在Linux中监视IO性能dd命令iostat命令理解iostat的各项输出iostat的应用实例附:在Windows中监视IO性能延伸阅读topdd命令dd其实是工作于比较低层的一个数据拷贝和转换的*nix平台的工具但是因为dd命令支持*nix平台的一些特殊设备因此我们可以利用dd命令的这个特性来简单的测试磁盘的性能。先说一下两个相关的特殊设备dev空设备通常用作输出设备这个是*nix系统上面的黑洞所有送到这个空设备上的内容都会凭空消失。devzero空字符通常用作输入从devzero中读取时它能源源不断的提供空字符(ASCIINUL,×)出来要多少有多少。于是就有了下面的用法:·测试磁盘的写入usrbintimeddif=devzeroof=tmpfoobs=kcount=这个命令时往磁盘的文件tmpfoo中写入一个G大小的文件当然文件的内容全部是空字符了同时用usrbintime来对命令的执行进行计时命令中的bs指的是写入文件时的块大小其实就相当于Oracle中的block大小了count是写入的块数。采取这种方法来写入数据时只是测试的连续读磁盘的性能而不是随机读的性能不能采取这种方法检查一个机器的IOPS的只能检查磁盘的吞吐率。·测试磁盘的读取usrbintimeddif=tmpfooof=devbs=k上面的命令是从tmpfoo文件中读取数据然后扔掉这里bs用的是读取时块的大小。和上面写入的命令一样这样测试的仅仅是最大的读取性能而不是随机IO的性能。·还能读写同时测试usrbintimeddif=tmpfooof=tmpfoobs=k在上面的命令中都用到了time命令对操作进行计时这样才能正确的进行判断。要记住的一点是dd命令只能够提供一个大概的测试通过这个简单的命令可以对磁盘系统的最大性能有一个大概的了解要了解更详细的信息还要通过其他方法来查看。topiostat命令top理解iostat的各项输出在Linux中我们执行一个iostatx命令我们能看到如下的输出$iostatxLinuxasmp(linux)     avgcpu: user  nice  sysiowait  idle              Device:  rrqmswrqms  rs  ws rsecs wsecs  rkBs  wkBsavgrqszavgqusz  await svctm utilhdc                              hda                            我们先列举一下各个性能指标的简单说明。rrqms每秒进行merge的读操作数目。wrqms每秒进行merge的写操作数目。rs每秒完成的读IO设备次数。ws每秒完成的写IO设备次数。rsecs每秒读扇区数。wsecs每秒写扇区数。rkBs每秒读K字节数。wkBs每秒写K字节数。avgrqsz平均每次设备IO操作的数据大小(扇区)。avgqusz平均IO队列长度。await平均每次设备IO操作的等待时间(毫秒)。svctm平均每次设备IO操作的服务时间(毫秒)。util一秒中有百分之多少的时间用于IO操作或者说一秒中有多少时间IO队列是非空的。要理解这些性能指标我们先看下图IO的执行过程的各个参数上图的左边是iostat显示的各个性能指标每个性能指标都会显示在一条虚线之上这表明这个性能指标是从虚线之上的那个读写阶段开始计量的比如说图中的ws从LinuxIOscheduler开始穿过硬盘控制器(CCISware)这就表明ws统计的是每秒钟从LinuxIOscheduler通过硬盘控制器的写IO的数量。结合上图对读IO操作的过程做一个说明在从OSBufferCache传入到OSKernel(LinuxIOscheduler)的读IO操作的个数实际上是rrqmsrs直到读IO请求到达OSKernel层之后有每秒钟有rrqms个读IO操作被合并最终转送给磁盘控制器的每秒钟读IO的个数为rw在进入到操作系统的设备层(devsda)之后计数器开始对IO操作进行计时最终的计算结果表现是await这个值就是我们要的IO响应时间了svctm是在IO操作进入到磁盘控制器之后直到磁盘控制器返回结果所花费的时间这是一个实际IO操作所花的时间当await与svctm相差很大的时候我们就要注意磁盘的IO性能了而avgrqsz是从OSKernel往下传递请求时单个IO的大小avgqusz则是在OSKernel中IO请求队列的平均大小。现在我们可以将iostat输出结果和我们前面讨论的指标挂钩了。平均单次IO大小(IOChunkSize)<=>avgrqsz平均IO响应时间(IOResponseTime)<=>awaitIOPS(IOperSecond)<=>rsws吞吐率(Throughtput)<=>rkBswkBstopiostat的应用实例top观察IOScheduler的IO合并(IOMerge)前面说过IO在执行过程中会被合并以提高效率下面就结合dd命令和iostat命令看一下。我们先执行dd命令设置bs参数值为k完整命令如下ddif=devzeroof=testbs=kcount=同时打开另外一个终端执行iostat命令这里只查看变化那个磁盘的更改每秒刷新一次数据完整命令如下iostatxhdc然后我们可以得到下面的结果Device:  rrqmswrqms  rs  ws rsecs wsecs  rkBs  wkBsavgrqszavgqusz  await svctm utilhdc                  avgcpu: user  nice  sysiowait  idle              Device:  rrqmswrqms  rs  ws rsecs wsecs  rkBs  wkBsavgrqszavgqusz  await svctm utilhdc                   avgcpu: user  nice  sysiowait  idle              Device:  rrqmswrqms  rs  ws rsecs wsecs  rkBs  wkBsavgrqszavgqusz  await svctm utilhdc                   avgcpu: user  nice  sysiowait  idle              看结果中第一组数据中的avgrqsz为个扇区磁盘的每个扇区为字节因此平均IO大小为*=k字节远远大于我们dd命令时给定的参数k字节也就是说IO在中间被合并了。看巨大的wrqms也能得出同样的结论。top附:在Windows中监视IO性能本来准备写一篇windows中监视IO性能的后来发现好像可写的内容不多windows在细节这方面做的不是那么的好不过那些基本信息还是有的。在Windows中监视性能基本都用性能监视器了与IO性能相关的有两个大类一个是”LogicalDisk”另外一个是”PhysicalDisk””LogicalDisk”更多的是用来监视文件相关的IO性能而”PhysicalDisk”则是用来监视LUN或者是磁盘卷下面就列举下与前面所列举的IO性能相关的计数器具体的自己研究了:单次IO大小·AvgDiskBytesRead·AvgDiskBytesWriteIO响应时间·AvgDisksecRead·AvgDisksecWriteIOPS·DiskReadssec·DiskWritessec·DiskTransferssecIO吞吐率·DiskBytessec·DiskReadBytessec·DiskWriteBytessectop延伸阅读·time命令·dd(Unix)·LearnTheddCommand·iostat详解·linux下的sar工具命令小结

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/23

IO系统性能

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利