¿Cómo se calcula el uso de CPU?


En mi escritorio, tengo un pequeño widget que me dice mi uso actual de la CPU. También muestra el uso para cada uno de mis dos núcleos.

Siempre me pregunté, ¿cómo calcula la CPU cuánto de su potencia de procesamiento se está utilizando? Además, si la CPU está colgada haciendo algunos cálculos intensos, ¿cómo puede (o lo que sea que maneje esta actividad) examinar el uso, sin quedar colgada también?

Author: Chris Laplante, 2010-09-20

8 answers

La CPU no hace los cálculos de uso por sí misma. Puede tener características de hardware para facilitar esa tarea, pero es principalmente el trabajo del sistema operativo. Así que, obviamente, los detalles de las implementaciones variarán (especialmente en el caso de los sistemas multinúcleo).

La idea general es ver cuánto tiempo es la cola de cosas que la CPU necesita hacer. El sistema operativo puede echar un vistazo al planificador periódicamente para determinar el número de cosas que tiene que hacer.

Este es un función Linux in (extraída de Wikipedia) que realiza dicho cálculo :

#define FSHIFT   11  /* nr of bits of precision */
#define FIXED_1  (1<<FSHIFT) /* 1.0 as fixed-point */
#define LOAD_FREQ (5*HZ) /* 5 sec intervals */
#define EXP_1  1884  /* 1/exp(5sec/1min) as fixed-point */
#define EXP_5  2014  /* 1/exp(5sec/5min) */
#define EXP_15 2037  /* 1/exp(5sec/15min) */

#define CALC_LOAD(load,exp,n) \
    load *= exp; \
    load += n*(FIXED_1-exp); \
    load >>= FSHIFT;

unsigned long avenrun[3];

static inline void calc_load(unsigned long ticks)
{
    unsigned long active_tasks; /* fixed-point */
    static int count = LOAD_FREQ;

    count -= ticks;
    if (count < 0) {
        count += LOAD_FREQ;
        active_tasks = count_active_tasks();
        CALC_LOAD(avenrun[0], EXP_1, active_tasks);
        CALC_LOAD(avenrun[1], EXP_5, active_tasks);
        CALC_LOAD(avenrun[2], EXP_15, active_tasks);
    }
}

En cuanto a la segunda parte de su pregunta, la mayoría de los sistemas operativos modernos son multi-tarea. Eso significa que el sistema operativo no va a permitir que los programas ocupen todo el tiempo de procesamiento y no tengan ninguno para sí mismo (a menos que lo hagas hacer eso). En otras palabras, incluso si una aplicación aparece colgada, el sistema operativo puede todavía robar algo de tiempo para su propio trabajo.

 28
Author: In silico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-14 20:01:15

Hay una tarea especial llamada tarea inactiva que se ejecuta cuando no se puede ejecutar ninguna otra tarea. El % de uso es solo el porcentaje del tiempo que no estamos ejecutando la tarea inactiva. El sistema operativo mantendrá un total en ejecución del tiempo dedicado a ejecutar la tarea inactiva:

  • cuando cambiamos a la tarea inactiva, establecemos t = hora actual
  • cuando nos alejamos de la tarea inactiva, agregar (tiempo actual - t) al total en ejecución

Si tomamos dos muestras del total de n segundos de diferencia, podemos calcule el porcentaje de esos n segundos pasados ejecutando la tarea inactiva como (segunda muestra - primera muestra) / n

Tenga en cuenta que esto es algo que hace el sistema operativo, no la CPU. El concepto de una tarea no existe a nivel de CPU! (En la práctica, la tarea inactiva pondrá al procesador en reposo con una instrucción HLT, por lo que la CPU sabe cuándo no se está utilizando)

En cuanto a la segunda pregunta, los sistemas operativos modernos son preventivamente multitarea, lo que significa que el sistema operativo puede alejarse de su tarea en cualquier momento. ¿Cómo el sistema operativo realmente roba la CPU de su tarea? Interrumpe: http://en.wikipedia.org/wiki/Interrupt

 54
Author: dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-20 02:27:38

Para obtener el uso de la CPU, muestree periódicamente el tiempo total del proceso y encuentre la diferencia.

Por ejemplo, si estos son los tiempos de CPU para el proceso 1:

kernel: 1:00:00.0000
user:   9:00:00.0000

