2011-04-01 3 views
14

/proc/stat의 통계를 사용하여 CPU 사용률을 얻는 방법에 대한 여러 게시물과 참조가 있습니다. 그러나 대부분 Linux 7 (iowait, irq, softirq)에있는 나머지 jiffie CPU 수는 무시하고 7 + CPU 통계 (user, nice, system 및 idle) 중 4 개만 사용합니다./proc/stat를 사용하여 Linux에서 정확히 CPU 사용률을 계산하십시오.

예를 들어, Determining CPU utilization을 참조하십시오.

제 질문은 : iowait/irq/softirq 숫자도 처음 네 개의 숫자 (user/nice/system/idle) 중 하나에 포함됩니까? 다른 말로하면 총 Jiffie 수와 처음 4 가지 통계의 합계가 같습니까? 또는 전체 Jiffie 카운트가 7 개 통계의 합계와 같습니까? 후자가 true의 경우는, CPU 사용률 공식은 다음과 같이 계정에 모든 숫자를 취해야한다 :

#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); 
} 
+1

나는 또한이 질문에 대해 궁금합니다. 다른 출처에서 답을 찾았습니까? – justinzane

+0

[이 답변] (http://stackoverflow.com/a/23376195/85696)도 참조하십시오. – danadam

답변

9

내가 iowait가가/IRQ/현재 softirq가 처음 4 개 개의 숫자 중 하나에 포함되지 않습니다 생각합니다. CPU가 있으면

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 } 

: 참조 유휴 시간 처리를위한

(Linux kernel 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 기능을 : 당신은 자세한 내용에 대한 커널 코드에 irqtime_account_process_tick의 코멘트를 볼 수 있습니다 유휴 상태이며 보류중인 IO가 있으며 CPUTIME_IOWAIT의 시간을 계산합니다. 그렇지 않으면 CPUTIME_IDLE에 계산됩니다.

결론적으로 irq/softirq의 jiffies는 실제로는 일부 IRQ 또는 소프트 IRQ를 처리하고 있었기 때문에 CPU의 "busy"로 계산되어야한다고 생각합니다. 다른 한편으로는, "iowait"의 jiffies는 CPU에 대해 "유휴"로 계산되어야합니다. 왜냐하면 어떤 일을하지 않고 보류중인 IO가 발생할 때까지 기다리기 때문입니다.

관련 문제