今天继续拜读「深入浅出计算机组成原理」专栏,觉得讲 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. C# Modbus 数据读取 使用NModBus4库

    ModBus通讯协议 方法名 作用 所需参数 返回值 对应功能码 ReadCoils 读取DO的状态 从站地址(8位) byte slaveAddress 起始地址(16位) ushort start ...

  2. Win10安装IIS并配置ASP.NET 4.0

    这几天新购置了电脑家用,自家电脑上上了win10+Ubuntu.解决了双系统的一些坑之后,今天准备给win10装IDE了(虽然想在Ubuntu下搞搞React/Python之类的,但我骨子里还是个.N ...

  3. 2019 盛天网络java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.盛天网络等公司offer,岗位是Java后端开发,因为发展原因最终选择去了盛天网络,入职一年时间了,也成为了面 ...

  4. ionic创建组件、页面或者过滤器

    ionic可以直接 用命令来创建组件.页面或者过滤器. 在ionic项目根目录打开命令窗口.输入下列命令: ionic g page pageName //创建新页面 ionic g componen ...

  5. 5.1 dex文件解析

    1.DexHeader结构体占用0x70字节,源码位置 dalvik\libdex\DexFile.h文件中269/* 270 * Direct-mapped "header_item&qu ...

  6. Kubernetes学习之路(27)之k8s 1.15.2 部署

    目录 一.环境准备 二.软件安装 三.部署master节点 四.部署node节点 五.集群状态检测 一.环境准备 IP地址 节点角色 CPU Memory Hostname Docker versio ...

  7. jmeter 使用命令行执行

    一般情况我们在设计脚本的时候,可以使用界面执行. 实际在压测的时候,我们可以使用命令行在后台执行. jmeter -n -t D:\document\bgy\jemeter\Script1.jmx - ...

  8. 还是把这道kmp的题po出来吧,省的以后自己也忘了

    做了一个问题突然想到可以用Kmp解决,所以看了一下自己之前写的关于Kmp的博客用JAVA实现的KMP匹配子串,记录一下,省的又忘了. /* *题目描述: * 假定我们都知道非常高效的算法来检查一个单词 ...

  9. 性能测试基础---SQL基础

    ·数据库相关: ·范式:NF.关系型数据库的设计规则. 范式总计有6种: 1NF\2NF\3NF\BCNF\4NF\5NF ·范式的实现是从低到高的,比如说首先要实现的就是1NF,才能继续实现2NF, ...

  10. Django如何与ajax通信

    示例一 文件结构 假设你已经创建好了一个Django项目和一个App,部分结构如下: mysite myapp |___views.py |___models.py |___forms.py |___ ...