高手的存在,就是让服务10亿人的时候,你感觉只是为你一个人服务......

聊聊磁盘I/O

目录
  1. 1. why slow?
  2. 2. 物理结构
  3. 3. 衡量性能的指标
    1. 3.1. IOPS
    2. 3.2. 吞吐量
  4. 4. I/O压力分析
    1. 4.1. iostat
    2. 4.2. iotop

Alt text

由于SSD在价格方面昂贵,企业级应用服务存储大多还是选择HDD。

毕竟性价比高嘛,但随着计算机硬件-CPU,内存的不断发展,磁盘I/O在性能方面越来越拖后腿。


why slow?

HDD对数据的操作,95%的耗时在机械运动上。

磁盘完成一个I/O请求所花费的时间,由寻道时间、旋转延迟和数据传输时间三部分构成。

寻道时间(Tseek),是指将读写磁头移动至正确的磁道上所需要的时间。寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms;

旋转延迟(Trotation),是指盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间。旋转延迟取决于磁盘转速,通常使用磁盘旋转一周所需时间的1/2表示。比如,7200rpm的磁盘平均旋转延迟大约为60*1000/7200/2 = 4.17ms

内部接口传送时间,即从磁盘盘片到内部磁盘缓冲传送的时间,量级是440微秒。

外部接口传输时间,即从磁盘缓冲到接口传送的时间,量级是110微秒。

数据传输时间通常远小于前两部分消耗时间,简单计算时可忽略。


物理结构

熟悉寻道时间和旋转延迟,必须了解HDD的物理结构。硬盘内部主要部件为磁盘盘片、传动手臂、读写磁头和主轴马达。

实际数据都是写在盘片上,读写主要是通过传动手臂上的读写磁头来完成。

实际运行时,主轴让磁盘盘片转动,然后传动手臂可伸展让读取头在盘片上进行读写操作。

磁盘物理结构如下图所示:
Alt text

由于单一盘片容量有限,一般硬盘都有两张以上的盘片,每个盘片有两面,都可记录信息,所以一张盘片对应着两个磁头。

盘片被分为许多扇形的区域,每个区域叫一个扇区,硬盘中每个扇区的大小固定为512字节。

盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道,不同盘片相同半径的磁道所组成的圆柱称为柱面。

磁道与柱面都是表示不同半径的圆,在许多场合,磁道和柱面可以互换使用。

Alt text


衡量性能的指标

机械硬盘的连续读写性能很好,但随机读写性能很差,这主要是因为磁头移动到正确的磁道上需要时间,随机读写时,磁头需要不停的移动,时间都浪费在了磁头寻址上,所以性能不高。

衡量磁盘的重要主要指标是IOPS吞吐量

IOPS

IOPS(Input/Output Per Second)即每秒的输入输出量(或读写次数),即指每秒内系统能处理的I/O请求数量。

随机读写频繁的应用,如小文件存储等,关注随机读写性能,IOPS是关键衡量指标。

可以推算出磁盘的IOPS = 1000ms / (Tseek + Trotation + Transfer),如果忽略数据传输时间,理论上可以计算出随机读写最大的IOPS。

常见磁盘的随机读写最大IOPS为:

7200rpm的磁盘 IOPS = 76 IOPS
10000rpm的磁盘IOPS = 111 IOPS
15000rpm的磁盘IOPS = 166 IOPS

吞吐量

吞吐量(Throughput),指单位时间内可以成功传输的数据数量。

顺序读写频繁的应用,如视频点播,关注连续读写性能、数据吞吐量是关键衡量指标。

实例: 写入10000个大小为1kb的文件到硬盘上,耗费的时间要比写入一个10mb大小的文件多得多,虽然数据总量都是10mb,因为写入10000个文件时,根据文件分布情况和大小情况,可能需要做几万甚至十几万次IO才能完成.而写入一个10mb 的大文件,如果这个文件在磁盘上是连续存放的,那么只需要几十个io就可双完成. 对于写入10000个小文件的情况,因为每秒需要的IO非常高,所以此时如果用具有较高IOPS的磁盘,将会提速不少,而写入一个10mb文件的情况,就算用了有较高IOPS的硬盘来做,也不会有提升,因为只需要很少的IO就可以完成了,只有换用具有较大传输带宽的硬盘,才能体现出优势


I/O压力分析

iostat

通过iostat命令可以很透彻的分析当前系统IO的压力情况,本人习惯使用 iostat -x

Alt text

-x 示每个设备的详细的数据

rrqm/wrqm:io读写会进入queue,并被合并,这里就被合并的次数

rw/s: 设备每秒的读写次数

rwsec/s:设备每秒的读写扇区数目,基本与Blk_wrtn/s等保持相同

avgrq-sz:设备读写块大小(扇区数),上面用8k进行dd测试的话,这个数字就是16=8×1024/512

avgqu-sz:设备的queue平均大小,越大代表压力大

await:io请求在queue中被堵塞的平均时长+io被处理完成的平均时长,相当于成功一次io的时间
svctm:io被处理完成的平均时长,看await就可以

%util:io利用率

如果 %iowait 的值过高,表示磁盘存在 I/O 瓶颈。
如果 %util 接近 100%,说明产生的 I/O 请求太多,I/O 系统已经满负荷,该磁盘可能存在瓶颈。
如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;
如果 await 远大于 svctm,说明 I/O 队列太长,I/O 响应太慢,则需要进行必要优化。
如果 avgqu-sz 比较大,也表示有大量 IO 在等待。


iotop

通过iotop来监控io压力大的进程

按C键,按照cpu消耗排名

Alt text

参考:
https://www.mtyun.com/library/about-desk-io
https://github.com/ColZer/DigAndBuried/blob/master/system/disk-io.md