磁盘 IOPS(每秒读写次数) 的计算方法_2、计算读一随机位置的扇区的磁盘访问时间。假设平均寻址时间3ms,转速5400rpm,-程序员宅基地

一、磁盘 I/O 的概念 

        I/O 的概念,从字义来理解就是输入输出。操作系统从上层到底层,各个层次之间均存在 I/O。比如,CPU 有 I/O,内存有 I/O, VMM 有 I/O, 底层磁盘上也有 I/O,这是广义上的 I/O。通常来讲,一个上层的 I/O 可能会产生针对磁盘的多个 I/O,也就是说,上层的 I/O 是稀疏的,下层的 I/O 是密集的。 

        磁盘的 I/O,顾名思义就是磁盘的输入输出。输入指的是对磁盘写入数据,输出指的是从磁盘读出数据。我们常见的磁盘类型有 ATA、SATA、FC、SCSI、SAS,如图1所示。这几种磁盘中,服务器常用的是 
SAS 和 FC 磁盘,一些高端存储也使用 SSD 盘。每一种磁盘的性能是不一样的。

图 1. 物理磁盘的架构以及常见磁盘类型 


二、性能评价指标 

        SAN(Storage Area Network, 存储区域网络)和NAS存储(Network Attached Storage,网络附加存储)一般都具备2个评价指标:IOPS和带宽(throughput),两个指标互相独立又相互关联。体现存储系统性能的最主要指标是IOPS。下面,将介绍一下这两个参数的含义。 

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

        简而言之: 
                磁盘的 IOPS,也就是在一秒内,磁盘进行多少次 I/O 读写。 
                磁盘的吞吐量,也就是每秒磁盘 I/O 的流量,即磁盘写入加上读出的数据的大小。 

        IOPS 与吞吐量的关系 
                每秒 I/O 吞吐量= IOPS* 平均 I/O SIZE。从公式可以看出: I/O SIZE 越大,IOPS 越高,那么每秒 I/O 的吞吐量就越高。因此,我们会认为 IOPS 和吞吐量的数值越高越好。实际上,对于一个磁盘来讲,这两个参数均有其最大值,而且这两个参数也存在着一定的关系。 

        IOPS可细分为如下几个指标: 
                1. Toatal IOPS,混合读写和顺序随机I/O负载情况下的磁盘IOPS,这个与实际I/O情况最为相符,大多数应用关注此指标。 
                2. Random Read IOPS,100%随机读负载情况下的IOPS。 
                3. Random Write IOPS,100%随机写负载情况下的IOPS。 
                4. Sequential Read IOPS,100%顺序读负载情况下的IOPS。 
                5. Sequential Write IOPS,100%顺序写负载情况下的IOPS。 

        下图为一个典型的NFS测试结果:

        IOPS的测试benchmark工具主要有Iometer, IoZone, FIO等,可以综合用于测试磁盘在不同情形下的IOPS。对于应用系统,需要首先确定数据的负载特征,然后选择合理的IOPS指标进行测量和对比分析,据此选择合适的存储介质和软件系统。

        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。 

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

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


          传统磁盘本质上一种机械装置,如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负载特征(读写比例,顺序和随机,工作线程数,队列深度,数据记录大小)、系统配置、操作系统、磁盘驱动等等。因此对比测量磁盘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 

        做个说明:寻址时间会直接给出,RPM为转每分,所以转化为毫秒,一转的时间为60*1000/15000=4ms。取4ms的一半为旋转的旋转延时。另外4K*1000/40M=0.1;计算过程是40M/s,一秒传输40M,即1000ms传输40*1024KB≈40*1000KB。传输4K则要花费4*1000/40000=0.1ms。一次IO的时间为7.1ms,则1s能够执行多少个IO,即有多少个7.1ms呢,1000/7.1=140IOPS 
  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的读写是最有说服力的。 

        另外,对于同一个磁盘(或者 LUN),随着每次 I/O 读写数据的大小不通,IOPS 的数值也不是固定不变的。例如,每次 I/O 写入或者读出的都是连续的大数据块,此时 IOPS 相对会低一些;在不频繁换道的情况下,每次写入或者读出的数据块小,相对来讲 IOPS 就会高一些。也就是说,IOPS 也取决与I/O块的大小,采用不同I/O块的大小测出的IOPS值是不同的。 对一个具体的IOPS, 可以了解它当时测试的I/O块的尺寸。并且IOPS都具有极限值,表1列出了各种磁盘的 IOPS 极限值。 
表 1. 常见磁盘类型及其 IOPS

 

