[转帖]如何理解 iowait

如何,理解,iowait · 浏览次数 : 0

小编点评

## %iowait 的含义 %iowait 是一个指标,它表示在一个采样周期内,有百分之几的时间是属于以下情况: * CPU处于空闲状态并且至少有一个未完成的磁盘 I/O 请求 * 每个CPU可以处于以下状态之一: * user * sys * idle * iowait ## %iowait 的统计数据 %iowait 的统计数据包含以下几个关键值: * **%user**:表示在采样周期内,该 CPU 处于用户空间的等待状态的时间比例。 * **%sys**:表示在采样周期内,该 CPU 处于系统空间的等待状态的时间比例。 * **%idle**:表示在采样周期内,该 CPU 处于空闲状态的时间比例。 * **%iowait**:表示在采样周期内,该 CPU 在 I/O 操作中处于等待状态的时间比例。 ## iowait 的瓶颈问题 %iowait 的值会随着 I/O 的并发度而变动。当 I/O 比较少的时候,%iowait 可能很低,甚至接近 0%。当 I/O 比较多的时候,%iowait 就会很快升高到非常高,甚至超过 100%。 如果 %iowait 非常高,这可能意味着系统正在处理多个 I/O 请求,但 CPU 的空闲时间变得过长,从而导致性能下降。 ## 如何确定磁盘IO的瓶颈 可以通过以下指标来确定磁盘IO的瓶颈: * **%iowait**:%iowait 值越高,说明 I/O 等待时间越长。 * **avgrq-sz、avgqu-sz r_await、w_await**:其他指标,如 avgrq-sz、avgqu-sz r_await、w_await,也与 I/O 延迟有关。

正文

Linux中,%iowait 过高可能是个问题,严重的时候,它能使服务停止, 但问题是,多高才算高? 什么时候应该担心呢?

本文将讨论 iowait 的含义、相关的统计数据、原理以及 iowait的瓶颈问题

什么是 iowait

Linux 中的解释

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

iowait 指在一个采样周期内有百分之几的时间是属于以下情况:CPU处于空闲状态并且至少有一个未完成的磁盘IO请求

每个CPU 可以处于以下状态之一: user, sys, idle, iowait , 我们通过 iostat工具可以看到这几个状态的值,它们都是以百分比的形式显示的,CPU 是在这几个状态之间切换,所以这几个值总和是 100%

需要说明一点,上图中的 %sys, %user, %idle, %iowait 的百分比值都是针对所有的 CPU 来说的,统计的是全局的信息,并不是指单个进程的数据

根据 iowait的定义可知, iowait是属于 idle的一个子类,为了便于理解,可以把 iowait 当成一种等待 IO 造成的 idle状态

原理

在内核中,user, sys, idle, iowait 四种状态,每个状态都有一个计数器,一个采样周期内统计每个状态的计数器,最后计算每个计数器占总计数的百分比,结果就是每个状态所占的百分比

当发生时钟中断的时候,内核会检查 CPU 当前的状态,如果 CPU 正在执行内核空间的指令,则 sys 的计数器加 1 ,如果是用户空间的指令,则 user 的计数器加 1

如果 CPU 此时处于 idle 状态,内核会做以下检查

1、是否存在从该 CPU 发起的一个未完成的本地磁盘IO请求

