聊一聊磁盘性能评价指标—IOPS和吞吐量

磁盘 io 的概念: io 的概念,从字义来理解就是输入输出。操作系统从上层到底层,各个层次之间均存在 io。比如,cpu 有 io,内存有 io, vmm 有 io, 底层磁盘上也有 io,这是广义上的 io。通常来讲,一个上层的 io 可能会产生针对磁盘的多个 io,也就是说,上层的 io 是稀疏的,下层的 io 是密集的。nvme转接卡
磁盘的 io,顾名思义就是磁盘的输入输出。输入指的是对磁盘写入数据,输出指的是从磁盘读出数据。我们常见的磁盘类型有 ata、sata、fc、scsi、sas,如图1所示。这几种磁盘中,服务器常用的是 sas 和 fc 磁盘,一些高端存储也使用 ssd 盘。每一种磁盘的性能是不一样的。
图 1 物理磁盘的架构以及常见磁盘类型
性能评价指标:
san(storage area network, 存储区域网络)和nas存储(network attached storage,网络附加存储)一般都具备2个评价指标:iops和带宽(throughput),两个指标互相独立又相互关联。体现存储系统性能的最主要指标是iops。下面,将介绍一下这两个参数的含义。
iops (inputoutput per second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。iops是指单位时间内系统能处理的io请求数量,一般以每秒处理的io请求数量为单位,io请求通常为读或写数据操作请求。
随机读写频繁的应用,如小文件存储(图片)、oltp数据库、邮件服务器,关注随机读写性能,iops是关键衡量指标。
顺序读写频繁的应用,传输大量连续数据,如电视台的视频编辑,视频点播vod(video on demand),关注连续读写性能。数据吞吐量是关键衡量指标。iops和数据吞吐量适用于不同的场合:
读取10000个1kb文件,用时10秒 throught(吞吐量)=1mbs ,iops=1000 追求iops
读取1个10mb文件,用时02秒 throught(吞吐量)=50mbs, iops=5 追求吞吐量简而言之: 磁盘的 iops,也就是在一秒内,磁盘进行多少次 io 读写。
磁盘的吞吐量,也就是每秒磁盘 io 的流量,即磁盘写入加上读出的数据的大小。
iops 与吞吐量的关系
每秒 io 吞吐量= iops* 平均 io size。从公式可以看出: io size 越大,iops 越高,那么每秒 io 的吞吐量就越高。因此,我们会认为 iops 和吞吐量的数值越高越好。实际上,对于一个磁盘来讲,这两个参数均有其最大值,而且这两个参数也存在着一定的关系。
iops可细分为如下几个指标:
toatal iops,混合读写和顺序随机io负载情况下的磁盘iops,这个与实际io情况最为相符,大多数应用关注此指标。
random read iops,100%随机读负载情况下的iops。
random write iops,100%随机写负载情况下的iops。
sequential read iops,100%顺序读负载情况下的iops。
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的磁盘就是(60s10k)*(12) = 2ms。
第三个传送时间,磁盘参数提供我们的最大的传输速度,当然要达到这种速度是很有难度的,但是这个速度却是磁盘纯读写磁盘的速度,因此只要给定了单次 io的大小,我们就知道磁盘需要花费多少时间在数据传送上,这个时间就是io chunk sizemax transfer rate。
现在我们就可以得出这样的计算单次io时间的公式。
io time = seek time + 60 secrotational speed2 + io chunk sizetransfer rate
于是我们可以这样计算出iops。
iops = 1io time = 1(seek time + 60 secrotational speed2 + io chunk sizetransfer rate)
对于给定不同的io大小我们可以得出下面的一系列的数据
4k (171 ms = 140 iops)
5ms + (60sec15000rpm2) + 4k40mb = 5 + 2 + 01 = 71
8k (172 ms = 139 iops)
5ms + (60sec15000rpm2) + 8k40mb = 5 + 2 + 02 = 72
16k (174 ms = 135 iops)
5ms + (60sec15000rpm2) + 16k40mb = 5 + 2 + 04 = 74
32k (178 ms = 128 iops)
5ms + (60sec15000rpm2) + 32k40mb = 5 + 2 + 08 = 78
64k (186 ms = 116 iops)
5ms + (60sec15000rpm2) + 64k40mb = 5 + 2 + 16 = 86
从上面的数据可以看出,当单次io越小的时候,单次io所耗费的时间也越少,相应的iops也就越大。
上面我们的数据都是在一个比较理想的假设下得出来的,这里的理想的情况就是磁盘要花费平均大小的寻址时间和平均的旋转延时,这个假设其实是比较符合我们实际情况中的随机读写,在随机读写中,每次io操作的寻址时间和旋转延时都不能忽略不计,有了这两个时间的存在也就限制了iops的大小。现在我们考虑一种相对极端的顺序读写操作,比如说在读取一个很大的存储连续分布在磁盘的的文件,因为文件的存储的分布是连续的,磁头在完成一个读io操作之后,不需要从新的寻址,也不需要旋转延时,在这种情况下我们能到一个很大的iops值,如下。
4k (101 ms = 10000 iops)
0ms + 0ms + 4k40mb = 01
8k (102 ms = 5000 iops)
0ms + 0ms + 8k40mb = 02
16k (104 ms = 2500 iops)
0ms + 0ms + 16k40mb = 04
32k (108 ms = 1250 iops)
0ms + 0ms + 32k40mb = 08
64k (116 ms = 625 iops)
0ms + 0ms + 64k40mb = 16
相比第一组数据来说差距是非常的大的,因此当我们要用iops来衡量一个io系统的系能的时候我们一定要说清楚是在什么情况的iops,也就是要说明读写的方式以及单次io的大小,当然在实际当中,特别是在oltp的系统的,随机的小io的读写是最有说服力的。
另外,对于同一个磁盘(或者 lun),随着每次 io 读写数据的大小不通,iops 的数值也不是固定不变的。例如,每次 io 写入或者读出的都是连续的大数据块,此时 iops 相对会低一些;在不频繁换道的情况下,每次写入或者读出的数据块小,相对来讲 iops 就会高一些。也就是说,iops 也取决与io块的大小,采用不同io块的大小测出的iops值是不同的。 对一个具体的iops, 可以了解它当时测试的io块的尺寸。并且iops都具有极限值,表1列出了各种磁盘的 iops 极限值。