Y luego los obtienes de nuevo dos segundos después, y son:

kernel: 1:00:00.0300
user:   9:00:00.6100

Se restan los tiempos del núcleo (para una diferencia de 0.03) y los tiempos del usuario (0.61), se suman (0.64), y se dividen por el tiempo de muestra de 2 segundos (0.32).

Así que en los últimos dos segundos, el proceso promedio de 32% de tiempo de CPU.

Las llamadas específicas al sistema necesarias para obtener esta información son (obviamente) diferentes en cada plataforma. En Windows, puede usar GetProcessMites , o GetSystemTimes si desea un acceso directo a total tiempo de CPU usado o inactivo.

 12
Author: zildjohn01,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-20 01:38:36

Una forma de hacerlo es la siguiente:

Elija un intervalo de muestreo, por ejemplo, cada 5 minutos (300 segundos) de tiempo transcurrido real. Puede obtener esto de gettimeofday.

Obtenga el tiempo de proceso que ha utilizado en esos 300 segundos. Puede usar la llamada times() para obtener esto. Ese sería el new_process_time - old_process_time, donde old_process_time es el tiempo de proceso que guardó del último intervalo de tiempo.

Su porcentaje de cpu es entonces (process_time/elapsed_time)*100.0 Puede configurar una alarma para que le señale cada 300 segundos para hacer estos cálculos.

Tengo un proceso que no quiero usar más que un cierto porcentaje de cpu de destino. Este método funciona bastante bien, y concuerda bien con el monitor de mi sistema. Si estamos usando demasiada cpu, dormimos un poco.

 7
Author: user1725779,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-06 21:22:54

Esta es mi comprensión básica de tener un poco de exposición a código similar. Programas como el Administrador de tareas o tu widget acceden a llamadas al sistema como NtQuerySystemInformation() y usan la información recopilada del sistema operativo para hacer el cálculo simple del porcentaje de tiempo que una CPU está inactiva o en uso (en una cantidad de tiempo estándar). Una CPU sabe cuándo está inactiva, por lo que puede determinar cuándo no está inactiva. De hecho, estos programas pueden obstruirse up...my el administrador de tareas de la computadora portátil se congela todo el tiempo al calcular el uso de la CPU cuando se está llenando al 100%.

Se puede encontrar un código de ejemplo en el sitio web de MSDNs que muestra llamadas a funciones para calcular el uso de la CPU para un conjunto de instrucciones: http://msdn.microsoft.com/en-us/library/aa364157 (VS.85).aspx

Lo que hacen estas llamadas al sistema es acceder al código del kernel, creo... lo cual está más allá del alcance de mi entendimiento.

 1
Author: AndyG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-20 01:28:13

Hay varias maneras de hacerlo:

El procesador mantiene varios contadores que miden el rendimiento, puede acceder a ellos utilizando la interfaz Papi. por ejemplo, aquí hay una breve introducción: http://blogs.oracle.com/jonh/entry/performance_counter_generic_events

También: http://www.drdobbs.com/tools/184406109

El contador que puede desear es PAPI_TOT_CYC que es el número de ciclos ocupados (si recuerdo correctamente)

 1
Author: Anycorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-01 15:58:56

Bueno, por lo que yo entiendo hay un gigante

while(true){}

Bucle que gira el sistema operativo. Su proceso se gestiona desde dentro de ese bucle. Permite que el código externo se ejecute directamente en el procesador en trozos. Sin exagerar demasiado, esto es una súper simplificación de lo que realmente está sucediendo.

 0
Author: Gleno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-20 01:24:05
  1. La CPU no se "cuelga", simplemente está operando a su máxima capacidad, lo que significa que está procesando tantas instrucciones como sea físicamente capaz cada segundo. El proceso que está calculando el uso de la CPU son algunas de esas instrucciones. Si las aplicaciones intentan hacer operaciones más rápido de lo que la CPU es capaz, entonces simplemente se retrasarán, de ahí el 'colgado'.

  2. El cálculo de la utilización de la CPU se basa en la utilización total disponible. Así que si una CPU tiene dos núcleos, y un núcleo tiene un uso del 30%, y el otro es del 60%, la utilización general es del 45%. También puede ver el uso de cada núcleo individual.

 0
Author: Aashish Bharadwaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-03 18:01:42