0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

看看Linux是怎么统计iowait比率的?

Linux爱好者 来源:Linux内核那些事 2023-04-27 09:28 次阅读

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

f050fede-e47b-11ed-ab56-dac502259ad0.png

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状态,那么必须满足以下两个条件:

系统中存在等待 I/O 请求完成的进程。

系统当前正处于空闲状态,也就是说没有可运行的进程。

iowait统计原理

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

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

cat/proc/stat

命令输出如下图所示:

f098ae5a-e47b-11ed-ab56-dac502259ad0.png

stat

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

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

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

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

structcpu_usage_stat{
cputime64_tuser;
cputime64_tnice;
cputime64_tsystem;
cputime64_tsoftirq;
cputime64_tirq;
cputime64_tidle;
cputime64_tiowait;
cputime64_tsteal;
cputime64_tguest;
cputime64_tguest_nice;
};

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

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

staticintshow_stat(structseq_file*p,void*v)
{
u64iowait;
...
//1.遍历系统中的所有CPU
for_each_possible_cpu(i){
...
//2.获取CPU对应的iowait时间,并相加
iowait=cputime64_add(iowait,kstat_cpu(i).cpustat.iowait);
...
}
...
return0;
}

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

增加iowait时间

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

答案是:系统时钟中断。

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

voidaccount_process_tick(structtask_struct*p,intuser_tick)
{
cputime_tone_jiffy_scaled=cputime_to_scaled(cputime_one_jiffy);
structrq*rq=this_rq();

//1.如果当前进程处于用户态,那么增加用户态的CPU时间
if(user_tick){
account_user_time(p,cputime_one_jiffy,one_jiffy_scaled);
}
//2.如果前进程处于内核态,并且不是idle进程,那么增加内核态CPU时间
elseif((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()函数进行处理,其代码如下:

voidaccount_idle_time(cputime_tcputime)
{
structcpu_usage_stat*cpustat=&kstat_this_cpu.cpustat;
cputime64_tcputime64=cputime_to_cputime64(cputime);
structrq*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()函数的逻辑比较简单,主要分以下两种情况进行处理:

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

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

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

当前进程是idle进程,也就是说 CPU 处于空闲状态。

有进程在等待 I/O 请求完成。

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

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






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10863

    浏览量

    211742
  • LINUX内核
    +关注

    关注

    1

    文章

    316

    浏览量

    21648
  • 时钟中断
    +关注

    关注

    0

    文章

    4

    浏览量

    7700

原文标题:系统性能分析之|iowait是什么?

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用吉时利DMM的比率功能测量功率

    在TSP脚本和低电阻电流传感电阻器的帮助下,我们实现了一个有趣的应用,即使用DMM6500这样的数字万用表,通过比率功能测量功率。脚本基于的原理是,比率功能在一个读数中同时存储传感和输入电压的电压测量数据,然后显示输入电压与传感电压的比值。
    发表于 08-01 11:54 560次阅读
    使用吉时利DMM的<b class='flag-5'>比率</b>功能测量功率

    如何在Linux使用iostat命令

    IO等待或者`iowait`,`wait`,`wa`,`%iowait`,或者`wait%`通常可以通过Linux系统监控工具查看。例如命令行工具top、sar、atop等。
    的头像 发表于 01-04 17:17 1568次阅读

    统计工具箱函数汇总

    对matlab中的统计工具箱函数都有所介绍,比较详细,大家可以看看
    发表于 11-15 10:07

    linux统计文件个数

    这篇文章主要介绍了Linux统计当前文件夹下的文件个数、目录个数,本文使用ls命令配合管理、grep命令实现统计需求,需要的朋友可以参考下
    发表于 07-24 08:40

    比率法电阻测量电路图

    比率法电阻测量电路图
    发表于 04-08 09:03 1063次阅读

    一体化速印机的缩小比率/放大比率

    一体化速印机的缩小比率/放大比率    一体化速印机的缩小比率      &
    发表于 12-31 09:59 1401次阅读

    用于比率计算的除法运算电路

    用于比率计算的除法运算电路 电路的功能 本电路是用X除输入信号Z
    发表于 05-08 15:29 1739次阅读
    用于<b class='flag-5'>比率</b>计算的除法运算电路

    绝对输出iMEMS陀螺仪与比率ADC的配合使用

    iMEMS陀螺仪常常与许多集成在微控制器中的低成本比率ADC配合使用。本应用笔记将简要介绍如何实现陀螺仪的绝对(不随电源电压变化而变化)输出与比率ADC的连接。
    发表于 02-02 17:26 21次下载

    算法大全_数据的统计描述和分析

    算法大全第10章_数据的统计描述和分析,有需要的下来看看
    发表于 01-14 17:47 0次下载

    RTD比率式温度测量应用

    比率式测量中使用RTD有一定优势,因为它能消除激励电流源的精度和漂移等误差源。下面是4线RTD比率式测量的典型电路。4线式配置的优势是可消除由引脚电阻产生的误差。
    发表于 03-23 15:56 3714次阅读
    RTD<b class='flag-5'>比率</b>式温度测量应用

    小差比率制动系数校验的优化

    针对传统小差比率制动系数校验方法存在校验结果可能不准确的问题,从固定相位调节幅值校验方法出发,得到了其简化的等价模型,并根据校验需满足的条件,提出了一种小差比率制动系数校验新方法。该方法能保证校验
    发表于 03-16 11:21 0次下载
    小差<b class='flag-5'>比率</b>制动系数校验的优化

    加密货币交易中采用的夏普比率是什么

    夏普比率(Sharpe Ratio),又被称为夏普指数 --- 基金绩效评价标准化指标。夏普比率在现代投资理论的研究表明,风险的大小在决定组合的表现上具有基础性的作用。风险调整后的收益率就是一个可以同时对收益与风险加以考虑的综合指标,以期能够排除风险因素对绩效评估的不利影
    发表于 08-29 10:33 1247次阅读

    比特币的库存与流动比率分析

    库存与流动比率(STF)较大的商品比库存与流动比率较小的商品更受青睐,因为它们被认为更稀缺。黄金的比例最高,为62。这意味着,以目前的生产水平,需要62年才能生产出目前的黄金总供应量。
    发表于 12-06 11:26 1332次阅读

    带大家看看Linux内核如何调度进程的

    部分,打开调度器的黑匣子,来看看Linux内核如何调度进程的。实际上,进程调度器主要做两件事:选择下一个进程,然后进行上下文切换。 而何时调用主调度器调度进程那是调度时机所关注的问题,而调度时机在之前的内核抢占文章已经做了详细讲解,在此不在赘述,而本文关注的调度时机是真正
    的头像 发表于 07-26 15:14 2014次阅读

    深入探究Linux系统噪音统计(osnoise tracer)

    Linux系统中作为一个普通线程是非常苦逼的。不仅NMI 、硬中断、软中断可以打断它,甚至其它普通线程也可以来打断干扰到它的运行。 如果没有这些打断事件,一个普通线程执行while循环,可以
    的头像 发表于 09-18 10:53 1837次阅读
    深入探究<b class='flag-5'>Linux</b>系统噪音<b class='flag-5'>统计</b>(osnoise tracer)