2011-04-01 24 views
14

Hay una serie de publicaciones y referencias sobre cómo obtener la utilización de la CPU usando estadísticas en/proc/stat. Sin embargo, la mayoría de ellos usa solo cuatro de las 7+ estadísticas de CPU (usuario, agradable, sistema e inactivo), ignorando los conteos restantes de CPU jiffie presentes en Linux 2.6 (iowait, irq, softirq).Calculando con precisión la utilización de la CPU en Linux utilizando/proc/stat

Como ejemplo, vea Determining CPU utilization.

Mi pregunta es esta: ¿Los números iowait/irq/softirq también se cuentan en uno de los primeros cuatro números (usuario/agradable/sistema/inactivo)? En otras palabras, ¿el recuento de jiffie total es igual a la suma de las primeras cuatro estadísticas? O bien, ¿el recuento de jiffie total es igual a la suma de las 7 estadísticas? Si esto último es cierto, entonces una fórmula utilización de la CPU debe tomar todos los números en cuenta, como este:

#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

También tengo curiosidad acerca de esta pregunta. ¿Encontraste una respuesta de otra fuente? – justinzane

+0

Véase también [esta respuesta] (http://stackoverflow.com/a/23376195/85696). – danadam

Respuesta

9

Creo iowait/IRQ/softirq no se cuentan en uno de los primeros 4 números. Se puede ver el comentario de irqtime_account_process_tick en el código del kernel para más detalles:

(por 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 

Para el manejo de tiempo de inactividad, consulte account_idle_time función:

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 } 

Si la CPU está inactivo Y hay un IO pendiente, contará el tiempo en CPUTIME_IOWAIT. De lo contrario, se cuenta en CPUTIME_IDLE.

Para concluir, creo que los jiffies en irq/softirq se deben contar como "ocupados" para la CPU porque en realidad estaba manejando alguna IRQ o IRQ suave. Por otro lado, los jiffies en "iowait" se deben contar como "inactivos" para la CPU porque no estaban haciendo algo, sino esperando a que ocurriera una IO pendiente.

Cuestiones relacionadas