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(StorageAreaNetwork,存储区域网络)和NAS存储(NetworkAttachedStorage,网络附加存储)一般都具备2个评价指标:IOPS和带宽(throughput),两个指标互相独立又相互关联。体现存储系统性能的最主要指标是IOPS。下面,将介绍一下这两个参数的含义。
IOPS(Input/OutputPerSecond)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,I/O请求通常为读或写数据操作请求。随机读写频繁的应用,如OLTP(OnlineTransactionProcessing),IOPS是关键衡量指标。另一个重要指标是数据吞吐量(Throughput),指单位时间内可以成功传输的数据数量。对于大量顺序读写的应用,如VOD(VideoOnDemand),则更关注吞吐量指标。
简而言之:
更多linux内核视频教程文本资料免费获取后台私信【内核】。
磁盘的IOPS,也就是在一秒内,磁盘进行多少次I/O读写。
磁盘的吞吐量,也就是每秒磁盘I/O的流量,即磁盘写入加上读出的数据的大小。
IOPS与吞吐量的关系每秒I/O吞吐量=IOPS*平均I/OSIZE。从公式可以看出:I/OSIZE越大,IOPS越高,那么每秒I/O吞吐量就越高。因此,我们会认为IOPS吞吐量的数值越高越好。实际上,对于一个磁盘来讲,这两个参数均有其最大值,而且这两个参数也存在着一定的关系。
IOPS可细分为如下几个指标:
ToatalIOPS,混合读写和顺序随机I/O负载情况下的磁盘IOPS,这个与实际I/O情况最为相符,大多数应用关注此指标。RandomReadIOPS,100%随机读负载情况下的IOPS。RandomWriteIOPS,100%随机写负载情况下的IOPS。SequentialReadIOPS,100%顺序读负载情况下的IOPS。SequentialWriteIOPS,100%顺序写负载情况下的IOPS。下图为一个典型的NFS测试结果:
IOPS的测试benchmark工具主要有Iometer,IoZone,FIO等,可以综合用于测试磁盘在不同情形下的IOPS。对于应用系统,需要首先确定数据的负载特征,然后选择合理的IOPS指标进行测量和对比分析,据此选择合适的存储介质和软件系统。
IOPS计算公式对于磁盘来说一个完整的IO操作是这样进行的:当控制器对磁盘发出一个IO操作命令的时候,磁盘的驱动臂(ActuatorArm)带读写磁头(Head)离开着陆区(LandingZone,位于内圈没有数据的区域),移动到要操作的初始数据块所在的磁道(Track)的正上方,这个过程被称为寻址(Seeking),对应消耗的时间被称为寻址时间(SeekTime);但是找到对应磁道还不能马上读取数据,这时候磁头要等到磁盘盘片(Platter)旋转到初始数据块所在的扇区(Sector)落在读写磁头正上方的之后才能开始读取数据,在这个等待盘片旋转到可操作扇区的过程中消耗的时间称为旋转延时(RotationalDelay);接下来就随着盘片的旋转,磁头不断的读/写相应的数据块,直到完成这次IO所需要操作的全部数据,这个过程称为数据传送(DataTransfer),对应的时间称为传送时间(TransferTime)。完成这三个步骤之后一次IO操作也就完成了。
在我们看硬盘厂商的宣传单的时候我们经常能看到3个参数,分别是平均寻址时间、盘片旋转速度以及最大传送速度,这三个参数就可以提供给我们计算上述三个步骤的时间。
第一个寻址时间,考虑到被读写的数据可能在磁盘的任意一个磁道,极有可能在磁盘的最内圈(寻址时间最短),也可能在磁盘的最外圈(寻址时间最长),所以在计算中我们只考虑平均寻址时间,也就是磁盘参数中标明的那个平均寻址时间,这里就采用当前最多的10krmp硬盘的5ms。
第二个旋转延时,和寻址一样,当磁头定位到磁道之后有可能正好在要读写扇区之上,这时候是不需要额外额延时就可以立刻读写到数据,但是最坏的情况确实要磁盘旋转整整一圈之后磁头才能读取到数据,所以这里我们也考虑的是平均旋转延时,对于10krpm的磁盘就是(60s/10k)*(1/2)=2ms。
第三个传送时间,磁盘参数提供我们的最大的传输速度,当然要达到这种速度是很有难度的,但是这个速度却是磁盘纯读写磁盘的速度,因此只要给定了单次IO的大小,我们就知道磁盘需要花费多少时间在数据传送上,这个时间就是IOChunkSize/MaxTransferRate。
现在我们就可以得出这样的计算单次IO时间的公式。
IOTime=SeekTime+60sec/RotationalSpeed/2+IOChunkSize/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的读写是最有说服力的。
另外,对于同一个磁盘(或者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操作是并发的,例如:raid0+1(1+0),raid5等。反之则为顺序I/O。
四、磁盘I/O性能的监控监控磁盘的I/O性能,我们可以使用AIX的系统命令,例如:sar-d,iostat,topas,nmon等。下面,我将以nmon和topas为例,讲述在系统中如何观察磁盘I/O的性能。
topas登录AIX操作系统,输入topas,然后按D,会出现如下界面:
在上图中,TPS即为磁盘的IOPS,KBPS即为磁盘每秒的吞吐量。由于服务器处于空闲的状态,我们可以看到IOPS,KBPS的数据都非常低。
我们使用ddif命令向磁盘hdisk2发读I/O,block大小为1MB:
利用topas进行监控:
此时,hdisk2的吞吐量为163.9M,IOPS为655。
我们再启动一个ddif,使hdisk的busy数值达到100%:
从上图可以看出,在磁盘busy达到100%的时候,其吞吐量为304.1M,IOPS为1200。
hdisk2是本地集成的SAS盘,我们可以查出本地集成SAS通道的带宽为3Gb:
对于3Gb的SAS通道,304.1M的磁盘吞吐量已经接近其I/O带宽的峰值了。
需要指出的是,使用ddif测量磁盘的带宽是可行的,但是由此来确定业务I/O的IOPS和吞吐量是不科学的。因为,ddif所发起的读写仅为顺序I/O读写,在OLTP的业务中,这种读写是不常见的,而是随机小I/O比较多,因此,测量业务的磁盘I/O性能,需要在运行业务的时候进行监控。
nmon可以得到此时磁盘hdisk2吞吐量为318M。
使用nmon收集一个时间段的数据,然后使用nmon***yzer进行分析,可以得出更为直接的图表:
将收集好的nmon文件使用nmon***yzer进行分析,得出如下报表:
图2.nmon图表显示磁盘性能五、磁盘I/O性能调优确认磁盘I/O存在性能问题对于随机负载,当遇到余下情况时,我们那通常认为存在I/O性能问题:
1.平均读时间大于15ms
2.在具有写cache的条件下,平均写时间大于2.5ms
对于顺序负载,当遇到余下情况时,我们那通常认为存在I/O性能问题:
1.在一个磁盘上有两个连续的I/O流
2.吞吐量不足(即远远小于磁盘I/O带宽)
对于一块磁盘来讲,随着IOPS数量的增加,I/Oservice也会增加,并且会有一个饱和点,即IOPS达到某个点以后,IOPS再增加将会引起I/Oservicetime的显著增加。
图3.磁盘IOPS与IOservicetime关系图从经验上讲,我们在测试工作中,我们主要关注IOPS和吞吐量以及磁盘的busy%这三个数值。如果IOPS和吞吐量均很低,磁盘的busy%也很低,我们会认为磁盘压力过小,造成吞吐量和IOPS过低;只有在IOPS和吞吐量均很低,磁盘的busy%很高(接近100%)的时候,我们才会从磁盘I/O方面分析I/O性能
介绍通常在讨论不同RAID保护类型的性能的时候,结论都会是RAID-1提供比较好的读写性能,RAID-5读性能不错,但是写入性能就不如RAID-1,RAID-6保护级别更高,但写性能相对更加差,RAID10是提供最好的性能和数据保护,不过成本最高等等。其实决定这些性能考虑的因素很简单,它就是RAIDWritePenalty(写惩罚)。本文从原理上解释了不同RAID保护级别的写惩罚,以及通过写惩罚计算可用IOPS的***。
更多信息RAID-5WritePenalty的例子:
存储方案规划的过程中,最基本的考虑因素有两个,性能和容量。性能上的计算看可以分为IOPS和带宽需求。计算IOPS,抛开存储阵列的缓存和前端口不谈。计算后端物理磁盘的IOPS不能简单的把物理磁盘的最大IOPS相加而获得。原因是,对于不同的RAID级别,为了保证当有物理磁盘损坏的情况下可以恢复数据,数据写入的过程中都需要有一些特别的计算。比如对于RAID-5,条带上的任意磁盘上的数据改变,都会重新计算校验位。如下图所示,一个7+1的RAID-5的条带中,七个磁盘存储数据,最后一个磁盘存储校验位。
对于一个数据的写入,我们假设在第五个磁盘上写入的数据为1111,如下图所示。那么整个RAID-5需要完成写入的过程分为以下几步:
读取原数据0110,然后与新的数据1111做XOR操作:0110XOR1111=1001读取原有的校验位0010用第一步算出的数值与原校验位再做一次XOR操作:0010XOR1001=1011然后将1111新数据写入到数据磁盘,将第三步计算出来的新的校验位写入校验盘。由上述几个步骤可见,对于任何一次写入,在存储端,需要分别进行两次读+两次写,所以说RAID-5的WritePenalty的值是4。
不同RAID级别的WritePenalty:
下表列出了各种RAID级别的WritePenalty值:
RAID
WritePenalty
0
1
1
2
5
4
6
6
10
2
RAID-0:直接的条带,数据每次写入对应物理磁盘上的一次写入
RAID-1和10:RAID-1和RAID-10的写惩罚很简单理解,因为数据的镜像存在的,所以一次写入会有两次。
RAID-5:RAID-5由于要计算校验位的机制存在,需要读数据、读校验位、写数据、写校验位四个步骤,所以RAID-5的写惩罚值是4。
RAID-6:RAID-6由于有两个校验位的存在,与RAID-5相比,需要读取两次校验位和写入两次校验位,所以RAID-6的写惩罚值是6。
计算IOPS:
根据上文的描述,在实际存储方案设计的过程中,计算实际可用IOPS的过程中必须纳入RAID的写惩罚计算。计算的公式如下:
物理磁盘总的IOPS=物理磁盘的IOPS×磁盘数目
可用的IOPS=(物理磁盘总的IOPS×写百分比÷RAID写惩罚)+(物理磁盘总的IOPS×读百分比)
假设组成RAID-5的物理磁盘总共可以提供500IOPS,使用该存储的应用程序读写比例是50%/50%,那么对于前端主机而言,实际可用的IOPS是:
(500×50%÷4)+(500*50%)=312.5IOPS
具体不同应用程序的读写比例,可以参考:关于不同应用程序存储IO类型的描述
===================================
机械硬盘的连续读写性很好,但随机读写性能很差。这是因为磁头移动至正确的磁道上需要时间,随机读写时,磁头不停的移动,时间都花在了磁头寻道上,所以性能不高。如下图:
在存储小文件(图片)、OLTP数据库应用时,随机读写性能(IOPS)是最重要指标。
学习它,有助于我们分析存储系统的性能互瓶颈。下面我们来认识随机读写性能指标--IOPS(每秒的输入输出次数)。
磁盘性能指标--IOPS----------------------------------------------------------IOPS(Input/OutputPerSecond)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。随机读写频繁的应用,如小文件存储(图片)、OLTP数据库、邮件服务器,关注随机读写性能,IOPS是关键衡量指标。顺序读写频繁的应用,传输大量连续数据,如电视台的视频编辑,视频点播VOD(VideoOnDemand),关注连续读写性能。数据吞吐量是关键衡量指标。IOPS和数据吞吐量适用于不同的场合:读取10000个1KB文件,用时10秒Throught(吞吐量)=1MB/s,IOPS=1000追求IOPS读取1个10MB文件,用时0.2秒Throught(吞吐量)=50MB/s,IOPS=5追求吞吐量磁盘服务时间--------------------------------------传统磁盘本质上一种机械装置,如FC,SAS,SATA磁盘,转速通常为5400/7200/10K/15Krpm不等。影响磁盘的关键因素是磁盘服务时间,即磁盘完成一个I/O请求所花费的时间,它由寻道时间、旋转延迟和数据传输时间三部分构成。寻道时间Tseek是指将读写磁头移动至正确的磁道上所需要的时间。寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms。旋转延迟Trotation是指盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间。旋转延迟取决于磁盘转速,通常使用磁盘旋转一周所需时间的1/2表示。比如,7200rpm的磁盘平均旋转延迟大约为60*1000/7200/2=4.17ms,而转速为15000rpm的磁盘其平均旋转延迟为2ms。数据传输时间Ttransfer是指完成传输所请求的数据所需要的时间,它取决于数据传输率,其值等于数据大小除以数据传输率。目前IDE/ATA能达到133MB/s,SATAII可达到300MB/s的接口数据传输率,数据传输时间通常远小于前两部分消耗时间。简单计算时可忽略。
常见磁盘平均物理寻道时间为:7200转/分的STAT硬盘平均物理寻道时间是9ms10000转/分的STAT硬盘平均物理寻道时间是6ms15000转/分的SAS硬盘平均物理寻道时间是4ms
常见硬盘的旋转延迟时间为:
7200rpm的磁盘平均旋转延迟大约为60*1000/7200/2=4.17ms
10000rpm的磁盘平均旋转延迟大约为60*1000/10000/2=3ms,
15000rpm的磁盘其平均旋转延迟约为60*1000/15000/2=2ms。
最大IOPS的理论计算***--------------------------------------IOPS=1000ms/(寻道时间+旋转延迟)。可以忽略数据传输时间。7200rpm的磁盘IOPS=1000/(9+4.17)=76IOPS10000rpm的磁盘IOPS=1000/(6+3)=111IOPS15000rpm的磁盘IOPS=1000/(4+2)=166IOPS影响测试的因素-----------------------------------------实际测量中,IOPS数值会受到很多因素的影响,包括I/O负载特征(读写比例,顺序和随机,工作线程数,队列深度,数据记录大小)、系统配置、操作系统、磁盘驱动等等。因此对比测量磁盘IOPS时,必须在同样的测试基准下进行,即便如此也会产生一定的随机不确定性。队列深度说明NCQ、SCSITCQ、PATATCQ和SATATCQ技术解析----------------------------------------是一种命令排序技术,一把喂给设备更多的IO请求,让电梯算法和设备有机会来安排合并以及内部并行处理,提高总体效率。SCSITCQ的队列深度支持256级ATATCQ的队列深度支持32级(需要8M以上的缓存)NCQ最高可以支持命令深度级数为32级,NCQ可以最多对32个命令指令进行排序。大多数的软件都是属于同步I/O软件,也就是说程序的一次I/O要等到上次I/O操作的完成后才进行,这样在硬盘中同时可能仅只有一个命令,也是无法发挥这个技术的优势,这时队列深度为1。随着Intel的超线程技术的普及和应用环境的多任务化,以及异步I/O软件的大量涌现。这项技术可以被应用到了,实际队列深度的增加代表着性能的提高。在测试时,队列深度为1是主要指标,大多数时候都参考1就可以。实际运行时队列深度也一般不会超过4.IOPS可细分为如下几个指标:-----------------------------------------数据量为n字节,队列深度为k时,随机读取的IOPS数据量为n字节,队列深度为k时,随机写入的IOPSIOPS的测试benchmark工具------------------------------------------IOPS的测试benchmark工具主要有Iometer,IoZone,FIO等,可以综合用于测试磁盘在不同情形下的IOPS。对于应用系统,需要首先确定数据的负载特征,然后选择合理的IOPS指标进行测量和对比分析,据此选择合适的存储介质和软件系统。