今天继续拜读「深入浅出计算机组成原理」专栏,觉得讲 IO_WAIT 这篇很有意思,正好可以结合前面的一篇讲物理硬件存速度的一块儿看。

现在我们看硬盘厂商出品的性能报告,通常会看到两个指标,一个是响应时间(Response Time) 另外一个是 数据传输速率 (Data Transfer Rate) 。

目前硬盘分两种,一种是 HDD 硬盘,也就是传统的机械硬盘.使用的是传统的 SATA3.0 的接口,而另外一种是 SSD 盘,也就是现在被我们成为固态硬盘的东西。它既可以使用 SATA3.0 接口,还可以使用另外一种叫做 PCI EXPRESS 的接口(以下称为 PCI 接口)。这里要补充一下 PCI 接口的吞吐率大幅高于 SATA3.0 的接口。 使用 SATA3.0 口的固态硬盘可能面临 接口的传输速率极限而限制了硬盘本身读写速度的发挥。

现在我们 SATA3.0 的贷款大致是 6Gbit/s 也就是 6 * 1024 / 8  约768 MB/s 的速度。这是一个很高的理论带宽值,根据专栏提供的数据,我们平时使用传输速率差不多只有 200MB/s

这里我插入一个 访问延时的比较图

这是我们平时经常接触的存储器的访问延时情况,可以看到 上面提到的 HDD 和 SSD 盘是最便宜的两种,随机访问延时 SSD  差不多是 150 微秒, HDD 则已经到毫秒级别。速度越快的存储,存量越小,越贵。

下面我们继续回到 HDD 和 SSD 这种通用外部存储上来。这里有一张使用 PCI 接口的 SSD 传输图

第一行参数 Seq 代表 SSD 进行顺序读写时候的速度,可以看到 - - 真是非常快啊。

第二行 4k 代表对 4k 大小文件进行随机读写的效率。可以看到- - 真是非常慢啊,对比 seq 的速度真是慢了不知道多少。

第三行 4K-64 64thrd表示多线程并发操作的性能,一般个人使用情况下不会用到如此多线程,一般也就qd=3,但是这个指标对服务器应用很重要。

第四行 acc代表我们之前说的响应时间可以看到 0.066ms ,还记得我们上面的随机读取延时图吗,就跟这个时间差不多。

另外还有一个指标也是衡量吞吐量很重要的指标, IOPS(每秒读写次数)

比如随机读写,我们随机读性能是 40MB/S 那么我们读 4kb 文件

40*1024 / 4 ~= 10000 IOPS 写入差不多 20000

因为我们在实际应用的开发中,对于数据的访问,更多的是随机读写,而不是顺序读写。我们平时说的服务器承受的 “并发”,其实是在说,会有很多个不同的进程和请求来访问服务器。自然,它们在硬盘上访问的数据,是很难顺序放在一起的。在这种情况下,随机读写的 IOPS 才是服务器性能的核心指标。

根据专栏给出的数据,正常的 HDD IOPS 仅有 100 左右。

这个 100 应该是这么计算的,首先我们假设是一个 每分钟 7200 转的 HDD 盘

在随机读取的情况下,每转半圈大概可以找到一个目标几何区 也就是每分钟可以转 240 个半圈

1s/240 = 4.17 这是平均延时(Average Latency)

另外我们还需要进行寻道,在盘面旋转之后我们悬臂定位到指定扇区的时间,现在 HDD 盘平均寻道时间在 4-10ms

所以我们平均每 4.17 + 4 - 4.17 + 10 = 8 - 14 ms 完成一次数据存取。

那么对应 IOPS 就是 70 - 125 ,平均一下 100 就是这么来的。

上面介绍了那么多如何衡量硬盘的读写,下面我们来回归到主题,如何定位 IO_WAIT

使用

top
top - :: up  days,  min,   user,  load average: 0.79, 0.69, 0.65
Tasks: total, running, sleeping, stopped, zombie
%Cpu(s): 20.0 us, 1.7 sy, 0.0 ni, 77.7 id, 0.0 wa, 0.0 hi, 0.7 si, 0.0 st
KiB Mem: total, used, free, buffers
KiB Swap: total, used, free. cached Mem

第三行 wa 就代表 cpu 的 io_wait 情况。这里可以用把这些简写都大概介绍一下

us:用户占用 cpu 比例

sy:内核空间占用 cpu 比例

ni:用户进程空间内改变过优先级的进程占用CPU百分比

id:空闲CPU百分比

wa: 等待 io 的 cpu 时间占比

hi:硬件中断

si:软件中断

st: 不知道是啥- - 不知道做什么用

如果我们看到 wa 非常高,说明 cpu 等待 io 的情况比较严重。如果我们发现了 wa 很高可以继续执行 iostat 查看详情。

iostat
Linux 3.10.-514.21..el7.x86_64 (iZ2ze3vworsqn8xb3m9zn5Z)     //     _x86_64_    ( CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
1.02 0.00 0.59 0.21 0.00 98.18 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 18.59 29.85 200.15
vdb 0.23 5.13 78.92

这是一台我部署了 kafka 的机器执行 iostat 的情况。

可以看到 iowait 的情况,以及单个磁盘 tps(iops)的情况。这时候我们要找出到底是哪个程序这么吃 io 我们使用

iotop

注意 iotop 在 CentOS7.X 版本上好像不是默认安装的,可以安装一下 yum -i install iotop

