https://baijiahao.baidu.com/s?id=1641356547223820839&wfr=spider&for=pc

最近在做连续数据流的缓冲系统,C语言代码实现后,粗略测试了下,功能上应该没有问题。那么,接下来就该测试性能了。输入 top 命令,的确可以看到一系列 cpu 使用率,其中一个值得注意的子项就是 io 使用率了,如下图:

top 命令

上图中 io 前面的数字是什么意思呢?是指 CPU 有 63% 的时间花费在 io 上了吗?在 Linux 中输入 man 命令查看相关手册,发现 io(wait) 被解释为“等待 I/O 完成的时间”。

“等待 I/O 完成的时间”

如果按照手册对 iowait 字面上的解释,是很容易陷入误区的。因为就上例而言,似乎 CPU 有 63% 的时间消耗在等待I/O 操作完成,导致 CPU 的性能白白浪费这么多。

其实不是的,Linux 是一个成熟的操作系统,它才不会让 CPU 宝贵的性能白白浪费在耗时的 I/O 等待上,实际上,如果当前系统还有其他任务需要使用 CPU,Linux 会将等待 I/O 完成的任务暂时挂起,将 CPU 使用权暂时交给有需要的任务。

那么 iowait 到底是什么意思呢?

有人认为,iowait 只是 CPU 空闲(idle)时间的一个子集,也就是说 iowait 其实可以归类到 idle 状态,本质上表示 CPU 是空闲的,只不过 iowait 表示任务中有等待 I/O 操作完成的时间。

iowait 到底是什么意思呢?

这样认为有一定的道理,毕竟哪怕 iowait 的数值是 100%,也仅仅是说明是 CPU 把时间都花在“等待”上了,这样的情况一般只有在当前系统没有其他任务需要使用 CPU 时才会发生。因为一旦有其他任务需要使用 CPU,Linux 内核会立刻将 CPU 提供给该任务使用,CPU 时间就不再全部是“等待I/O”花费的了(不再是 100% io 了)。

不过读者应该明白的是,“idle”是 CPU 的状态,而 “iowait”则是任务的状态。对于单核 CPU 来说,同时只能有一个任务运行,上述说法可以认为是准确的。但是对于多核 CPU 来说,情况就有些不同了。

例如,某个系统拥有 4 个 CPU,有一个 I/O 超密集型任务正在运行,那么,iowait 会是 100% 呢,还是 25% 呢?换句话说,iowait 会是在其中一个 CPU 上 100%,其他CPU 上 0% 呢,还是会在 4 个 CPU 上平均 25 % 呢?

简单做一个实验

简单做一个实验就可以了。我们使用 Linux 中的 dd 命令模拟高密集 I/O 任务,这一过程可以通过输入以下命令实现:

dd if=/dev/sda of=/dev/null bs=1MB

这条命令可能需要 root 权限,/dev/sda 是我的磁盘,读者可能需要换成自己的节点名。

此时,通过 top 命令可以查看到下面这样的结果:

top 命令

图中的 “wa”表示 I/O 等待时间(它和 io、iowait 是一个意思,名字不同而已)。可见,Linux 此时采用单个 CPU 处理 I/O 任务。如果读者细心的话,应该能够发现,I/O 任务只是偶尔的切换到其他 CPU 上运行,这是为了保证 CPU 缓冲的命中率,Linux 内核尽量让任务在单个 CPU 中运行。

在其他一些系统中,I/O 任务可能会在各个CPU中频繁的切换,此时会产生下面这样的结果:

I/O 任务可能会在各个CPU中频繁的切换

假设 dd 命令是系统中执行 I/O 的唯一任务,那么在同一时刻,最多只会有一个 CPU 处理 I/O 等待任务。因此,实际上 34.8+20.9+26.7+3.7=86.1,接近但低于100。

进一步实验

为了让实验更可重现,我们可以使用 taskset 命令为任务指定 CPU:

taskset 1 dd if=/dev/sda of=/dev/null bs=1MB

应该注意,taskset 后的数字 1 并不是 CPU 的编号,而是一种掩码。

此时通过 top 命令查看 CPU 使用请看,应该能够发现 CPU0 的 wa 项接近 100,这说明 CPU0 几乎所有的时间都花在等待 I/O 操作完成上。那么,是不是此时 CPU 就没有精力处理其他任务了呢?我们再输入下面这条命令:

taskset 1 sh -c "while true; do true; done"

上面这条命令是在相同的 CPU 上执行一个死循环,用于模拟计算密集型任务,它是不是就没有机会执行了呢?输入 top 命令,得到如下结果:

CPU0 的 wa 降低为 0 了

CPU0 的 wa 降低为 0 了,与此同时,用户态和系统态的 CPU 时间接近 100% 了。这是意料之中的,因为 I/O 等待时间只是 idle 时间的子项,本质上 CPU 是空闲的,Linux 内核当然可以把 CPU 交给第二个任务使用。原本用于等待 I/O 完成的 CPU 时间,现在用于处理第二个任务了。此时通过 top 命令查看 wa,自然得到接近 0 的结果。

小结

现在基本就清楚 top 命令中 % io 的含义了:对于指定的 CPU 来说,iowait 表示在此时间内,CPU 其实是空闲的,不过 CPU 并不是严格意义上的“空闲”,毕竟它还需要等待 I/O 操作完成。对于产生 I/O 操作请求的线程来说,它会阻塞等待 I/O 操作完成。理解这一点,对于我们开发I/O操作密集的C语言程序是非常有帮助的。

