什么等等? I/O Wait ≠ I/O 瓶颈?

news2024/11/26 3:47:34

本文地址:什么等等? I/O Wait ≠ I/O 瓶颈? | 深入浅出 eBPF

  • 1. I/O Wait 定义
  • 2. 测试验证
  • 3. 进一步明确磁盘吞吐和读写频繁进程
  • 4. 内核 CPU 统计实现分析
  • 5. 总结
  • 参考资料

1. I/O Wait 定义

I/O Wait 是针对单个 CPU 的性能指标,表示当 CPU 分发队列(在睡眠态)里有线程被阻塞在磁盘 I/O 上时消耗的空闲时间。CPU 的空闲时间划分成无所事事的真正空闲时间和阻塞在磁盘 I/O 上的时间。较高的 CPU I/O Wait 时间表示磁盘可能存在瓶颈,导致 CPU 等待而空闲。如果你看到这个定义,有点雾中看花的感觉,那么请移步往后,相信你看完本文的测试验证过程,再回来读上述定义的时候一定会有不同的认识。

2. 测试验证

本地测试验证环境为:Ubuntu 22.04, CPU 12 核,内核 6.2.0-34-generic

$ cat /proc/cpuinfo |grep processor|wc -l
12

我们通过 sysbench 工具进行对应压测验证,同时观察对应的 I/O Wait 的表现。注意为了更好体现效果,我们测试 I/O 的过程中,将 threads 设置为 CPU 的全部核数的 50%(本文为 --threads=6

$ sudo apt-get update 
$ sudo apt install sysbench

# 提前准备测试的数据
$ sysbench  --threads=6 --time=0 --max-requests=0  fileio --file-num=1 \
	--file-total-size=10G --file-io-mode=sync --file-extra-flags=direct \
	--file-test-mode=rndrd run prepare

# 运行压测
$ sysbench  --threads=6 --time=0 --max-requests=0  fileio --file-num=1 \
	--file-total-size=10G --file-io-mode=sync --file-extra-flags=direct \
	--file-test-mode=rndrd run
...
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random read test
Initializing worker threads...

Threads started!

在运行 I/O 压测过程中,我们使用 top 命令查看 CPU 占用情况,可以看到 wa (I/O wait)值展示,图中为 38.3 %:

b53e1bc14c2e2acc911b355c1cff92dc

看到这里,给我们的感觉是 CPU I/O Wait 使用应该正确展示出了 I/O wait 的 CPU 使用情况。在我们一直保持 sysbench I/O 测试的同时,同时启动一个 CPU 密集类型的测试,然后我们观测 top 中的 wa 的值。这里测试我们设置使用所有的 CPU 核数。

1
$ sysbench --threads=`grep processor /proc/cpuinfo|wc -l` --time=0 cpu run

208a97d04ca69e6f6426d6641386cd2f

发生了什么,有没有觉得神奇,wa 变为了 0.0?给我们的感觉是 I/O 的瓶颈完全消失了?难道运行系统中的 I/O 压力突然消失了?我们可以注意到在运行的进程中两个 sysbench 进程在运行,分别对应于 I/O 和 CPU 测试的进程,所以实际运行情况看,I/O 的瓶颈仍然存在。

因此,I/O Wait 高能够表明系统中有许多进程在等待磁盘 I/O,但即使 I/O Wait 低甚至为 0,磁盘 I/O 也可能成为系统上某些进程的瓶颈。

结合我们上述的测试, I/O Wait 好像并不可靠,那么我们使用什么来提供更好 I/O 的可见性? 我们可以使用 vmstat 工具来进行查看。

在运行 I/O 和 CPU 负载的同时,我们使用 vmstat 工具观测,同时在一定时间测试后我们停掉 CPU 负载测试的 sysbench 进程,下图我们可以明显看到停止前后的效果对比趋势。

1b6bdde712f44cbbad2e97cc49c1eb8a

首先,我们可以发现 wa 列在运行 CPU 负载测试前后的变化比较明显,首列中的 r 的数据也得到了对应的体现(r 表示运行的任务数,运行 CPU 负载测试时的值为 12)。

15b628ce5fef0c35cc91208a3af1cef9

vmstat 展示数据中的 “b” 列代表的是对应于磁盘 I/O 上阻塞的进程,我们可以看到在运行 CPU 负载 sysbench 前后该值基本保持在 6 左右, 6 正是我们在运行 I/O 测试时候指定的 sysbench 中对应的 --threads=6 。该列值表明,即使在 wa 为 0.0 时,系统运行中仍然存在 6 个进程在等待 I/O。

fa1f24a7768d04a8dcb0dac2a419e01c

3. 进一步明确磁盘吞吐和读写频繁进程

在通过 vmstat b 列确定存在进程 I/O 等待情况后,我们也可以使用 iostat 和 iotop 进行进一步定义。

iostat 1 nvme0n1

nvme0n1 为本地磁盘

a921d64010d80eb7977092be6a3a3e8c

其中

  • tps:每秒事务数(IOPS)
  • kB_read/s、kB_wrtn/s : 每秒读取的 KB 数和每秒写入的 KB 数量

iotop 工具可快速定位到当前系统中读写频繁的进程信息。

3cacbc9f87bdce0a9fe755f60a3efbf2

4. 内核 CPU 统计实现分析

在通过上述分析以后,我们尝试从内核代码实现维度进行简单分析(内核代码代码版本 6.2.0 ):

cputime.c#L483

void account_process_tick(struct task_struct *p, int user_tick)
{
	u64 cputime, steal;

	if (vtime_accounting_enabled_this_cpu())
		return;

	if (sched_clock_irqtime) {
		irqtime_account_process_tick(p, user_tick, 1);
		return;
	}

	cputime = TICK_NSEC;
	steal = steal_account_process_time(ULONG_MAX);

	if (steal >= cputime)
		return;

	cputime -= steal;

  // 1. 如果当前进程处于用户态,那么增加用户态的 CPU 时间
	if (user_tick) 
		account_user_time(p, cputime);
  // 2. 如果前进程处于内核态,并且不是 idle 进程,那么增加内核态 CPU 时间
	else if ((p != this_rq()->idle) || (irq_count() != HARDIRQ_OFFSET))
		account_system_time(p, HARDIRQ_OFFSET, cputime);
  // 3. 如果当前进程是 idle 进程,那么调用 account_idle_time() 函数进行处理
	else
		account_idle_time(cputime);
}

account_idle_time 函数是统计当前 CPU 空闲的实现,可以看到如果 CPU 上有 nr_iowait 的值不为 0, 空余时间则会统计到 iowait 中,否则则会统计到 idle 列中。

cputime.c#L218

void account_idle_time(u64 cputime)
{
	u64 *cpustat = kcpustat_this_cpu->cpustat;
	struct rq *rq = this_rq();

  // 1. 如果当前有进程在等待 I/O 请求的话,那么增加 iowait的时间
	if (atomic_read(&rq->nr_iowait) > 0)
		cpustat[CPUTIME_IOWAIT] += cputime;
  // 2. 否则增加idle的时间
	else
		cpustat[CPUTIME_IDLE] += cputime;
}

通过代码我们可以明确看到,如果系统处于 I/O wait 状态,那么必须满足以下两个条件:

  1. 当前 CPU 中存在等待 I/O 请求完成的进程。
  2. 当期 CPU 处于空闲状态,也就是说没有可运行的进程。

5. 总结

经过上述测试,我们可以看到 I/O Wait 可能是一个令人非常困惑的指标。如果 CPU 密集型的进程运行,I/O Wait 的值可能会降低,但是尽管 I/O Wait 指标下降了,但磁盘 I/O 仍然和原来一样阻塞进程执行。所以在判断是否存在 I/O 瓶颈时,我们不能简单依靠 I/O Wait 值的高低来断定系统是否存在 I/O 瓶颈。

相信读完这篇文档的童鞋们,后续再也不会跳进 I/O Wait 指标的坑里了,那么这也就是本文的价值所在了。

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

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

相关文章

使用Python实现发送Email电子邮件【第19篇—python发邮件】

文章目录 👽使用Python实现发送Email电子邮件🎶实现原理🏃Python实现发送Email电子邮件-基础版👫实现源码🙆源码解析 💇Python实现发送Email电子邮件-完善版👫实现源码🙆源码解析&am…

【贪心】单源最短路径Python实现

文章目录 [toc]问题描述Dijkstra算法Dijkstra算法应用示例时间复杂性Python实现 个人主页:丷从心 系列专栏:贪心算法 问题描述 给定一个带权有向图 G ( V , E ) G (V , E) G(V,E),其中每条边的权是非负实数,给定 V V V中的一个…

婚庆婚礼策划服务网站建设的效果如何

品牌效应越来越重要,婚庆行业在多年的发展下,部分区域内也跑出了头部品牌,连锁门店也开了很多家,无论新品牌还是老品牌在新的区域开店总归少不了线上线下的宣传,虽然几乎每个人都会接触婚庆服务,但因为市场…

HarmonyOS构建第一个JS应用(FA模型)

构建第一个JS应用(FA模型) 创建JS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&#xf…

操作系统——进程管理算法和例题

1、概述 1.1 进程调度 当进程的数量往往多于处理机的个数,出现进程争用处理机的现象,处理机调度是对处理机进行分配,就是从就绪队列中,按照一定的算法(公平、髙效)选择一个进程并将处理机分配给它运行&am…

各种边缘检测算子的比较研究

边缘检测算子比较研究 文章目录 边缘检测算子比较研究一、引言1.1 边缘检测的重要性1.2 研究背景与意义1.3 研究目的和论文结构 二、文献综述2.1 边缘检测概述2.2 Roberts、Prewitt、Sobel、Laplacian 和 Canny 算子的理论基础和历史2.2.1 **Roberts算子:**2.2.2 **…

给定一个数列,每一次操作可以使a[i]变成x,y,满足x + y = a[i] + k, 求使所有数字相同的最少操作次数

题目 思路&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long const int maxn 2e5 5; int a[maxn], b[maxn], c[maxn]; void solve(){int n, k;cin >> n >> k;int g 0;for(int i 1; i < n; i){cin >> a[i];a[i] …

“FPGA+MDIO总线+UART串口=高效读写PHY芯片寄存器!“(含源代码)

1、概述 前文对88E1518芯片的端口芯片及原理图进行了讲解&#xff0c;对MDIO的时序也做了简单的讲解。本文通过Verilog HDL去实现MDIO&#xff0c;但是88E1518芯片对不同页的寄存器读写需要切换页&#xff0c;无法直接访问寄存器&#xff0c;如果通过代码读写某些固定寄存器的话…

华为HCIA认证H12-811题库新增

801、[单选题]178/832、在系统视图下键入什么命令可以切换到用户视图? A quit B souter C system-view D user-view 试题答案&#xff1a;A 试题解析&#xff1a;在系统视图下键入quit命令退出到用户视图。因此答案选A。 802、[单选题]“网络管理员在三层交换机上创建了V…

揭秘NCO:数字领域的音乐之旅

好的&#xff0c;让我们更详细地解析NCO的数学奥秘&#xff0c;深入探讨数字音乐的乐谱。在我们深入数学公式之前&#xff0c;让我们回顾一下&#xff0c;NCO就像是一位神奇的音符设计师&#xff0c;创造数字音乐的灵感源泉。 NCO&#xff1a;数字音符的魔法创造者 NCO&#x…

AI日报:2024年人工智能对各行业初创企业的影响

欢迎订阅专栏 《AI日报》 获取人工智能邻域最新资讯 文章目录 2024年人工智能对初创企业的影响具体行业医疗金融服务运输与物流等 新趋势 2024年人工智能对初创企业的影响 2023年见证了人工智能在各个行业的快速采用和创新。随着我们步入2024年&#xff0c;人工智能初创公司正…

lv13 环境搭建SD卡启动

一、制作SD卡启动盘 1.1 方法1&#xff1a;在Linux下制作 一、准备好烧录脚本 cd ~/fs4412 ​ unzip sdfuse_q.zip ​ cd sdfuse_q ​ chmod x *.sh 二、将SD卡插入USB读卡器&#xff0c;并连接到虚拟机 或者 一般识别的sd卡会在dev目录下显示sdb 三、烧录 cp ../u-boot-f…

Qt 网络编程

QT 网络编程 TCP 编程 模块引入 QT network 头文件 #include <QTcpServer> // TCP服务器端使用 #include <QTcpSocket> // TCP服务器和客户端都使用 编程流程 服务端 1&#xff09;实例化 QTcpServer 对象 -----------------------------> socket 2&#x…

Python~字典快速上手

目录 Key的重要性 一 创建字典{} 二 字典用key查找 in(遍历)和[]用key查找 keyerror in和[]的效率对比 三 字典的插入/修改/删除(先查找) ​编辑 四 字典增删查改/遍历的效率 五 字典的遍历 for遍历可迭代对象拿到key 与创建顺序相同 keys/values/items方法 六 可…

基于Java+SpringBoot+MyBatis-plus+Vue前后端分离小区管理系统设计与实现2.0

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

抖店一件代发实操,干货满满!

我是电商珠珠 没有货源的新手&#xff0c;在店铺刚开始的时候可以搞无货源模式&#xff0c;也就是一件代发&#xff0c;去搬运别人店铺的商品到自己店铺&#xff0c;再去利用信息差去赚取差价。 很多人不知道具体要怎么做&#xff0c;今天我就来给大家讲一讲。 一、入驻 入…

NNDL 作业12-优化算法2D可视化 [HBU]

老师作业原博客地址&#xff1a;【23-24 秋学期】NNDL 作业12 优化算法2D可视化-CSDN博客 目录 简要介绍图中的优化算法&#xff0c;编程实现并2D可视化 1. 被优化函数 ​编辑 深度学习中的优化算法总结 - ZingpLiu - 博客园 (cnblogs.com) SGD: Adagrad: RMSprop: Mom…

Unity新动画系统之动画层和动画遮罩

Unity新动画系统之动画层和动画遮罩 一、介绍二、动画骨骼遮罩层使用第一种就是create一个avatar Mask,如下&#xff1a;第二种遮罩&#xff0c;就是直接在动画剪辑的属性上更改&#xff0c;如图一为humanoid类型的动画剪辑属性&#xff1a; 一、介绍 之前分享过FSM动画控制系…

消息队列之关于如何实现延时队列

一、延时队列的应用 1.1 什么是延时队列&#xff1f; 顾名思义&#xff1a;首先它要具有队列的特性&#xff0c;再给它附加一个延迟消费队列消息的功能&#xff0c;也就是说可以指定队列中的消息在哪个时间点被消费。 延时队列在项目中的应用还是比较多的&#xff0c;尤其像…

orangepi5plus刷自编译armbian系统

准备好一个编译主机&#xff0c;配置尽量高一点。尽可能有上google的环境配置。 主要步骤 1. 克隆源码 armbian源码仓库 2. 配置apt源 更改/etc/apt/sources.list为国内源&#xff0c;比如我这里ubuntu主机配置清华源。 然后执行apt-get -y update && apt-get -y…