关于磁盘相关知识

1、磁盘 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 是密集的。ios

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


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

2、性能评价指标

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 读写。dom

磁盘的吞吐量,也就是每秒磁盘 I/O 的流量,即磁盘写入加上读出的数据的大小。ide

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。

如今咱们就能够得出这样的计算单次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
  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




3、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。


4、磁盘 I/O 性能的监控

监控磁盘的 I/O 性能,咱们可使用 AIX 的系统命令,例如:sar -d, iostat, topas, nmon 等。下面,我将以 nmon 和 topas 为例,讲述在系统中如何观察磁盘 I/O 的性能。

topas

登陆 AIX 操做系统,输入 topas,而后按 D,会出现以下界面:


在上图中,TPS 即为磁盘的 IOPS,KBPS 即为磁盘每秒的吞吐量。因为服务器处于空闲的状态,咱们能够看到 IOPS,KBPS 的数据都很是低。

咱们使用 dd if 命令向磁盘 hdisk2 发读 I/O,block 大小为 1MB:


利用 topas 进行监控:


此时,hdisk2 的吞吐量为 163.9M,IOPS 为 655。

咱们再启动一个 dd if,使 hdisk 的 busy 数值达到 100%:



从上图能够看出,在磁盘 busy 达到 100% 的时候,其吞吐量为 304.1M,IOPS 为 1200。

hdisk2 是本地集成的 SAS 盘,咱们能够查出本地集成 SAS 通道的带宽为 3Gb:


对于 3Gb 的 SAS 通道,304.1M 的磁盘吞吐量已经接近其 I/O 带宽的峰值了。

须要指出的是,使用 dd if 测量磁盘的带宽是可行的,可是由此来肯定业务 I/O 的 IOPS 和吞吐量是不科学的。由于,dd if 所发起的读写仅为顺序 I/O 读写,在 OLTP 的业务中,这种读写是不常见的,而是随机小 I/O 比较多,所以,测量业务的磁盘 I/O 性能,须要在运行业务的时候进行监控。

nmon

在系统中输入 nmon,按 d,能够获得以下界面 :

Figure xxx. Requires a heading

能够获得此时磁盘 hdisk2 吞吐量为 318M。

使用 nmon 收集一个时间段的数据,而后使用 nmon analyzer 进行分析,能够得出更为直接的图表:


将收集好的 nmon 文件使用 nmon analyzer 进行分析,得出以下报表:

图 2.nmon 图表显示磁盘性能


5、磁盘 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 性能。

相关文章
相关标签/搜索