Total DISK READ :       0.00 B/s | Total DISK WRITE :      15.75 K/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 35.44 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
be/ root 0.00 B/s 7.88 K/s 0.00 % 0.18 % [jbd2/sda1-]
be/ root 0.00 B/s 3.94 K/s 0.00 % 0.00 % rsyslogd -n [rs:main Q:Reg]
be/ www-data 0.00 B/s 3.94 K/s 0.00 % 0.00 % nginx: worker process

如果有应用一直在前排 且 IO> 一直非常大,我们可以从 COMMAND 列定位到该程序进行查看。

以上。

Ref:

https://blog.csdn.net/Sasoritattoo/article/details/9318893    CPU状态信息us,sy,ni,id,wa,hi,si,st含义

https://serverfault.com/questions/155882/wa-waiting-for-i-o-from-top-command-is-big    wa (Waiting for I/O) from top command is big

https://time.geekbang.org/column/article/113809    极客时间「深入浅出计算机组成原理」44讲「理解 IO_WAIT」: I/O 性能到底是怎么回事儿?

https://en.wikipedia.org/wiki/IOPS

理解 IO_WAIT 并且了解利用包括 top htop iotop iostat 工具来查看 IO 性能的更多相关文章

  1. 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)

    一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)     概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...

  2. 一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)

      概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间总结一下是值得的! 本文内容脑图如下: top 命令 top 命令我想大家都挺熟悉吧! ...

  3. 进程管理工具uptime,top,htop

    进程管理工具uptime,top,htop 一uptime 显示当前时间,系统已启动的时间.当前上线人数,系统平均负载(1.5.10分钟的平均负载,一般不会超过1) 系统平均负载:指在特定时间间隔内运 ...

  4. 深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析

    前面在学习JVM的知识的时候,一般都需要利用相关参数进行分析,而分析一般都需要用到一些分析的工具,因为一般使用IDEA,而VisualVM对于IDEA也不错,所以就选择VisualVM来分析JVM性能 ...

  5. kill,killall,top,free,vmstat,iostat,watch命令

    kill命令 Linux 中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以 使用Ctrl+C键,但是,对 ...

  6. Linux之top 监视系统任务的工具

    top 监视系统任务的工具: 和ps 相比,top是动态监视系统任务的工具,top 输出的结果是连续的:  top 命令用法及参数: top 调用方法: top 选择参数 参数: -b  以批量模式运 ...

  7. 利用BLKTRACE分析IO性能

    在Linux系统上,如果I/O发生性能问题,有没有办法进一步定位故障位置呢?iostat等最常用的工具肯定是指望不上的,[容易被误读的iostat]一文中解释过await表示单个I/O所需的平均时间, ...

  8. [转] 利用BLKTRACE分析IO性能

    在Linux系统上,如果I/O发生性能问题,有没有办法进一步定位故障位置呢?iostat等最常用的工具肯定是指望不上的,[容易被误读的iostat]一文中解释过await表示单个I/O所需的平均时间, ...

  9. top(topas),vmstat,iostat在linux和AIX操作系统下显示情况

    top(topas),vmstat,iostat在linux和AIX操作系统下显示情况 分类: Linux基础 2013-08-09 17:26 1093人阅读 评论(0) 收藏 举报 详细列出各命令 ...

随机推荐

  1. JS实现文件自动上传

    JS引用: <script type="text/javascript" src="~/bootstrap/js/fileinput.min.js"> ...

  2. Asp.Net 技术

    Asp.Net 技术Nuget 管理器Spring.NET 框架Spring.core 包 微服务Consul .NetCore 框架:Spring.net Nhibernate 框架Dapper.n ...

  3. 在python当中使用redis

    redis数据库 # 1.安装redis与可视化操作工具 # 2.在服务中管理redis服务器的开启关闭 # 3.命令行简单使用redis: -- redis-cli # 启动客户端 -- set k ...

  4. 走一次HashMap的存取

    忘了太多东西,好好复习. 存: if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length;//检查 ...

  5. 【开发笔记】-Ubuntu环境命令初始化

    更新apt-get命令 apt-get update 安装yum命令 首先检测是否安装 build-essential 包 sudo apt-get install build-essential 安 ...

  6. Nginx 开启status用以监控状态信息

    Nginx 可以通过with-http_stub_status_module模块来监控nginx的一些状态信息.1.通过nginx -V来查看是否有with-http_stub_status_modu ...

  7. 【转载】C#通过遍历DataTable的列获取所有列名

    在C#中的Datatable数据变量的操作过程中,可以通过遍历DataTable的所有列对象Columns属性,来获取DataTable中的所有列名信息,DataTable中所有列的对象信息都存储在D ...

  8. JavaScript设计模式与开发实践随笔(三)

    封装 1. 封装数据 a)      只能依赖变量的作用域来实现封装特性,es6中可以通过symbol创建私有属性 var myObject = (function(){ var __name = ' ...

  9. vim巧妙用法

    1. 块复制 按ctrl+v键,编辑框最下方将出现"可视 块"字样 使用方向键移动光标,选择矩形区域内的文字 y 键复制文本: d 键剪切文本:p 键粘贴文本 按shift+v键, ...

  10. mysql 查询当天数据

    查询当天数据 select * from tab where FROM_UNIXTIME(fabutime, '%Y%m%d') = 20121217;   mysql TO_DAYS(date) 函 ...