Linux命令拾遗-%iowait指标代表了什么?

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。

简介

一直以来,我都知道top、vmstat、mpstat中有一个叫wa(%iowait)的cpu指标,但对它表示的具体含义又不是很清楚,故专门去网上学习了一下。

iowait在man中的介绍

man文档是学习命令的第一手资料,先来看看man文档中的介绍,如下:

$ man top
wa, IO-wait : time waiting for I/O completion.

$ man vmstat
wa: Time spent waiting for IO.  Prior to Linux 2.5.41, included in idle.

$ man mpstat
%iowait
    Show the percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.

$ man iostat
%iowait
    Show the percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.

$ man sar
 %iowait
    Percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.

翻译过来就是 CPU空闲且有正在进行的磁盘IO的情况下所占的时间比例,理解起来非常模糊,只能大概了解到这个指标好像和磁盘IO有关。

iowait真相

在man中查不到,那就只能去网上找找了,看有没有大佬在网上分享过这方面知识,在经过好一段时间的baidu、google,终于发现了如下两篇文章:

可以说这两篇文章介绍得非常清楚了,我用白话概括一下内核处理过程,如下:

  1. 我们知道操作系统给每个CPU分配了一个运行队列rq,用于存放可运行的线程task_stuct,调度器每次都是从此队列中取线程执行,若队列为空则CPU执行内核空闲线程的代码。
  2. 当线程执行io操作时,需要将当前任务切换出去,会先将当前线程 task_stuct.in_iowait设置为1,线程状态设置为 TASK_UNINTERRUPTIBLE(D状态),并将运行队列上 rq.nr_iowait加1,而io完成后 task_stuct.in_iowait还原为0, rq.nr_iowait减1,具体见内核 io_schedule_timeout函数,可见 rq.nr_iowait代表当前CPU上等待io操作的线程数量。
  3. 当CPU执行内核空闲代码时,会判断 rq.nr_iowait,若大于0则将空闲时间计算在iowait上,否则计算在idle上,具体见内核 account_idle_time函数。

总结一下idle与iowait区别,如下:

  1. iowait时间实际上就是CPU空闲时间,Linux上空闲时间有两类,一类是普通的idle,另一类是iowait。
  2. 普通idle与iowait区别是,iowait是CPU空闲时,有任务正在做磁盘io操作,而idle则没有。

iowait高代表io压力大?

iowait指标是从CPU角度看io,但毕竟不是从io层面看的,所以iowait高也不一定代表有问题,如下:

  1. 如果程序迁移到性能更好的CPU上,由于CPU运行代码变快,会导致空闲时间变多,而iowait时间实际上就是空闲时间,所以有时会发现,性能更好的机器上iowait反而更高了。
  2. 比如有这样两个程序,程序A在10s内每1s都做1次io操作,假设io操作需要1s,那么10s内的iowait是100%,而程序的IOPS是1。另一程序B在10s的前1s内并发执行了10次io操作,那么iowait是10%,而程序的峰值IOPS是10。虽然例子比较极端,但这里很明显程序B的IOPS峰值更高,但它的iowait却更低。

虽说iowait并不能准确反映io情况,但它也不是完全没用的,在大多数情况下,iowait高确实代表了io压力大,并且它至少提示了你应该进一步检查一下io情况,这方面iostat、iotop、blktrace等可以做到。

另外,从上面的iowait原理中你会发现,处在iowait的线程,其必定是D状态的(TASK_UNINTERRUPTIBLE),这在之前也提到过,D状态是会影响系统负载的,详细可查看 Linux命令拾遗-理解系统负载

命令实践

stress -d命令可以模拟做大量的磁盘操作,并使用taskset将stress绑定到3号核上运行,如下:

$ taskset --cpu-list 3 stress -d 1 --hdd-bytes 100G
stress: info: [9160] dispatching hogs: 0 cpu, 0 io, 0 vm, 1 hdd

然后使用 mpstat -P ALL 1观察iowait情况,发现3号核iowait高达88%,如下:

Linux命令拾遗-%iowait指标代表了什么?

然后新开一个shell窗口,使用 stress -c命令模拟大量的CPU运算,也使用taskset绑定到3号核上运行,如下:

$ taskset --cpu-list 3 stress -c 1
stress: info: [9178] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd

再次使用 mpstat -P ALL 1观察iowait情况,发现3号核iowait变成了0%,而%usr几乎满载,如下:

Linux命令拾遗-%iowait指标代表了什么?

如果你理解了上面的内容,就能理解这个示例了。
第一次因为只有 stress -d在做io操作,所以CPU基本都是空闲的,而空闲期间基本都是有在做io的任务存在的,所以iowait高。
第二次因为加入 stress -c使得CPU不再空闲,而iowait实际上就是空闲时间,所以iowait自然就变成0了。

当然,如果你有兴趣,还可以试下这两个命令,它们可以将 %sys%nice变成100%,如下:

使得%sys满载
$ taskset --cpu-list 3 dd if=/dev/zero of=/dev/null bs=1M count=1000000

使得%nice满载
$ taskset --cpu-list 3 nice -n 19 stress -c 1