点个赞再走吧

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦(最近发现有些帐号搬运我的文章并且标上原创标签,有些可耻,请注明出处!!)。

[转帖]Linux系统top命令中的io使用率,很多人都误解了它的具体含义的更多相关文章

  1. 性能测试 | Linux系统top命令中的io使用率,很多人都误解了它的具体含义

    body{ text-align:left; width:80%; margin:10px 100px; } 最近在做连续数据流的缓冲系统,C语言代码实现后,粗略测试了下,功能上应该没有问题.那么,接 ...

  2. linux系统top命令查看系统状态

    Linux系统可以通过top命令查看系统的CPU.内存.运行时间.交换分区.执行的线程等信息.通过top命令可以有效的发现系统的缺陷出在哪里.是内存不够.CPU处理能力不够.IO读写过高. 使用SSH ...

  3. Linux 在 TOP 命令中切换内存的显示单位

    顶部的内存信息可以在top运行时按E切换,每次切换转换率为1000,只是没有单位,切换的单位为 k,m,g,t,p: 1. 2. 3., 4. 底下的进程信息按e切换,每次切换转换率为1000,切换的 ...

  4. [转载]linux的top命令中cpu信息的含义

    https://www.cnblogs.com/wjoyxt/p/4918742.html 原文很好,我就不摘录了.

  5. linux下top命令详细介绍

    linux下top命令详细介绍 top 命令是 Linux 下常用的系统资源占用查看及性能分析工具,能够实时显示系统中各个进程的资源(比如cpu.内存的使用)占用状况,top命令的执行结果是一个动态显 ...

  6. linux top命令中各cpu占用率含义

    linux top命令中各cpu占用率含义 [尊重原创文章摘自:http://www.iteye.com/topic/1137848]0.3% us 用户空间占用CPU百分比 1.0% sy 内核空间 ...

  7. Linux top命令中CPU信息的详解(转)

    add by zhj: 下面的文章解释的很好了,这里再说明一下top命令中wa的含义,我们知道,当IO阻塞时,操作系统会把进程改为阻塞态,将CPU调度到运行其它进程. CPU在空闲状态下,会检查是否有 ...

  8. (转)linux top命令中各cpu占用率含义及案例分析

    原文:https://blog.csdn.net/ydyang1126/article/details/72820349 linux top命令中各cpu占用率含义 0 性能监控介绍 1 确定应用类型 ...

  9. Linux下top命令详解

    Linux下top命令详解 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top是一个动态显示过程,即可以通过用户按键来不断刷 ...

  10. linux系统管理--top命令

    这些日子,运维公司三台服务器,一个小伙伴貌似对top命令不太感冒,我告诉他去百度(不懂谷歌百度的程序员不是好厨师),然后突然发现也许我自己该整理一下相关的东西了 top命令是Linux下常用的性能分析 ...

随机推荐

  1. 宝兰德应用服务器软件与华为云GaussDB完成兼容互认证

    摘要:北京宝兰德软件股份有限公司携手华为云完成宝兰德应用服务器软件9.5与GaussDB数据库兼容性测试,并获得华为云授予的技术认证书. 本文分享自华为云社区<宝兰德应用服务器软件与华为云Gau ...

  2. 实践GoF的设计模式:访问者模式

    摘要:访问者模式的目的是,解耦数据结构和算法,使得系统能够在不改变现有代码结构的基础上,为对象新增一种新的操作. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:访问者模式> ...

  3. 什么是MircoPython?

    摘要:互联网玩家为了让Python这样的容易学,简单易学.社区API丰富的语言可以在嵌入式领域用上,逐渐开始了一轮Python上嵌入式的迁移,这样就有了今天的主角--MircoPython. 本文分享 ...

  4. 手把手带你玩转LiteOS Ping组件

    摘要:本期小编为大家带来LiteOS开源版本Ping组件的使用说明,请跟随小编的步伐一起进入探索之旅吧! 本文分享自华为云社区<LiteOS组件尝鲜-玩转Ping>,作者:Lionlace ...

  5. 10亿数据、查询<10s,论基于OLAP搭建广告系统的正确姿势

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   由于流量红利逐渐消退,越来越多的广告企业和从业者开始探索精细化营销的新路径,取代以往的全流量.粗放式的广告轰炸 ...

  6. A/B 测试成为企业“新窗口”:增长盈利告别经验主义,数据科学才是未来

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 如何能够预知一个产品的未来?最好的办法当然是穿越到未来看一看. 这种"模拟未来.窥探底牌"的设 ...

  7. VMware NAT 模式 虚拟机网络电缆被拔出,连不上网

    检查服务 VMnetDHCP,VMware NAT Service 服务是否已启动,启动后可以正常使用网络

  8. grep 文本搜索工具

    参考百度百科 1.简介 grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式 ...

  9. 42 干货系列从零用Rust编写负载均衡及代理,wmproxy中配置tcp转websocket

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...

  10. #2089: 不要62 (数位dp模板题,附带详细解释)

    题目链接 题意:问区间[n,m]中,不含数字4,也不含数字串"62"的所有数的个数. 思路:可以转化成求区间[0,x] 第一次接触数位dp,参考了这几篇博客. 不要62(数位dp) ...