Redian新闻
>
系统性能分析之|iowait是什么?

系统性能分析之|iowait是什么?

公众号新闻

我们对系统性能进行优化时,一般会使用 top 命令来查看系统负载和系统中各个进程的运行情况,从而找出影响系统性能的因素。如下图所示:

top

top 命令会输出很多系统相关的信息,如:系统负载、系统中的进程数、CPU使用率和内存使用率等,这些信息对排查系统性能问题起着至关重要的作用。

本文主要介绍 top 命令中的 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.

中文翻译的意思就是:CPU 在等待磁盘 I/O 请求完成时,处于空闲状态的时间百分比(此时正在运行着 idle 进程)。

可以看出,如果系统处于 iowait 状态,那么必须满足以下两个条件:

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

iowait统计原理

既然我们知道了 iowait 的含义,那么接下来看看 Linux 是怎么统计 iowait 的比率的。

Linux 会把 iowait 占用的时间输出到 /proc/stat 文件中,我们可以通过一下命令来获取到 iowait 占用的时间:

cat /proc/stat

命令输出如下图所示:

stat

红色方框中的数据就是 iowait 占用的时间。

我们可以每隔一段时间读取一次 /proc/stat 文件,然后把两次获取到的 iowait 时间进行相减,得到的结果是这段时间内,CPU处于 iowait 状态的时间。接着再将其除以总时间,得到 iowait 占用总时间的比率。

现在我们来看看 /proc/stat 文件是怎样获取 iowait 的时间的。

在内核中,每个 CPU 都有一个 cpu_usage_stat 结构,主要用于统计 CPU 一些信息,其定义如下:

struct cpu_usage_stat {
    cputime64_t user;
    cputime64_t nice;
    cputime64_t system;
    cputime64_t softirq;
    cputime64_t irq;
    cputime64_t idle;
    cputime64_t iowait;
    cputime64_t steal;
    cputime64_t guest;
    cputime64_t guest_nice;
};

cpu_usage_stat 结构的 iowait 字段记录了 CPU 处于 iowait 状态的时间。

所以要获取系统处于 iowait 状态的总时间,只需要将所有 CPU 的 iowait 时间相加即可,代码如下(位于源文件 fs/proc/stat.c):

static int show_stat(struct seq_file *p, void *v)
{
    u64 iowait;
    ...
    // 1. 遍历系统中的所有CPU
    for_each_possible_cpu(i) {
        ...
        // 2. 获取CPU对应的iowait时间,并相加
        iowait = cputime64_add(iowait, kstat_cpu(i).cpustat.iowait);
        ...
    }
    ...
    return 0;
}

show_stat() 函数首先会遍历所有 CPU,然后读取其 iowait 时间,并且将它们相加。

增加iowait时间

从上面的分析可知,每个 CPU 都有一个用于统计 iowait 时间的计数器,那么什么时候会增加这个计数器呢?

答案是:系统时钟中断

在 系统时钟中断 中,会调用 account_process_tick() 函数来更新 CPU 的时间,代码如下:

