今天继续拜读「深入浅出计算机组成原理」专栏,觉得讲 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#:Json字符串、JsonArray字符串处理

    今天在做Asp网站开发的时候接受到了一种下面这种样子的字符串: "[ { "mid": "123456", "nid": &quo ...

  2. CLR学习之初识CLR

    一.什么是CLR? CLR即公共语言运行时(Common Language Runtime,简称CRL),就是微软为.net产品构建的运行环境,与java的JVM类似,通俗的讲就是.net虚拟机.CL ...

  3. ASP.NET Core 配置文件

    在ASP.NET Core 中,应用程序配置数据可以使用JSON, XML 和 INI格式 和内置环境变量,命令行参数或内存中的集合. 1.如何获取和设置配置 ASP.NET Core配置系统针对以前 ...

  4. .Net Core 遇到 “'windows-1252' is not a supported encoding name.”

    最近用 iTextSharp 拆分 Pdf 文档 加水印的时候遇到错误: 'windows-1252' is not a supported encoding name. For informatio ...

  5. JavaScript 函数(一)

    一.函数概述 1.概述 把一段相对独立的具有特定功能的代码块封装起来,形成一个独立实体,就是函数,起个名字(函数名),在后续开发中可以反复调用函数的作用就是封装一段代码,将来可以重复使用. 二.使用函 ...

  6. 对List集合中的元素进行排序

    原文:http://blog.csdn.net/veryisjava/article/details/51675036 Collections对List集合中的数据进行排序 有时候需要对集合中的元素按 ...

  7. 【按键精灵篇】如何做一个自动打开APP进入注册页面自动输入自己手机号

    按键精灵,虽然很早听过,但是一直没有真正使用过,所以最近有点时间也简单试一下,通过脚本自动清理APP缓存,打开百家号并自动进入注册页面输入自己的手机号. 软件清单 1. 雷电手机模拟器:https:/ ...

  8. 为什么要将action实例设置为多例

    转载自 https://zhidao.baidu.com/question/622162406833405932.html struts2中action是多例的,即一个session产生一个actio ...

  9. 如何处理动态JSON in Go

    假如要设计一个统计的json解析模块,json格式为 { "type": "用来识别不同的json数据", "msg": "嵌套的 ...

  10. 5.Lvs+Keepalived健康检查

    1. Nginx+keepalived对后端服务器心跳检查(需要自定义脚本) 原理:Keepalived并不跟nginx耦合,它俩完全不是一家人但是keepalived提供一个机制:让用户自定义一个s ...