磁盘IOPS(每秒读写次数)的计算方法
磁盘IOPS(每秒读写次数)的计算⽅法
⼀、磁盘 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 性能。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。