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

CPU 一共有四种状态,在任一时刻,CPU 的状态都是四种中的一种。这四种状态是:user,sys,idle,iowait 。比如 sar、top会用百分比表示 CPU 分别处于这四种状态的时间,这四种状态相加的结果是 100%。
上面提到的 4 种 CPU 状态,其实只有 2 种:
- 工作/忙碌(busy)
- 非工作/空闲(idle)
其中 busy 状态下又分成了:
- user:表示 CPU 目前正在执行用户空间的代码
- system:表示 CPU 目前正在执行内核空间的代码
idle 状态下又分成了:
- idle:系统中没有 R 状态的进程了
- 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 了,与此同时 us 和 sy 的时间占比接近 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 高:
- 系统存在 I/O 性能问题:系统正在做的工作,大部分时间都是在等待 I/O 了。
- 有进程因为等待 I/O 操作而阻塞,但这并不意味着系统不可以运行其他进程。
4)系统 iowait 低不能说明进程没有阻塞在 I/O 上。因为 CPU 在 iowait 状态的时候能执行其他进程。
聊聊 Linux iowait的更多相关文章
- 聊聊 Linux 中的五种 IO 模型
本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538919&idx=1&sn=6013c451 ...
- 简单聊聊Linux学习经历
学习,是我们一生中都规避不了的一个话题,人的一生中都是在不断的学习,无论是功成名就的人士,还是一无是处的小混混,始终都处在一个不断学习的环境中,只是学习的内容千差万别,有的人是为了提升自己各方面的能力 ...
- 聊聊Linux用户态驱动设计
序言 设备驱动可以运行在内核态,也可以运行在用户态,用户态驱动的利弊网上有很多的讨论,而且有些还上升到政治性上,这里不再多做讨论.不管用户态驱动还是内核态驱动,他们都有各自的缺点.内核态驱动的问题是: ...
- 聊聊Linux中CPU上下文切换
目录 什么是CPU上下文 CPU上下文切换 上一任务的CPU上下文保存在哪? 进程上下文切换 内核空间和用户空间 top命令查看CPU资源 系统调用 进程上下文切换 和 系统调用的区别? 进程切换的常 ...
- Linux 理解 %iowait (%wio)
理解 %iowait (%wio) 2016/02/25 %iowait 是 “sar -u” 等工具检查CPU使用率时显示的一个指标,在Linux上显示为 %iowait,在有的Unix版本上显示为 ...
- 聊聊IO多路复用之select、poll、epoll详解
本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538922&idx=1&sn=e6b436ef ...
- 理解 %IOWAIT (%WIO)
%iowait 是 “sar -u” 等工具检查CPU使用率时显示的一个指标,在Linux上显示为 %iowait,在有的Unix版本上显示为 %wio,含义都是一样的,这个指标常常被误读,很多人把它 ...
- 网络通信 --> Linux 五种IO模型
Linux 五种IO模型 聊聊Linux 五种IO模型
- Linux IO模型(同步异步阻塞非阻塞等)的几篇好文章
聊聊同步.异步.阻塞与非阻塞聊聊Linux 五种IO模型聊聊IO多路复用之select.poll.epoll详解
- Linux用户态驱动设计
聊聊Linux用户态驱动设计 序言 设备驱动可以运行在内核态,也可以运行在用户态,用户态驱动的利弊网上有很多的讨论,而且有些还上升到政治性上,这里不再多做讨论.不管用户态驱动还是内核态驱动,他们都 ...
随机推荐
- 简单实用算法——二分查找法(BinarySearch)
目录 算法概述 适用情况 算法原理 算法实现(C#) 实际应用:用二分查找法找寻边界值 参考文章 算法概述 二分查找(英语:binary search),也叫折半查找(英语:half-interval ...
- 为什么要将Jenkins部署在k8s上
传统Jenkins的Master-Slave方案的缺陷 Master节点发生单点故障时,整个流程都不可用了 每个 Slave节点的配置环境不一样,来完成不同语言的编译打包等操作,但是这些差异化的配置导 ...
- linux程序运行结果在打印到屏幕的同时写入文件
1.使用script工具 script工具是一个非常使用的工具,可以把输出到终端的信息记录下来.使用方法如: (1)输入 script log.txt命令开始保存终端输出的信息 ,其中log.txt为 ...
- electron程序运行在某些 windows 上白屏
现象: 打包后的 electron 程序 运行在某些 windows 上白屏 项目情况: vue3.0 项目使用 vue-cli 创建 使用 vue add electron-builder 添加打 ...
- Java加密技术(五)——非对称加密算法的由来DH
Java非对称加密算法dh 接下来我们分析DH加密算法,一种适基于密钥一致协议的加密算法. DH Diffie-Hellman算法(D-H算法),密钥一致协议.是由公开密钥密码体制的奠基人Di ...
- Ubuntu 16.04 LAMP(PHP7.0) 环境搭建并测试
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- Oracle两表关联更新
表结构.测试数据 drop table t1; drop table t2; CREATE TABLE T1 ( name VARCHAR2(10) , code VARCHAR2(10) ); AL ...
- linux安装jdk压缩包版
1.下载压缩包可以选择国内大厂的jdk镜像网站下载速度很快, 比如华为的:https://repo.huaweicloud.com/java/jdk/ 2.查看Linux系统是否有自带的jdk: 输入 ...
- .net和java串口通讯压力测试对比
最近由于工作要求,需要对一个串口通讯设备进行压力测试,要求连续持续对串口设备发送指令,无间隔,测试设备是否会死机. 要求做到毫秒级,测试第三方的工具,基本上都无法达到毫秒级,最少的也是10毫秒. 于是 ...
- Unity中国、Cocos为OpenHarmony游戏生态插上腾飞的翅膀
2023年是OpenHarmony游戏生态百花齐放的一年!为了扩展OpenHarmony游戏生态,OpenHarmony在基金会成立了游戏SIG小组,游戏SIG小组联合cocos,从cocos2d ...