2、是否存在从该 CPU 发起的网络磁盘挂载的操作

    如果存在以上任一情况,则 iowait 的计数器加 1,如果都没有,则 idle 的计数器加 1

    当使用 iostat 工具时,它会读取上述四种计数器的值,间隔玩家指定的秒数后,再次读取计数器的值,取两次的差值就得到了采样周期内计的增量值,我们知道,Linux下每一个时钟 tick 是 10ms,根据间隔的秒数,就可以得到间隔了多少个时钟,而计数器是在每次时钟中断时进行计数,所以用每种状态的计数器的增量值除以总间隔时钟数,就能得到每种状态所占时间的百分比

    假如间隔时间是 1s,则共有 100 个时钟,假如 sys 计数为 2, user 计数为 3,iowait 计数为 0 , idle 计数为 95,则 它们的百分比依次为:2%、 %3、 0%、 95%

    iowait 常见的误解

    有些同学可能对 iowait 的理解有偏差,常见的误解大概有以下几点

    • iowait 表示等待IO完成,在此期间 CPU 不能接受其他任务

    从上面 iowait 的定义可以知道,iowait 表示 CPU 处于空闲状态并且有未完成的磁盘 IO 请求,也就是说,iowait 的首要条件就是 CPU 空闲,既然空闲就能接受任务,只是当前没有可运行的任务,才会处于空闲状态的,为什么没有可运行的任务呢? 有可能是正在等待一些事件,比如:磁盘IO、键盘输入或者等待网络的数据等

    • iowait 高表示 IO 存在瓶颈

    由于 Linux 文档对 iowait 的说明不多,这点很容易产生误解,iowait 第一个条件是 CPU 空闲,也即所有的进程都在休眠,第二个条件是 有未完成的 IO 请求

    这两个条件放到一起很容易产生下面的理解:进程休眠的原因是为了等待 IO 请求完成,而 %iowait 变高说明进程因等待IO 而休眠的时间变长了,或者因等待IO而休眠的进程数量变多了 初一听,似乎很有道理,但实际是不对的

    iowait 升高并不一定会导致等待IO进程的数量变多,也不一定会导致等待IO的时间变长,我们借助下面的图来理解

    上图中,红色表示 CPU繁忙,绿色表示 CPU 空闲

    一个周期内,两个 IO 依次提交,左图的 CPU 一直处于繁忙状态,所以 %iowait 为 0%,右边的 CPU 繁忙时间只有左边的一半儿,另一半时间是空闲时间,因此 %iowait 为 50%,可以看到,IO 并没有变化,%iowait 确升高了,其实是因为 CPU 空闲时间增加了而已

    上图中,一个周期内,CPU 一直处于空闲状态,两个 IO 依次提交,整个周期内始终有 IO 再进行,所以 %iowait 为 100%

    假如系统有能力同时处理多个 IO,现在两个 IO 同时提交

    可以看到,系统处理两个并发 IO 只需要一半儿的时间,此时, %iowait 变成了 50%,其实,如果系统能同时处理 3 个并发 IO 的话,%iowait 依然为 50%

    所以,%iowait 的高低与 IO 的多少没有必然的关系,而是与 IO 的并发度相关,仅根据 %iowait 的上升是不能确定 IO 负载增加的结论

    如何确定磁盘IO的瓶颈

    通过前面的讲述,可以发现 %iowait 包含的信息量还不足以判断出 磁盘IO 是否存在瓶颈

    %iowait 升高,还需要检查下 IO 量是否有明显增加以及avgrq-sz、avgqu-sz r_await、 w_await 等指标有没有增加,实际的操作以及应用有没有明显的变慢,如果都没有的话,应该没什么问题

    avgrq-sz:  向设备发出请求的平均大小(单位:扇区)
    

    avgqu-sz: 向设备发出请求的队列平均长度

    r_await: 向服务设备发出读取请求的平均时间(单位:毫秒)

           包括请求入队的时间以及设备处理请求的时间
    

    w_await: 向服务设备发出写请求的平均时间(单位:毫秒)

           包括请求入队的时间以及设备处理请求的时间
    

      小结

      %iowait的值作为 判断 IO 性能的指标,可能有用,也可能没用,但是它的能告诉我们系统是否还能处理更多的计算任务,例如: 当 iowait 很高时,说明空闲的 CPU 资源较多,还能处理一些计算相关的工作,也就是说,iowait 是 CPU 空闲时间的一种表现形式

      与[转帖]如何理解 iowait相似的内容:

      [转帖]如何理解 iowait

      Linux中,%iowait 过高可能是个问题,严重的时候,它能使服务停止, 但问题是,多高才算高? 什么时候应该担心呢? 本文将讨论 iowait 的含义、相关的统计数据、原理以及 iowait的瓶颈问题 什么是 iowait Linux 中的解释 Show the percentage of t

      [转帖]如何使用Calico实现跨主机Docker网络通信

      https://blog.csdn.net/sanhewuyang/article/details/122004156 写在前面 学习K8s,学到这里,整理记忆,本文用于理解K8s网络中Calico网路方案的原理优缺点内容包括:常见的容器跨主机通信方案简介Caliao实现Container跨主机通信

      【转帖】读懂什么是RDMA

      一.什么是RDMA 1.RDMA主要体现 2.如何理解RDMA和TCP技术的区别? 3.使用RDMA的好处包括: 二.什么是RoCE? 1. RDMA协议包含: Infiniband(IB) 2. 为什么RoCE是目前主流的RDMA协议? RoCEv1 RoCEv2 RoCE,无损先行 一.什么是R

      [转帖]读懂什么是RDMA

      https://blog.csdn.net/tony_vip?type=blog 一.什么是RDMA 1.RDMA主要体现 2.如何理解RDMA和TCP技术的区别? 3.使用RDMA的好处包括: 二.什么是RoCE? 1. RDMA协议包含: Infiniband(IB) 2. 为什么RoCE是目前

      [转帖]删除分区如何不让全局索引失效?

      记得上次ACOUG年会(《ACOUG年会感想》),请教杨长老问题的时候,谈到分区,如果执行分区删除的操作,就会导致全局索引失效,除了使用12c以上版本能避免这个问题外,指出另外一种解决的方式,表面看很巧妙,实则是对分区原理的深入理解。 我们先从实验,了解这个问题,首先创建分区表,他存在4个分区,每个

      [转帖]精华总结:10个问题理解 Linux epoll

      epoll 是 linux 特有的一个 I/O 事件通知机制。很久以来对 epoll 如何能够高效处理数以百万记的文件描述符很有兴趣。近期学习、研究了 epoll 源码,在这个过程中关于 epoll 数据结构和作者的实现思路产生出不少疑惑,在此总结为了 10 个问题并逐个加以解答和分析。 本文基于的

      [转帖]深入理解mysql-第十二章 mysql查询优化-Explain 详解(下)

      我们前面两章详解了Explain的各个属性,我们看到的都是mysql已经生成的执行计划,那这个执行计划的是如何生成的?我们能看到一些过程指标数据吗?实际mysql贴心为我们提供了执行计划的各项成本评估指标的以及优化器生成执行计划的整个过程的方法。 一、查看执行计划计算的成本数据 我们上边介绍的EXP

      [转帖]理解开源安全中的林纳斯定律

      https://linux.cn/article-15344-1.html 林纳斯定律Linus's Law即“只要有足够多的眼睛关注,任何漏洞都无处隐藏given enough eyeballs, all bugs are shallow”。那么林纳斯定律是如何应用于开源软件安全的呢? 这篇文章讨

      [转帖]你真的懂能力圈吗?你之前关于能力圈的理解可能都是错的!

      https://zhuanlan.zhihu.com/p/373501177 一 能力圈的真正定义和本质: 1 能力,是关于什么的能力? 2 边界,是关于什么的边界? 二 构建、确定并坚守自己的能力圈 1 如何构建自己的能力圈? 2 为什么要坚守自己的能力圈? 三 如何安全的扩大自己的能力圈? 能力

      [转帖]Intel PAUSE指令变化如何影响MySQL的性能

      https://zhuanlan.zhihu.com/p/581200704 导读 x86、arm指令都很多,无论是应用程序员还是数据库内核研发大多时候都不需要对这些指令深入理解,但是 Pause 指令和数据库操作太紧密了,本文通过一次非常有趣的性能优化来引入对 Pause 指令的理解,期望可以事半