【分享吧】top io_wait指标分析

论坛 期权论坛 期权     
大连飞创   2018-6-25 23:05   4299   0
top是我们在日常开发和运维工作中经常用到的工具之一,通过top我们可以看到目前系统的负载情况,内存使用情况,各个进程的情况等等,其中“cpu状态”这一行指标众多,我们在运维时曾经出现过io_wait变大的情况,本文主要关注此指标,期望通过代码级的分析彻底弄清楚此指标的含义。
1.cpu各指标简介
按照man top的解释,这些指标如下:



当我们在top运行期间按下快捷键‘1’时,我们可以看到各个core的运行情况。我们知道一个应用程序执行期间可以划分为用户态和内核态执行,us统计的是在用户态运行并且采用默认nice值(0,或者nice小于0)时占用的cpu比例。当进程调用系统调用时,进程进入内核态运行,sy统计的就是这部分时间的占比。当一个进程100%占用cpu时,一般情况下我们通过这两个指标就能看出当前进程cpu时间主要花费在哪里,比例是否合适等等,是否存在不合理的地方,为我们分析进程运行是否在正常运行提供了一个重要的观察指标。
当设置进程的nice时,会影响内核对进程的调度,nice值越大进程优先级越低,当我们使用renice调节进程nice值大于0后,原来统计于us部分的数据,就会转移到ni部分。
id此指标是cpu处于空闲时间的占比,此指标越大说明core非常空闲。
wa此指标是统计等待io完成而等待的时间占比,也是本文将重点分析的指标。当进程有磁盘io操作时,如果磁盘性能不足或者有其他进程正在进行磁盘io操作,这个指标的占比会增大,整个程序的性能会严重下降。
hi,si我们知道linux对于中断处理分为两个部分,top half部分需要代码特别精简,中断屏蔽的时间尽量短,而大部分中断处理在bottom half中完成,此部分可以被其他中断打断,也可以被高优先级的进程抢占。在进程运行期间会被中断打断运行,来执行top half部分的代码,当应用进程系统退出中断之前(或由ksoftirqd)会执行软中断代码,这些cpu开销非常有可能不是应用程序真正需要的,如果这两部分占比非常大的话,说明应用程序被中断干扰严重,需要采用一些措施来避免。
st此指标无研究,不敢妄谈。
2.cpu指标详细分析
top这部分统计信息是通过分析/proc/stat 这个文件得到的。




各个域分别是



/proc/stat 这部分数据是由内核进行统计的,我们打开内核代码fs/proc/stat.c 可以看到



从以上代码看我们知道这些统计数据全部是由 kcpustat_cpu(i).cpustat 这个数组来提供的。我们需要看看kernel是怎么更新这个数组中的数据的。



对于每个指标来说就是一个u64的变量。



update_process_times ()按照每秒HZ(服务器一般是1000次/秒)次被调用,在1634行调用了 account_process_tick。



487行说明每次tick中断会更新 TICK_NSEC的时间(如果HZ是1000的话,大约是1,000,000纳秒),如果代码执行到500行account_idle_time,说明发生时钟中断时一定是在内核态(495行),并且当前进程是当前runqueue的idle线程(497行),或者对于idle线程只发生了硬中断(497行)



在222行,只要此core的运行队列有等待io完成的进程,那么就将此时间统计到io_wait中,否则计入idle中。
接下来我们看看进程是怎么进入io_wait状态的



在发生调度时(调用__schedule ()函数),如果发现当前进程进入io_wait状态(3471行),那么就会将runqueue的nr_iowait加1。然后调度函数会选择新的就绪进程进行调度。



我们知道进程写盘时首先写到内存cache中,在一定条件下这部分内存page需要回写到磁盘,do_writepages完成这个工作。在2344行,如果执行过程中发生了 ENOMEM并且同步模式是等待每页都写入磁盘的话,那么将调用2347行的congestion_wait。



1012行开始调度其他就绪进程,因为本进程在写盘时被堵塞了,所以需要调度其他就绪进程使用此core。



5169行 io_schedule_prepare会将进程的in_iowait进行设置,参考下面代码5149行。



总结一下,top中的wa指标(io_wait)的更新是由时钟中断驱动,如果中断发生时此core上idle线程正在运行,并且最少有一个进程在此core上进行io等待,那么就更新io_wait的计数。top定期去读取/proc/stat中这个计数器,然后经过一定换算得到io_wait的百分比。
由于这部分代码涉及的内容很多,我们采用了浏览的方式,略去了非常多的细节,同时由于作者本人个人能力有限,理解错误的地方一定有不少,欢迎大家多指教。



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3174
帖子:645
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP