聊聊 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/5903https://blog.popkx.com/linux系统top命令中的iowait究竟是什么意思/https://www.linfo.org/process_state.htmlhttps://blog.pregos.info/wp-content/uploads/2010/09/iowait.txt

进程和 CPU 状态

我们首先要搞清楚进程的状态和 CPU 状态。

进程可以分为下面几种状态:

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

CPU 一共有四种状态,在任一时刻,CPU 的状态都是四种中的一种。这四种状态是:user,sys,idle,iowait 。比如 sar、top会用百分比表示 CPU 分别处于这四种状态的时间,这四种状态相加的结果是 100%。

上面提到的 4 种 CPU 状态,其实只有 2 种:

  1. 工作/忙碌(busy)
  2. 非工作/空闲(idle)

其中 busy 状态下又分成了:

  1. user:表示 CPU 目前正在执行用户空间的代码
  2. system:表示 CPU 目前正在执行内核空间的代码

idle 状态下又分成了:

  1. idle:系统中没有 R 状态的进程了
  2. 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 了,与此同时 ussy 的时间占比接近 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 高:

  1. 系统存在 I/O 性能问题:系统正在做的工作,大部分时间都是在等待 I/O 了。
  2. 有进程因为等待 I/O 操作而阻塞,但这并不意味着系统不可以运行其他进程。

4)系统 iowait 低不能说明进程没有阻塞在 I/O 上。因为 CPU 在 iowait 状态的时候能执行其他进程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2979410.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

mac电脑搭建vue环境(上篇)

第一步:mac电脑要有homebrew,如何安装homebrew 点击下方 MAC安装homebrew-CSDN博客 第二步:homebrew安装node.js 第三步:安装npm 第四步:安装webpack 第五步:安装vue脚手架 第六步:可以在…

深入解析YOLOv2

