使用/proc/stat准确计算Linux中的CPU利用率 [英] Accurately Calculating CPU Utilization in Linux using /proc/stat

查看:938
本文介绍了使用/proc/stat准确计算Linux中的CPU利用率的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

关于如何使用/proc/stat中的统计信息获取CPU利用率的文章和参考文献很多.但是,它们中的大多数仅使用7个以上的CPU统计信息中的四个(用户,nice,系统和空闲),而忽略了Linux 2.6中存在的剩余jiffie CPU计数(iowait,irq,softirq).

There are a number of posts and references on how to get CPU Utilization using statistics in /proc/stat. However, most of them use only four of the 7+ CPU stats (user, nice, system, and idle), ignoring the remaining jiffie CPU counts present in Linux 2.6 (iowait, irq, softirq).

例如,请参见确定CPU利用率.

我的问题是:iowait/irq/softirq数字是否也计入前四个数字之一(用户/nice/系统/空闲)?换句话说,吉普赛总人数是否等于前四个状态的总和?或者,吉普车总数等于所有7个统计数据的总和?如果后者为真,则CPU利用率公式应考虑所有数字,如下所示:

My question is this: Are the iowait/irq/softirq numbers also counted in one of the first four numbers (user/nice/system/idle)? In other words, does the total jiffie count equal the sum of the first four stats? Or, is the total jiffie count equal to the sum of all 7 stats? If the latter is true, then a CPU utilization formula should take all of the numbers into account, like this:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  long double a[7],b[7],loadavg;
  FILE *fp;

  for(;;)
  {
    fp = fopen("/proc/stat","r");
    fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]);
    fclose(fp);
    sleep(1);
    fp = fopen("/proc/stat","r");
    fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&b[0],&b[1],&b[2],&b[3],&b[4],&b[5],&b[6]);
    fclose(fp);

    loadavg = ((b[0]+b[1]+b[2]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[4]+a[5]+a[6]))
         / ((b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]) - (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]));
    printf("The current CPU utilization is : %Lf\n",loadavg);

  }

  return(0);
}

推荐答案

我认为iowait/irq/softirq不在前4个数字之一中.您可以在内核代码中看到irqtime_account_process_tick的注释以获取更多详细信息:

I think iowait/irq/softirq are not counted in one of the first 4 numbers. You can see the comment of irqtime_account_process_tick in kernel code for more detail:

(对于 Linux内核4.1.1 )

2815  * Tick demultiplexing follows the order
2816  * - pending hardirq update    <-- this is irq
2817  * - pending softirq update    <-- this is softirq
2818  * - user_time
2819  * - idle_time         <-- iowait is included in here, discuss below
2820  * - system time
2821  *   - check for guest_time
2822  *   - else account as system_time

有关空闲时间的处理,请参见account_idle_time函数:

For the idle time handling, see account_idle_time function:

2772 /*
2773  * Account for idle time.
2774  * @cputime: the cpu time spent in idle wait
2775  */
2776 void account_idle_time(cputime_t cputime)
2777 {
2778         u64 *cpustat = kcpustat_this_cpu->cpustat;
2779         struct rq *rq = this_rq();
2780
2781         if (atomic_read(&rq->nr_iowait) > 0)
2782                 cpustat[CPUTIME_IOWAIT] += (__force u64) cputime;
2783         else
2784                 cpustat[CPUTIME_IDLE] += (__force u64) cputime;
2785 }

如果cpu空闲并且有一些IO待处理,它将计算CPUTIME_IOWAIT中的时间.否则,它将计入CPUTIME_IDLE.

If the cpu is idle AND there is some IO pending, it will count the time in CPUTIME_IOWAIT. Otherwise, it is count in CPUTIME_IDLE.

总而言之,我认为irq/softirq中的烦恼对于CPU来说应该算是忙",因为它实际上正在处理某些IRQ或软IRQ.另一方面,对于CPU来说,"iowait"中的烦恼应被视为空闲",因为它没有做任何事情,而是在等待未决的IO发生.

To conclude, I think the jiffies in irq/softirq should be counted as "busy" for cpu because it was actually handling some IRQ or soft IRQ. On the other hand, the jiffies in "iowait" should be counted as "idle" for cpu because it was not doing something but waiting for a pending IO to happen.

这篇关于使用/proc/stat准确计算Linux中的CPU利用率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