2.什么是I/O wait?

1.感言

  I/O是学习linux操作系统重要的一节,特别是想要对linux进行优化的时候,还有在生产环境中i/O也是判断系统稳定性的重要的性能指标。

2.磁盘

  如果要想搞懂io,我们必须要先搞懂磁盘(硬盘),硬盘大家都知道就是存储数据的介质,我们可以将数据存储到里面,也可以将数据从磁盘(硬盘)里面取出,具体的磁盘结构这里我不再累述,想要知道的可以去读计算机组成原理,磁盘主要有两种:一种是HDD硬盘机械硬盘),另一种是SSD硬盘(固态硬盘)。

  HDD硬盘:即机械硬盘,用的是SATA 3.0的接口,日常使用的HDD硬盘的传输率,差不多在200MB/s。

  SSD( Crucial MX500型号):即固态硬盘,有SATA3.0、PCI Express两种接口,硬盘的数据传输速率能到差不多 500MB/s,比 HDD 的硬盘快了一倍不止。

  不过 SATA 接口的硬盘,差不多到这个速度,性能也就到顶了。因为 SATA 接口的速度也就这么快(接口差异会显示磁盘的传输速率)。

  查看网络资料来看,运行 AS SSD 测算 SATA 接口 SSD 硬盘性能的结果 read:503MB/s    write:440MB/s左右,而采用的PCI Express 的接口能够更快,read: 2334MB/S  write : 1222MB/S,

  ---------关于测磁盘性能,这个找个时间玩玩------

3.磁盘Io

  磁盘Io的性能指标主要有两种:

  • 数据传输率
  • 响应时间

  其中数据传输速率如上述所说取决于硬盘类型和接口类型,而响应时间一般也是由上述的两种因素决定的。

    3.1 随机读写

   如果我们只看磁盘的响应时间的话,两种硬盘的响应时间都听不错的(上述测的HDD的Acc.time 读在0.086ms,写在0.048ms),因此即使是一个HDD硬盘在接受cpu请求时,也能在很短的时间能就能响应。

  按照这个思路,如果我使用的HDD硬盘,数据传输速率是200M/s ,比如说往数据库中写数据,假设一条记录是1k,那么每秒可以想数据库插入的记录数为:200*1024/1=20w条记录,但是往往这个理论值又和实际往往是不符合的。其最大原因在于磁盘的顺序读写与随机读写

  而以上所说的200MB/S和500MB/S其实都是顺序读写的速度,但是在随机读写,使用PCI Express的接口,随机读写的时候,数据的传输只能到40MB/s左右,是顺序读写情况下的几十分之一,我们拿这个 40MB/s 和一次读取 4KB 的数据算一下,40MB / 4KB = 10,000,一秒之内,这块 SSD 硬盘可以随机读取 1 万次的 4KB 的数据。如果是写入的话呢,会更多一些,90MB /4KB 差不多是 2 万多次。

  每次输入和输出的次数,称之为IPOS,这个比响应时间更为重要。

  IOPSDTR(Data Transfer Rate,数据传输率)是输入和输出性能的核心指标。

  在我们实际的开发中,对于数据的访问,更多的是随机访问数据的,平时所说的‘并发’,其实在说,会有多个不同的请求来访问服务器,自然它们会去访问磁盘上的数据,该访问方式是随机的。

  一般地说HDD硬盘的IOPS大约在100左右。

 3.2 I/O瓶颈

  上面说到通常HDD硬盘的IOPS一般在100左右,而使用PCI Express 的接口SSD硬盘的IOPS一般在2w左右,然而主频在2GHz的cpu,它每秒可以做20亿的操作(指令),即使 CPU 向硬盘发起一条读写指令,需要很多个时钟周期,一秒钟 CPU 能够执行的指令数,和我们硬盘能够进行的操作数,也有好几个数量级的差异,这也是为什么,我们在应用开发的时候往往会说“性能瓶颈在 I/O 上”。因为很多时候,CPU 指令发出去之后,不得不去“等”我们的 I/O 操作完成,才能进行下一步的操作。此时我们通过工具iostat命令查看iowait这个指标,从而知道了CPU 等待 IO 完成操作花费的时间占 CPU 的百分比。

4.总结

  硬盘的两个核心指标:响应时间和数据传输率,通过这两个指标可以理解IO性能问题。

  • 顺序读写的情况下,无论是HDD硬盘还是SSD硬盘,性能都是不错的
  • 随机读写的情况下,性能都不太高,使用PCI Express 接口的 SSD 硬盘,IOPS(每秒钟能够输入和输出的操作次数)也就只是到了2万左右。这个操作和CPU每秒20亿次的操作比起来,差的远了,所以很多时候,我们的程序对外响应慢,都是CPU在等待IO操作完成。

  在Linux下,可以通过这样的方式定位IO问题

  • 使用top命令,查看整个服务器的负载,应用响应慢的时候,通过这个命令来看CPU是否在等待IO完成自己的操作。
  • 可以通过iostat这个命令,来看各个硬盘这个时候的读写情况。
  • iotop这个命令,能够帮我们定位到底哪一个进程在进行大量的IO操作

  

  

    

    

  

 

posted on 2021-07-04 19:58  太白金星有点烦  阅读(523)  评论(0编辑  收藏  举报

导航