如何理解 iowait

article/2025/4/26 0:29:55

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 空闲时间的一种表现形式


http://chatgpt.dhexx.cn/article/gmL0JpJ2.shtml

相关文章

Mysql的IO介绍及原因详解

有输入输出类型的交互系统都可以认为是I/O系统。 目录 一、IO操作 二、IO成本 三、IO分类 四、Mysql网络层IO(网络IO) 五、Mysql存储IO(磁盘IO) 一、IO操作 在计算机系统中I/O就是输入(Input)和输出(Outp…

IO概念

IO概念和五种IO模型 一、什么是IO? 我们都知道unix世界里、一切皆文件、而文件是什么呢?文件就是一串二进制流而已、不管socket、还是FIFO、管道、终端、对我们来说、一切都是文件、一切都是流、在信息交换的过程中、我们都是对这些流进行数据的收发操…

顺序IO和随机IO

顺序IO和随机IO 什么是顺序IO和随机IO如何解决随机IO造成的性能损失?问题什么是IOPS?机械硬盘和固态硬盘在随机IO上性能的影响因素?SSD作为随机存储设备,其访问任意一块的时间应该是相等的,为什么顺序IO还是快于随机IO? 什么是顺…

绘图工具-draw.io

draw.io是一个可配置的图表/白板可视化应用程序。draw.io 由英国软件公司JGraph Ltd拥有和开发。这是一个开源项目(但对贡献是封闭的),github链接:https://github.com/jgraph,可以绘制流程图、UML、类图、组织结构图、…

什么是IO Pad?

1.什么是IO pad? IO pad是一个芯片管脚处理模块,即可以将芯片管脚的信号经过处理送给芯片内部,又可以将芯片内部输出的信号经过处理送到芯片管脚。输入信号处理包含时钟信号,复位信号等,输出信号包含观察时钟、中断等…

Drawio使用简介(慢慢更新中)

drawio是一款强大、免费的绘图工具(基本可以替代收费的visio等),使用起来非常方便。支持网页版使用(网页版可以自己部署一套)以及客户端使用(支持windows,MacOS以及Linux)。 该项目…

计算机io接口主要功能,io接口的功能是什么

IO接口又称为输入输出接口,是信息处理系统与外部世界之间的通信。输入是系统接收的信号或数据,输出是从其发送的信号或数据。该术语也可以用作行动的一部分; 到“执行I / O”是执行输入或输出操作。 IO 接口,又称为输入输出接口,是信息处理系统(例如计算机)与外部世界(可能是人…

到底什么是IO

IO 作为操作系统的核心知识之一, 无论是在本机、传统的单体应用、还是分布式系统中,都有非常重要的地位. 今天就和大家系统地聊一聊 IO 相关的东西. IO IO,Input/Output 简写,是指内存和外设之间的数据复制的过程. 输入是指数据从外设复制到内存中, 输…

一文掌握 IO 基础知识与概念

💞哈喽!大家好,我是HappyGirl快乐女孩💞 😜是一位爱好技术的【技术Fans】!😜 💞💞💞 如果有对技术感兴趣的宅友,欢迎关注💞&#x1f4…

韦东山freeRTOS系列教程之【第三章】任务管理

文章目录 系列教程总目录概述3.1 基本概念3.2 任务创建与删除3.2.1 什么是任务3.2.2 创建任务3.2.3 示例1: 创建任务3.2.4 示例2: 使用任务参数3.2.5 任务的删除3.2.6 示例3: 删除任务 3.3 任务优先级和Tick3.3.1 任务优先级3.3.2 Tick3.3.3 示例4: 优先级实验3.3.4 示例5: 修改…

FreeRTOS教程——定时器(二)

Free RTOS定时器 一、概念 一、概论 软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器 调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期, 简而言之,当定时…

韦东山freeRTOS系列教程之【第二章】内存管理

文章目录 教程目录2.1 为什么要自己实现内存管理2.2 FreeRTOS的5种内存管理方法2.2.1 Heap_12.2.2 Heap_22.2.3 Heap_32.2.4 Heap_42.2.5 Heap_5 2.3 Heap相关的函数2.3.1 pvPortMalloc/vPortFree2.3.2 xPortGetFreeHeapSize2.3.3 xPortGetMinimumEverFreeHeapSize2.3.4 malloc…

FreeRTOS学习记录(安富莱FreeRTOS教程摘录)

FreeRTOS学习资料: 安富莱论坛FreeRTOS教程 FreeRTOS源码下载链接 第1章 为什么选用FreeRTOS 1.1 FreeRTOS优势 FreeRTOS优势 最大的优势就是开源免费,商业使用的话不需要用户公开源代码,也不存在任何版权问题,是当前小型嵌入…

STM32 FreeRTOS系列教程(一)FreeRTOS简介

参考资料:《正点原子STM32F4 FreeRTOS开发手册_V1.1》《野火FreeRTOS 内核实现与应用开发实战—基于STM32》 学习RTOS的意义 当我们进入嵌入式这个领域的时候,往往首先接触的都是单片机编程,单片机编程又 首选51 单片机来入门。这里面说的单…

FreeRTOS使用教程(配合CubeMX)

FreeRTOS使用教程(配合CubeMX) 一、CubeMX配置 在选择后单片机芯片后,在Middleware中选择FREERTOS的CMSIS_V1版本即可在工程开启FreeRTOS。 关于FreeRTOS的具体配置一般集中在Kernel Setting中。具体参数一般可以默认,有特殊需求…

【STM32】STM32CubeMX使用FreeRTOS教程1----定时器学习

【STM32】STM32CubeMX使用FreeRTOS教程1----定时器学习 前言 本教程将对应外设原理,HAL库、STM32CubeMX和FreeRTOS结合在一起讲解,分析学习过程中遇到的问题和一些注意事项。 知识概括: SMT32定时器原理 STM32CubeMX创建定时器例程 HAL库…

[FreeRTOS系列教程]学习FreeRTOS前的准备工作-----初学者必看

转自:http://bbs.armfly.com/read.php?tid1552 转载说明:本文仅为转载,下面有几位同学询问对应的教程,教程请参考下面的链接,是以帖子的形式分章节说明。 http://bbs.armfly.com/thread.php?fid14&type29&…

FreeRTOS基本教程零:STM32 FReeRTOS 移植流程

一、资料准备 FreeRTOS源码下载地址: https://github.com/FreeRTOS/FreeRTOShttps://github.com/FreeRTOS/FreeRTOS我移植的是FreeRTOSv9.0.0 stm32裸机程序: 二、FreeRTOS目录 一共有三个文件夹 其中Demo文件夹中是FreeRTOS的例程,Licen…

基于STM32的实时操作系统FreeRTOS移植教程(手动移植)

前言:此文为笔者FreeRTOS专栏下的第一篇基础性教学文章,其主要目的为:帮助读者朋友快速搭建出属于自己的公版FreeRTOS系统,实现后续在实时操作系统FreeRTOS上的开发与运用。操作系统的学习与运用可以说是每位嵌入式开发工程师必须…

STM32F103--移植FreeRTOS完整教程

最近按照正点原子教程开始学习FreeRTOS,发现其手册的移植教程中有些地方可能不是那么详细,在此基于正点原子做一期最完整的FreeRTOS移植教程给大家。 小b将本次教程整理的资料放在网盘,以下链接供各位小伙伴下载和学习: 链接&…