哈喽大家好,我是咸鱼。

我们在使用 top 命令来查看 Linux 系统整体 CPU 使用情况的时候,往往看的是下面这一列:

%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  68.0 wa,  0.0 hi,  0.0 si,  0.0 st

其中,man 手册解释 wa 表示 CPU 在等待 I/O 操作(iowait)的时间百分比。

上面输出显示:CPU 有 68% 的时间消耗在等待 I/O 操作完成。按照也就是说有 68% 的 CPU 时间被浪费掉了?可是 Linux 会让 CPU 宝贵的性能白白浪费在耗时的 I/O 等待上吗?CPU 在 iowait 状态的时候能执行其他任务吗?

实际上当 CPU 处于 iowait 状态时,理论上也应该被视为处于 idle (空闲)状态,那 iowait 和 idle 之间有什么联系呢?

今天我们就来解开这些疑惑,来看看 iowait 到底是什么。

参考文章:

https://www.kawabangga.com/posts/5903

https://blog.popkx.com/linux系统top命令中的iowait究竟是什么意思/

https://www.linfo.org/process_state.html

https://blog.pregos.info/wp-content/uploads/2010/09/iowait.txt

进程和 CPU 状态

我们首先要搞清楚进程的状态和 CPU 状态。

进程可以分为下面几种状态:

  1. R:可执行状态(runnable),表示进程正在被 CPU 执行或者处在 CPU 队列中等待分配 CPU 时间片。
  2. S:可中断睡眠状态(interrupted sleep),表示进程处于睡眠状态,当特定条件或者信号到达时,就会被唤醒,状态也由 S 变成 R。
  3. D:不可中断睡眠状态(uninterrupted sleep),跟状态 S 类似,只是进程在接收到信号时不会被唤醒。这类状态的进程一般在等待 I/O 结束。
  4. Z:僵尸状态(zombie),表示进程已经终止(死透了),但父进程还没有发出 wait4() 系统调用去读取它的结束信息。(可以理解为进程死【终止】后 父进程要给它收尸【获取该进程的终止状态】)
  5. T:暂停状态(stopped),表示进程已经暂停(还没死透),是可以恢复的(比如我们给进程发送 SIGSTOP 或者按 CTRL+Z,就可以将进程置为暂停状态,可以通过 bg/fg 命令,或者发送 SIGCONT 信号恢复。)

CPU 一共有四种状态,在任一时刻,CPU 的状态都是四种中的一种。这四种状态是:user,sys,idle,iowait 。比如 sar、top会用百分比表示 CPU 分别处于这四种状态的时间,这四种状态相加的结果是 100%。

上面提到的 4 种 CPU 状态,其实只有 2 种:

  1. 工作/忙碌(busy)
  2. 非工作/空闲(idle)

其中 busy 状态下又分成了:

  1. user:表示 CPU 目前正在执行用户空间的代码
  2. system:表示 CPU 目前正在执行内核空间的代码

idle 状态下又分成了:

  1. idle:系统中没有 R 状态的进程了
  2. iowait:系统中没有 R 状态的进程但有进程卡在 I/O 上

这里可以看到:iowait 其实可以归类到 idle 状态,本质上表示 CPU 是空闲的,只不过 iowait 表示任务中有等待 I/O 操作完成的时间。

那既然 iowait 也是一种 idle,CPU 在 iowait 状态的时候能执行其他任务吗?下面让我们来看一个例子。

举个栗子

本次例子在双核 CentOS 7 环境下实验。

我们使用 dd 命令模拟高密集 I/O 任务,并且使用 taskset 来为任务指定 CPU

# taskset 后的数字 1 并不是 CPU 的编号,而是一种掩码。
taskset 1 dd if=/dev/sda of=/dev/null bs=1MB

此时通过 top 命令查看 CPU 使用率,能够发现 CPU0 的 wa 项接近 100,这说明 CPU0 几乎所有的时间都花在等待 I/O 操作完成上。

那么,是不是此时 CPU 就没有精力处理其他任务了呢?我们再输入下面这条命令:

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

这条命令是在相同的 CPU 上执行一个死循环,用于模拟计算密集型任务。

可以看到:CPU0 的 wa 降低为 0 了,与此同时 ussy 的时间占比接近 100% 。CPU 在 iowait 状态的时候能执行了其他任务。

但这就说明 dd 命令产生的进程没有阻塞在 I/O 上吗?并不是。

假设有一个进程需要花 70% 的时间等待 I/O 完成,把它放到一个空闲的单 CPU 的系统中,显示的 iowait 是 70%。

但是我在这个系统中增加一个非 I/O 的计算任务,iowait 就变成 0 了。而我们之前的那个进程依然需要花 70% 的时间等待 I/O。

一个是从 CPU 角度来看,一个是从进程的角度来看,iowait 是 CPU 的一个状态,它不是进程的状态。iowait 很低,不能代表进程没有阻塞在 I/O 上。

总结

最后总结一下:

1)不要搞混 CPU 状态和进程的状态。进程有 R、S、D、Z、T,5 种状态;CPU 有 4 种状态:工作(user、system 两种)和空闲(idle、iowait 两种)。

2)iowait 表示 CPU 其实是空闲的,不过 CPU 并不是严格意义上的 “空闲”,上面还有等待 I/O 操作的进程在执行。

