最近在做连续数据流的缓冲系统,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% 了。这是意料之中的,因为本质上 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等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦(最近发现有些帐号搬运我的文章并且标上原创标签,有些可耻,请注明出处!!)。

c语言中aver是什么意思_Linux系统top命令中的io使用率,到底是什么意思?相关推荐

  1. C语言中time函数和localtime获取系统时间和日期

    C语言中time函数和localtime获取系统时间和日期 可以通过time()函数来获得计算机系统当前的日历时间(Calendar Time),处理日期时间的函数都是以本函数的返回值为基础进行运算. ...

  2. c语言中aver是什么意思_嵌入式C语言基础编程—5年程序员给你讲函数,你真的懂函数吗?...

    本文主要讲述的内容: 1函数概述 2函数定义的一般形式 3函数的参数和函数的值 3.1形式参数和实际参数 3.2函数的返回值 4函数的调用 4.1函数调用的一般形式 4.2函数调用的方式 4.3被调用 ...

  3. [原创]C/C++语言中,如何在main.c或main.cpp中调用另一个.c文件

    C/C++语言中,如何在main.cpp中调用另一个.c文件主要有5种思路: 1.在VS2012 IDE中,将被引用的.c文件后缀名全部修改为.h,然后通过IDE的解决方案资源管理器中鼠标右键单击&q ...

  4. c语言中b的作用是什么意思,C语言中是什么意思?ab怎么理解?

    C语言中&是什么意思?a&b怎么理解?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中& ...

  5. c语言中sqrt函数_sqrt()函数以及C ++中的示例

    c语言中sqrt函数 C ++ sqrt()函数 (C++ sqrt() function) sqrt() function is a library function of cmath header ...

  6. c语言中free函数_free()函数与C ++中的示例

    c语言中free函数 C ++ free()函数 (C++ free() function) free() function is a library function of cstdlib head ...

  7. c语言中aver是什么意思_什么是C语言函数

    什么是C语言函数 for(i=0;i<5;i++) { scanf("%d",&a[i]); nzp(a[i]); } }void nzp(int v) { -- } ...

  8. c语言中ai是什么,AICODE在C语言教学中应用研究.doc

    AICODE在C语言教学中应用研究 AICODE在C语言教学中应用研究 摘要:本文研究了AI-CODE作为一种教学工具在C语言教学中的应用.首先,对传统C语言教学的不足.枯燥.缺乏互动进行了分析.其次 ...

  9. c语言中的tanh函数,tanh()函数,用于C ++中的复数

    在本文中,我们将讨论tanh()C ++ STL中复数的工作原理,语法和函数示例. tanh()用于复数是头文件下的函数.此函数用于查找复数的双曲正切.这是tanh()头文件下的的复杂版本. 什么是t ...

最新文章

  1. 交叉熵损失(Cross Entropy Loss)计算过程
  2. iOS-获取子视图父控制器
  3. Get Started with Lightning Knowledge
  4. SpringIOC配置文件「bean」标签的属性id class name scope init-method destroy-method factory-bean factory-method
  5. 基于nodejs实现本地网页服务器-实现手机测试电脑开发的移动端网页
  6. 计算机软件申请专利的困难,对于一个软件系统,在中国现在可以申请专利吗?...
  7. 下岗职工_下岗后我如何获得多位软件工程师的面试
  8. [react] 组件卸载前,加在DOM元素的监听事件和定时器要不要手动清除?为什么?
  9. Angular Render2
  10. 格林斯潘的一句话造成昨天(5月24日)股市大跌后爬升的分析
  11. IDEA解决maven多module出现多root的问题
  12. 微分方程数值解法结语
  13. 基于数字证书的UKEY安全登录
  14. 三八定律时间管理思想
  15. 税法18个税种全总结附记忆小口诀
  16. 使用 TX2 和 realsense D435i 相机运行 ORBSLAM3
  17. 轻松完成销售业绩的6个技巧
  18. WebView(三)—— WebView使用漏洞
  19. Struts MVC 框架 (让你一步步成为高手)
  20. for循环遍历字符串

热门文章

  1. git pull忽略指定文件_Git忽略提交规则
  2. 字符集和字符编码的学习
  3. 数据库连接池_DataSource_数据源(简单介绍C3P0和Druid)
  4. BetterAndBetter(BAB)的使用详解
  5. android 开源 示波器,上个老外的开源虚拟示波器
  6. 在java中补零的作用是什么_浅谈Java中的补零扩展和补符号位扩展
  7. 淮阴工学院计算机期末考选择题题库,淮阴工学院PLC试题库.doc
  8. 如何用python 开发web_如何用python开发web
  9. C/C 语言printf()
  10. C/C++制作人机猜拳小游戏