本系列文章索引
Linux命令拾遗-入门篇
Linux命令拾遗-文本处理篇
Linux命令拾遗-软件资源观测
Linux命令拾遗-硬件资源观测
Linux命令拾遗-剖析工具
Linux命令拾遗-动态追踪工具
Linux命令拾遗-理解系统负载
Linux命令拾遗-top中的%nice是啥
Linux命令拾遗-网络抓包工具
Linux命令拾遗-查看系统信息
Linux命令拾遗-常用的辅助开发类命令

往期内容

字符编码解惑
hex,base64,urlencode编码方案对比
mysql的timestamp会存在时区问题?
真正理解可重复读事务隔离级别
不容易自己琢磨出来的正则表达式用法

Original: https://www.cnblogs.com/codelogs/p/16060759.html
Author: 扣钉日记
Title: Linux命令拾遗-%iowait指标代表了什么?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581381/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 实现AES解密的类加载器

    需求 设计 实现 AESClassLoader 测试 需求 一些场景,为了防止 .class文件被反编译得到源代码,需要对 .class文件做加密处理 设计 编译生成 .class…

    Java 2023年6月9日
    092
  • Spring AntPathMatcher

    Spring AntPathMatcher AntPathMatcher是用来对资源路径或者url的字符串做匹配使用的。采用的是Ant风格的格式 Ant风格的资源地址支持3中匹配 …

    Java 2023年6月7日
    081
  • 狂神说笔记——MyBatisPlus快速入门24

    MyBatisPlus快速入门 需要的基础: MyBatis Spring SpringMVC 是什么? MyBatis 本来就是简化 JDBC 操作的! 官网:https://b…

    Java 2023年5月30日
    085
  • 设计模式-代理模式

    概念:二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标 方法的时候,不再是直接对目标方法进行调用,而是通过代理类 间接调用。让不属于目标方…

    Java 2023年6月16日
    058
  • Manjaro的安装(折)和配置(腾)[未完]

    安装前你需要知道 附带的一些东西(浏览一下,如果已经知道直接跳到下一节) Win10/8.x关闭快速启动 鼠标右键单击”开始菜单”,选择”电源选…

    Java 2023年6月7日
    091
  • H3CNE学习笔记

    1.IP的主要作用 2.IP网络的结构 3.路由器和交换机的选择 路由器通常用来连接多个网段(路由器的一个接口相当于一个网段) 交换机通常用来连接多个PC机形成一个网段 4.sou…

    Java 2023年6月6日
    081
  • element-ui 提示框 确认按钮在左 取消按钮在右

    添加 //取消按钮 样式 cancelButto…

    Java 2023年6月9日
    075
  • java类型转换的例子

    犹由于java是强类型语言,所以进行一些运算的时候,必须进行类型转换运行中不同类型数据先转为同一类型再进行运算 /*注意点:1.不能对布尔值进行转换2.不能把对象类型转换为不相干的…

    Java 2023年6月6日
    071
  • 22.2.11爬虫基础和数据解析

    find_all和find的使用:1、在提取标签的时候,第一个参数是标签的名字。如果在提取标签的时候想要使用标签属性进行过滤,那么可以在这个方法中通过关键字参数的形式,将属性的名字…

    Java 2023年6月13日
    064
  • nginx重新整理——————nginx 的设计模型[八]

    前言 简单介绍一下nginx的设计模型,对我们设计程序还是有一定帮助的。 正文 这里先列一下模型哈,后面有深入篇,介绍的比较清楚。 nginx 的处理模型: nginx 进程模型:…

    Java 2023年5月30日
    074
  • Tinker Flutter热修复

    在Android里面,Flutter打包之后的产物是一个.so文件(libapp.so),Tinker热更新支持so文件更新,自然也就支持Flutter热更新。 理论上这样就可行了…

    Java 2023年5月30日
    0102
  • 国庆节,零代码帮你搞定假期美食菜单

    当国庆假期遇上美食 每一口都唇齿留香 特色美食太多,不知道吃什么? AppCube带你一分钟搞定假期美食 来一场舌尖上的旅行 零代码,让假期生活有滋有味 国庆小长假,三五好友结伴出…

    Java 2023年6月15日
    069
  • springboot 中事件监听模型的一种实现

    定义事件本身 定义事件源 定义监听者 一、需要实现 ApplicationListener 二、使用 @EventListener 注解 测试 项目结构 前言: 事件监听模型是一种…

    Java 2023年6月16日
    081
  • 【Java】【51】Quartz定时器

    前言: 但是,有的时候我们的任务是动态的。比如,可以在后台添加任意个数任意时间的推送短信任务,任务没有开始之前,可以更改推送时间。这就需要用到Quartz动态添加、修改和删除定时任…

    Java 2023年5月29日
    071
  • HM2022ssm-mp1【MyBatisPlus简介与入门案例】

    简介 MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率 通过刚才的案例,相信大家能够体会简化开发和提高效率这两个方面的优点。…

    Java 2023年6月5日
    087
  • Java是编译型语言还是解释型语言

    Java是编译型语言还是解释型语言 答案:java既是编译型语言,也是解释型语言。 你可以说它是编译型的。因为所有的Java代码都需要经过javac编译为.class文件,但主要是…

    Java 2023年6月13日
    053
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球