三、I/O 读写的类型 

        大体上讲,I/O 的类型可以分为:读 / 写 I/O、大 / 小块 I/O、连续 / 随机 I/O, 顺序 / 并发 I/O。在这几种类型中,我们主要讨论一下:大 / 小块 I/O、连续 / 随机 I/O, 顺序 / 并发 I/O。 

        大 / 小块 I/O 
        这个数值指的是控制器指令中给出的连续读出扇区数目的多少。如果数目较多,如 64,128 等,我们可以认为是大块 I/O;反之,如果很小,比如 4,8,我们就会认为是小块 I/O,实际上,在大块和小块 I/O 之间,没有明确的界限。 

        连续 / 随机 I/O 
        连续 I/O 指的是本次 I/O 给出的初始扇区地址和上一次 I/O 的结束扇区地址是完全连续或者相隔不多的。反之,如果相差很大,则算作一次随机 I/O 
        连续 I/O 比随机 I/O 效率高的原因是:在做连续 I/O 的时候,磁头几乎不用换道,或者换道的时间很短;而对于随机 I/O,如果这个 I/O 很多的话,会导致磁头不停地换道,造成效率的极大降低。 

        顺序 / 并发 I/O 
        从概念上讲,并发 I/O 就是指向一块磁盘发出一条 I/O 指令后,不必等待它回应,接着向另外一块磁盘发 I/O 指令。对于具有条带性的 RAID(LUN),对其进行的 I/O 操作是并发的,例如:raid 0+1(1+0),raid5 等。反之则为顺序 I/O。

 

四、磁盘 I/O 性能调优 

        确认磁盘 I/O 存在性能问题 
        对于随机负载,当遇到余下情况时,我们那通常认为存在 I/O 性能问题: 
                1. 平均读时间大于 15ms 
                2. 在具有写 cache 的条件下,平均写时间大于 2.5ms 
        对于顺序负载,当遇到余下情况时,我们那通常认为存在 I/O 性能问题: 
                1. 在一个磁盘上有两个连续的 I/O 流 
                2. 吞吐量不足(即远远小于磁盘 I/O 带宽) 
        对于一块磁盘来讲,随着 IOPS 数量的增加,I/O service 也会增加,并且会有一个饱和点,即 IOPS 达到某个点以后,IOPS 再增加将会引起 I/O service time 的显著增加。 

图 3. 磁盘 IOPS 与 IO service time 关系图

        从经验上讲,我们在测试工作中,我们主要关注 IOPS 和吞吐量以及磁盘的 busy% 这三个数值。如果 IOPS 和吞吐量均很低,磁盘的 busy% 也很低,我们会认为磁盘压力过小,造成吞吐量和 IOPS 过低;只有在 IOPS 和吞吐量均很低,磁盘的 busy% 很高(接近 100%)的时候,我们才会从磁盘 I/O 方面分析 I/O 性能。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jiangbb8686/article/details/106519629

智能推荐

LiteOS内核源码分析:消息队列Queue_liteos 任务数据共享 示例-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏2次。摘要:本文通过分析LiteOS队列模块的源码,掌握队列使用上的差异。_liteos 任务数据共享 示例

linux 程序溢出,linux-溢出程序-程序员宅基地

文章浏览阅读197次。后门程序: 100描述米特尼克拿到了BAT数据中心的口令后,为了确保口令被更改后仍能登陆数据中心,他从一位小伙伴那拿到了一个后门程序植入进了服务器。这个后门程序没有任何说明,但是米特尼克迅速找到了使用方法。后门程序:http://bctf.cn/files/downloads/backdoor_844d899c6320ac74a471e3c0db5e902e 安装地址:218.2.197.250:..._fff308

开源语音识别软件有哪些?-程序员宅基地

文章浏览阅读403次。开源语音识别软件有很多种, 下面列举几种常见的:Kaldi: 是一种用于语音识别的开源工具包, 支持多种语言, 并且在处理大规模语料库方面有较好的表现.HTK: 是一个用于语音识别、语音合成和语音处理的开源工具包, 支持多种语言.Julius: 是一个用于语音识别的开源软件, 支持日语和英语.Sphinx: 是一个用于语音识别的开源工具包, 支持多种语言.CMUCLMTK: 是..._多说话人语音识别开源工具

Mac os下apache正常启动localhost无法访问服务器_mac apache启动但是访问不到-程序员宅基地

文章浏览阅读8.1k次,点赞3次,收藏2次。由于删除了/private/var/log下面的日志,导致重启电脑后apache无法正常工作。重启电脑后apache无法正常运行,访问localhost或127.0.0.1都会无法找到服务器。探索:问题出现后,由于$ sudo apachectl start不会报任何错,但是访问localhost或127.0.0.1始终失败。可能情况1: 没有监听_mac apache启动但是访问不到