深入解析YOLOv2 引言 目标检测是计算机视觉中的一个核心问题,它旨在识别图像中所有感兴趣的目标,并给出它们的类别和位置。近年来,随着深度学习技术的发展,目标检测领域取得了巨大的进步。YOLO(You Only Look Once&a…

Python-VBA函数之旅-input函数

目录 一、input函数的常见应用场景: 二、input函数使用注意事项: 三、如何用好input函数? 1、input函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页:神奇夜光杯-CSDN博…

Git命令行操作(本地操作)

入口 1、任意目录》鼠标右键》Open Git Bash here 2、桌面快捷方式 本地库初始化 在本地库项目文件夹执行命令:git init 验证是否执行成功 .git目录中存放的是本地库相关的子目录和文件,不要删除、修改 设置签名 1、形式 用户名:tom Email地址:GoodMorning@qq.com 2、作…

cdp集群主节点根目录磁盘扩容

查看挂载点 df -h可以看到,根目录容量只有37G,现在对根目录进行扩容 查看根目录挂载的磁盘大小 lsblk挂载磁盘名字为vda,磁盘容量有80G,现在磁盘使用量为vda下面三个分区vda1,vda2,vda3容量之和&#xf…

AI测试干货!实例讲解AI自动生成测试用例

1.引言 在软件开发过程中,测试用例的生成是至关重要的一步。测试用例是用于验证软件功能、性能和安全性的具体测试方法,是确保软件质量的关键手段。 随着人工智能(AI)技术的发展,基于AI的测试用例生成技术逐渐成为未…

报销管理如何秒变高效神器?

一、客户介绍 易快报作为业界知名的企业报销管理平台,一直致力于为企业提供高效、便捷的报销服务。随着业务的不断扩展,易快报面临着与多个外部系统进行数据交互的需求,以提升工作效率和减少数据差错。中信建投作为国内领先的金融机构&#…

Docker镜像与容器操作

一、Docker 镜像操作 1.1 搜索镜像 格式:docker search 关键字 docker search nginx 1.2 获取镜像nginx 格式:docker pull 仓库名称[:标签] 如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest…

DOM4标准的事件监听与滚屏优化

EventTarget.addEventListener() 我们在学习addEventListener()时都只是知道它是用来给事件注册事件处理函数的。但是这种描述并不是很准确,MDN上给我们准确的描述了它的定义。EventTarget.addEventListener()方法将指定的监听器注册到EventTarget上,当…

字符长、看不懂、费率飙升|Runes协议上线后发生了什么?

作者:比特里里 X/推:lilyanna_btc 1、字符数长了,单词都完整了,反而看不懂了 由于 Runes 协议的字符长度限制,大部分的票都在 13 个字符及以上,人名、域名、slogan,各类玩法都出来了。很多人适…

文本向量化模型新突破——acge_text_embedding勇夺C-MTEB榜首

在人工智能的浪潮中,以GPT4、Claude3、Llama 3等大型语言模型(LLM)无疑是最引人注目的潮头。这些模型通过在海量数据上的预训练,学习到了丰富的语言知识和模式,展现了出惊人的能力。在支撑这些大型语言模型应用落地方面…

JS----前端不同格式的 UUID生成

前端 UUID生成 export const generateUUID () > {let timestamp new Date().getTime()let performanceNow (typeof performance ! undefined && performance.now && performance.now() * 1000) || 0return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replac…

免费好用的AI绘画生成器推荐,建议收藏!

AI绘画生成器可以根据设计师的需求生成各种风格、主题的绘画作品,无论是现代抽象,还是古典风景,都能应有尽有。任何人只需几步简单操作,都可以轻松使用这款工具,就能生成出令人惊艳的作品。那么免费好用的AI绘画生成器…

docker部署通义千问-7B-Chat的openai-api环境

服务器环境: 显卡驱动:Driver Version: 530.30.02 CUDA版本:CUDA Version: 12.1 显卡:NVIDIA GeForce RTX 3090共4张 注意:最好把显卡驱动升级到530,CUDA版本之前使用11.7有问题。 一、下载模型文件 …

Linux之安装Nginx

目录 传送门前言一、快速安装二、反向代理语法1、基本语法2、location语法1. 基本语法2. 匹配规则3. 修饰符4. 权重5. 嵌套location6. 其他指令7.案例 三、配置反向代理 传送门 SpringMVC的源码解析(精品) Spring6的源码解析(精品&#xff0…

2024年深圳杯东三省数学建模联赛A题论文首发第二种思路

深圳杯A题论文代码分享资料链接:链接:https://pan.baidu.com/s/1L2NVgoefSW-yuqZjEB3wcw 提取码:sxjm 问题一 数据转换: 首先,我们将监测站的经纬度坐标转换为基于米的笛卡尔坐标系。这是因为在地面上的大尺度距离…

selenium‘拟人包装‘设置

1、设置header,proxy 1.1关于user-agent 输入about:version 找到user-agent: import requests # 引用requests库 from selenium import webdriver#载入浏览器驱动#header,proxy设置 optionswebdriver.ChromeOptions()#实例化浏览器参数设置options.add_argument…

探索深度与广度的平衡:迭代加深深度优先搜索技术解析

探索深度与广度的平衡:迭代加深深度优先搜索技术解析 迭代加深深度优先搜索(IDDFS)的基本原理伪代码C语言实现讨论结论 迭代加深(Iterative Deepening Depth-First Search, IDDFS)是一种用于解决搜索问题的方法&#x…

解决配置Tomcat时,找不到war和war exploded问题

解决配置Tomcat时,找不到war和war exploded问题 文章目录 解决配置Tomcat时,找不到war和war exploded问题前言一、解决方法:1. war exploded2. war 总结 前言 提示:以下是本篇文章正文内容: 一、解决方法:…

spring的跨域问题

跨域问题 什么是跨域解决跨域 什么是跨域 跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。如果出现了以下情况中的任意一种,那么它就是跨域请求: 1、协议不同,如 http 和 h…