https://www.cnblogs.com/codelogs/p/16060759.html

简介#

一直以来,我都知道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%,如下:

然后新开一个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几乎满载,如下:

如果你理解了上面的内容,就能理解这个示例了。
第一次因为只有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会存在时区问题?
真正理解可重复读事务隔离级别
不容易自己琢磨出来的正则表达式用法

[转帖]Linux命令拾遗-%iowait指标代表了什么?的更多相关文章

  1. [转帖]Linux命令中特殊符号

    Linux命令中特殊符号 转自:http://blog.chinaunix.net/uid-16946891-id-5088144.html   在shell中常用的特殊符号罗列如下:# ; ;; . ...

  2. [转帖]Linux命令pmap

    Linux命令pmap https://www.cnblogs.com/lnlvinso/p/5272771.html jmap可以查看Java程序的堆内存使用情况,pmap可以查看Linux上运行的 ...

  3. [转帖]linux命令dd

    linux命令dd   dd 是diskdump 的含义 之前学习过 总是记不住 用的还是少. http://embeddedlinux.org.cn/emb-linux/entry-level/20 ...

  4. linux 命令拾遗

    man ascii 这个命令会打印出八进制.十六进制和十进制的ASCII码表. xxd xxd可以生成所给与文件的十六进制拷贝,也可以将编辑好的十六进制拷贝还原成二进制格式.它也可以将十六进制拷贝输出 ...

  5. [转帖]50个必知的Linux命令技巧,你都掌握了吗?

    50个必知的Linux命令技巧,你都掌握了吗? https://blog.51cto.com/lizhenliang/2131141 https://blog.51cto.com/lizhenlian ...

  6. [转帖]linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习)

    linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习) https://www.cnblogs.com/caozy/p/9261224.html 总结的挺好的 ...

  7. 【转帖】Linux命令行操作json神器jq

    Linux命令行操作json神器jq https://www.cnblogs.com/chenqionghe/p/11736942.html jq类似一个awk或grep一样的神器,可以方便地在命令行 ...

  8. Linux命令自己总结

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...

  9. 开发必备linux命令大全-稳赚不亏

    我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须.接下来将一一详细介绍一些常用的linux的命令 文件操作 远程登录与操作 磁盘挂载 进程管理 启动和结束 系统性能参数查看 ...

  10. 每天一个linux命令(46):vmstat命令

    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深 ...

随机推荐

  1. 跟我学ModelArts丨探索ModelArts平台个性化联邦学习API

    摘要:ModelArts提供了一个实现个性化联邦学习的API--pytorch_fedamp_emnist_classification,它主要是让拥有相似数据分布的客户进行更多合作的一个横向联邦学习 ...

  2. 第三方测评:GaussDB(for Redis)稳定性与扩容表现

    摘要:本文将通过采用Redis Labs推出的多线程压测工具memtier_benchmark对比测试下GaussDB(for Redis) 和原生Redis的特性差异 本文分享自华为云社区<墨 ...

  3. 在Linux(CentOS7)服务器上安装Java的JDK

    一.介绍 最近,我在做有关CI/CD的测试,真是一步一个坑啊,碰得我头破血流,这么难得的经验,必须记录下来,以防以后想找却找不到.说道CI/CD最好的工具,大家肯定是一致推荐Jenkins,对了,我现 ...

  4. Kubernetes(K8S) 常用命令

    Docker 常用命令 Docker 常用命令 # 查看API版本 [root@k8smaster ~]# kubectl api-versions # 重启 K8S [root@k8smaster ...

  5. docker-compose部署SpringCloud

    1.安装 docker-compose 将 docker-compose-Linux-x86_64 传到  /usr/local/bin 目录下,并改名为 docker-compose 2.设置权限  ...

  6. AliSSR 语音超分算法:让在线会议语音更明亮更自然

    超分让在线会议语音更明亮,在线会议已成为日常工作中较为普遍的沟通交流方式,接入会议的方式也呈现多样化,比如电脑入会.手机入会又或是电话入会. 雪雅.曜辰|作者 众所周知,高采样率且高带宽的音频信号富含 ...

  7. PS 独立集中标识下修改项目采购类型增强

    1.当物料独立集中标识为2,采购类型通过BAPI:BAPI_NETWORK_COMP_ADD,type_of_pur_resv传入'7',则报错"组件分配并不是未销售订单或项目库存而设的&q ...

  8. Codeforce 318A - Even Odds(数学水题)

    Being a nonconformist, Volodya is displeased with the current state of things, particularly with the ...

  9. 4.0 《数据库系统概论》数据库安全性详解---(存取控制、DAC&MAC、视图机制、审计Audit....)

    前言 本篇文章学习书籍:<数据库系统概论>第5版 王珊 萨师煊编著 视频资源来自:数据库系统概论完整版(基础篇+高级篇+新技术篇) 由于 BitHachi 学长已经系统的整理过本书了,我在 ...

  10. 深入理解 Serverless 计算的并发度

    作者|西流(阿里云技术专家) 背景 2019 年 Berkeley 预测 Serverless 将取代 Serverful 计算[1],成为云计算的计算新范式.Serverless 为应用程序开发提供 ...