void account_process_tick(struct task_struct *p, int user_tick)
{
    cputime_t one_jiffy_scaled = cputime_to_scaled(cputime_one_jiffy);
    struct rq *rq = this_rq();

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

我们主要关注当前进程是 idle 进程的情况,这是内核会调用 account_idle_time() 函数进行处理,其代码如下:

void account_idle_time(cputime_t cputime)
{
    struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
    cputime64_t cputime64 = cputime_to_cputime64(cputime);
    struct rq *rq = this_rq();

    // 1. 如果当前有进程在等待IO请求的话,那么增加iowait的时间
    if (atomic_read(&rq->nr_iowait) > 0) {
        cpustat->iowait = cputime64_add(cpustat->iowait, cputime64);
    }
    // 2. 否则增加idle的时间
    else {
        cpustat->idle = cputime64_add(cpustat->idle, cputime64);
    }
}

account_idle_time() 函数的逻辑比较简单,主要分以下两种情况进行处理:

  1. 如果当前有进程在等待 I/O 请求的话,那么增加 iowait 的时间。
  2. 如果当前没有进程在等待 I/O 请求的话,那么增加 idle 的时间。

所以,从上面的分析可知,要增加 iowait 的时间需要满足以下两个条件:

  1. 当前进程是 idle 进程,也就是说 CPU 处于空闲状态。
  2. 有进程在等待 I/O 请求完成。

进一步说,当 CPU 处于 iowait 状态时,说明 CPU 处于空闲状态,并且系统中有进程因为等待 I/O 请求而阻塞,也说明了 CPU 的利用率不够充分。

这时,我们可以使用异步 I/O(如 iouring)来优化程序,使得进程不会被 I/O 请求阻塞。

- EOF -


加主页君微信,不仅Linux技能+1

主页君日常还会在个人微信分享Linux相关工具资源精选技术文章,不定期分享一些有意思的活动岗位内推以及如何用技术做业余项目

加个微信,打开一扇窗


推荐阅读  点击标题可跳转

1、详细讲解MMU——为什么嵌入式 linux 没他不行?

2、C语言进阶之 回调函数详解

3、Linux 性能分析工具汇总


看完本文有收获?请分享给更多人

推荐关注「Linux 爱好者」,提升Linux技能

点赞和在看就是最大的支持❤️

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
【空间入门大讲堂】10x Genomics带您开启空间分析之旅“什么?为什么?我们在谈论什么?”【9/1】【贵的永远嫌贵,好的永远在排队】【解决方案-->$2450起】【Chinatown/Downtown】【绿/橙/红线】【Downtown】高级公寓平替 | 全翻新落地大窗|Studio$2800|2B$4000 | 电梯门禁系统【5-9.1入住】摩根大通埃尔多斯:当前危机不是系统性的| 巴伦专访系统性“收拾”公知,为啥国家不干霍华德·马克斯:硅谷银行事件不会引发系统性风险,中国的股市和债市非常具有吸引力排雷与时机:系统性阻碍国际首次!破解世界难题!华中科技大学宣布:成功根治“系统性红斑狼疮”!特别策划 | 做好商业分析之前,先读懂“商业”黄仁勋说ChatGPT是新iPhone时刻!这个说法有什么问题?爱上一个人需要多少时间?【宏观市场】硅谷银行事件会演变为系统性危机吗?美国研究首次系统性定义“长新冠”歌剧《野火春风斗古城》选段几道减肥瘦身健康美食专访摩根大通埃尔多斯:当前危机并不是系统性的怎么建设数据体系?或许就差这本《2023「企业智能分析与决策」实践合集》瑞信暴雷!全球金融系统性风险要出现了吗?|智氪VIP(限时免费)ChatGPT与新摩尔定律,下一个系统性机会大门已近在咫尺?我们与清华教授、衔远科技创始人周伯文聊了聊 |【经纬科创汇*AI】国家为何不系统性“收拾”公知大模型工具学习系统性综述+开源工具平台,清华、人大、北邮、UIUC、NYU、CMU等40多位研究者联合发布摩根大通埃尔多斯:当前危机不是系统性的【国际】美国银行再次“爆雷” 专家警告:当心银行业系统性风险单片集成微型超级电容器:新加工策略,实现高系统性能、高集成度 | NSRLinux Perf 性能分析工具及火焰图浅析爬藤选手都在做的Passion Project是什么?欧美金融风暴过去了吗?还有哪些系统性风险?丨对话赵建黄仁勋:ChatGPT是新iPhone时刻!这个说法有什么问题?猎豹傅盛:为什么ChatGPT是生产力革命(2023)为卡特总统祈祷聚焦丨全面推进非物质文化遗产系统性保护【现房+排位】【市区顶级公寓】【Emerson/Suffolk/Chinatown/Downtown】【室内洗烘】【接受本科生】44岁黄海波罕见露面,退居幕后教演员,妻子靠《狂飙》赚钱养家地税单分析之地税飞涨的根本原因
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。