3)系统 iowait 高:

  1. 系统存在 I/O 性能问题:系统正在做的工作,大部分时间都是在等待 I/O 了。
  2. 有进程因为等待 I/O 操作而阻塞,但这并不意味着系统不可以运行其他进程。

4)系统 iowait 低不能说明进程没有阻塞在 I/O 上。因为 CPU 在 iowait 状态的时候能执行其他进程。

聊聊 Linux iowait的更多相关文章

  1. 聊聊 Linux 中的五种 IO 模型

    本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538919&idx=1&sn=6013c451 ...

  2. 简单聊聊Linux学习经历

    学习,是我们一生中都规避不了的一个话题,人的一生中都是在不断的学习,无论是功成名就的人士,还是一无是处的小混混,始终都处在一个不断学习的环境中,只是学习的内容千差万别,有的人是为了提升自己各方面的能力 ...

  3. 聊聊Linux用户态驱动设计

    序言 设备驱动可以运行在内核态,也可以运行在用户态,用户态驱动的利弊网上有很多的讨论,而且有些还上升到政治性上,这里不再多做讨论.不管用户态驱动还是内核态驱动,他们都有各自的缺点.内核态驱动的问题是: ...

  4. 聊聊Linux中CPU上下文切换

    目录 什么是CPU上下文 CPU上下文切换 上一任务的CPU上下文保存在哪? 进程上下文切换 内核空间和用户空间 top命令查看CPU资源 系统调用 进程上下文切换 和 系统调用的区别? 进程切换的常 ...

  5. Linux 理解 %iowait (%wio)

    理解 %iowait (%wio) 2016/02/25 %iowait 是 “sar -u” 等工具检查CPU使用率时显示的一个指标,在Linux上显示为 %iowait,在有的Unix版本上显示为 ...

  6. 聊聊IO多路复用之select、poll、epoll详解

    本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538922&idx=1&sn=e6b436ef ...

  7. 理解 %IOWAIT (%WIO)

    %iowait 是 “sar -u” 等工具检查CPU使用率时显示的一个指标,在Linux上显示为 %iowait,在有的Unix版本上显示为 %wio,含义都是一样的,这个指标常常被误读,很多人把它 ...

  8. 网络通信 --> Linux 五种IO模型

    Linux 五种IO模型 聊聊Linux 五种IO模型

  9. Linux IO模型(同步异步阻塞非阻塞等)的几篇好文章

    聊聊同步.异步.阻塞与非阻塞聊聊Linux 五种IO模型聊聊IO多路复用之select.poll.epoll详解 ​

  10. Linux用户态驱动设计

    聊聊Linux用户态驱动设计   序言 设备驱动可以运行在内核态,也可以运行在用户态,用户态驱动的利弊网上有很多的讨论,而且有些还上升到政治性上,这里不再多做讨论.不管用户态驱动还是内核态驱动,他们都 ...

随机推荐

  1. 在使用sudo apt-get -f install的时候,出现了更换介质的问题-依赖问题

    这四个选项都选上,然后apt-get update 在修补依赖问题,apt-get -f install      就好了

  2. 基于Apollo3-Blue-MCU的智能手表方案源码解析

    一 方案简介 1.简介 Apollo3 Blue Wireless SoC是一款超低功耗无线mcu芯片,它的运行功耗降至6μA/ MHz以下.该器件采用ARM Cortex M4F内核,运行频率高达9 ...

  3. 01_Mac安装Homebrew

    目录 1 官方 1.1 前提 1.2 安装 2 其他安装方法 2.1 安装homebrew-core 2.2 安装homebrew-cask 3 源 3.1 查看源 3.2 设置源 3.3 设置bot ...

  4. 三维模型3DTile格式轻量化压缩集群处理方法分析

    三维模型3DTile格式轻量化压缩集群处理方法分析 在地理信息系统中,由于三维模型的数据密度和文件体积较大,因此需要进行轻量化和压缩处理.这里我们将对使用集群处理方法来实现3D Tiles数据的轻量化 ...

  5. 记录--一个炫酷的css动画

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近有一个需求,要我实现一个动画效果,效果如下 简单分析了一下效果,是一个3d的效果,首先是一个圆,接着是两段圆环,第三层是一堆小圆环,最 ...

  6. 工作记录:TypeScript从入门到项目实战(基础篇)

    前言 TypeScript是什么? 引用官方原话 TypeScript是JavaScript类型的超集,它可以编译成纯JavaScript.TypeScript可以在任何浏览器.任何计算机和任何操作系 ...

  7. WPF 图片锯齿解决办法(保证解决!!!)

    无非几个属性统统加上,不能解决我倒立洗头,日五档电风扇 RenderOptions.BitmapScalingMode="HighQuality" UseLayoutRoundin ...

  8. Oracle存储过程模板

    PROCEDURE proc_test(p_id IN NUMBER, v_cur OUT SYS_REFCURSOR, p_result_code OUT NUMBER, p_result_mess ...

  9. salesforce零基础学习(一百三十五)项目中的零碎知识点小总结(七)

    本篇参考: https://trailhead.salesforce.com/content/learn/modules/flow-implementation-2/debug-flows-as-an ...

  10. 前端ajax调用后端下载Excel模板流,解决输出乱码等问题

    JavaScript方法function importTemplate() { $.ajax({ url: "/importTemplate", type: "get&q ...