zoukankan      html  css  js  c++  java
  • 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操作

      

      

        

        

      

  • 相关阅读:
    SpringCloud学习系列之四-----配置中心(Config)使用详解
    阿里云Docker镜像仓库(Docker Registry)
    阿里云Docker镜像加速
    Docker安装(yum方式 centos7)
    Docker Nginx安装(centos7)
    Dockerfile文件详解
    mysql 开发进阶篇系列 6 锁问题(事务与隔离级别介绍)
    mysql 开发进阶篇系列 5 SQL 优化(表优化)
    mysql 开发进阶篇系列 4 SQL 优化(各种优化方法点)
    sql server 性能调优之 资源等待PAGELATCH
  • 原文地址:https://www.cnblogs.com/zmc60/p/14969744.html
Copyright © 2011-2022 走看看