java list(属性方法)_java list exists-程序员宅基地

文章浏览阅读1.2w次,点赞5次,收藏17次。List的方法和属性 方法或属性 作用Capacity 用于获取或设置List可容纳元素的数量。当数量超过容量时,这个值会自动增长。您可以设置这个值以减少容量,也可以调用trin()方法来减少容量以适合实际的元素数目。Count 属性,用于获取数组中当前元素数量Item( ) 通过指定索引获取或设置元素。对于List类来说,它是一个索引器。Add( ) 在List中添加一个对象的公有方法AddRan_java list exists

Golang单元测试和压力测试-程序员宅基地

文章浏览阅读1k次,点赞22次,收藏23次。go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程类似,并不需要学习新的语法,规则和工具。go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会被go build编译到最终可执行文件中。在*_test.go文件中有三种类型的函数,单元测试函数,基准测试函数和示例函数。

随便推点

java-jsp基于Vue智能化许愿墙w3c88[独有源码]如何找到适合自己的毕业设计的指南_vue留言墙毕设-程序员宅基地

文章浏览阅读114次。选题背景:在现代社会,人们对于表达心愿和寄托希望的需求越来越强烈。传统的许愿墙通常是一块空白的墙面,人们可以在上面写下自己的心愿。然而,随着科技的发展和智能化的应用,基于Vue的智能化许愿墙的设计与实现成为了一个新的选题。通过利用Vue框架的优势,结合智能化技术,可以为用户提供更加便捷、个性化的许愿体验,满足人们对于表达心愿的需求。选题意义:基于Vue的智能化许愿墙的设计与实现具有重要的意义。首先,它可以提供一个更加便捷、个性化的许愿体验。传统的许愿墙通常只提供一个空白的墙面,人们需要亲自前往并手动_vue留言墙毕设

大数据必学Java基础(五):第一段程序_大数据学习java编程基础实例-程序员宅基地

文章浏览阅读4.2k次,点赞16次,收藏15次。文章目录第一段程序一、用notepad编写代码二、进行编译三、进行解释/翻译/执行记得保存 ctrl+s 发现出错了,分析出错原因:解决办法:将javac.exe所在的路径 配置到 环境变量path中去,这样我就可以在任意的路径下去执行这个命令:配置好环境变量以后发现代码可以成功编译: 验证:上面执行过程成功的原因:......_大数据学习java编程基础实例

[Python] pyqt6 - 如何实现关闭窗口前弹出确认框_pyqt怎么在退出时显示确定要退出吗-程序员宅基地

文章浏览阅读1.4k次,点赞34次,收藏21次。本文主要介绍了pyqt6中,如何利用窗口的closeEvent函数和QMessageBox的question函数来实现关闭窗口时弹出确认框的功能。_pyqt怎么在退出时显示确定要退出吗

Golang 元素值在经过通道传递时会被复制,这个复制是浅复制_golang channel copy-程序员宅基地

文章浏览阅读1.2k次。1. channel 元素值为切片package mainimport ( "fmt")func main() { ch := make(chan []int, 3) s := []int{1, 3, 4} ch <- s fmt.Printf("s length is %d, cap is %d\n", len(ch), cap(ch)) fmt.Printf("s address is %p\n", &s) r := <-ch r[0] = 2 _golang channel copy

数据结构学习笔记(全)_数据结构笔记整理-程序员宅基地

文章浏览阅读619次,点赞2次,收藏27次。若有两个孩子,其右孩子为q,则将左孩子的最右边结点p删除,并将p放在被删除的根节点的位置,如果被删除的p有左子树,则直接继承在p的位置。从图中的某个顶点V0出发,并在访问此顶点之后 依次访问V0的所有未被访问过的邻接点,之后按这 些顶点被访问的先后次序依次访问它们的邻接点,直 至图中所有和V0有路径相通的顶点都被访问到。先选择一个顶点(无要求),选择权值最短的边,将其与一个新的顶点连接,并将其看为一个新的整体,重复进行”选择权值最短的边,将其与一个新的顶点连接“的操作直至所有顶点相连。_数据结构笔记整理

[开发|C++] 在 Ubuntu20.04系统上编译gcc-4.9.4_ubuntu20.04 gcc9.4.0编译gcc4.9.2-程序员宅基地

文章浏览阅读566次,点赞11次,收藏9次。5. 报错信息如下。7. 报错信息如下。_ubuntu20.04 gcc9.4.0编译gcc4.9.2