Significado de %CPU reportado por top

Daniel Serpell dserpell en gmail.com
Vie Feb 6 01:13:40 CLST 2009


Hola!

El Thu, Feb 05, 2009 at 08:29:59AM -0700, Alejandro Weinstein escribio:
> 2009/2/4 Daniel Serpell <dserpell en gmail.com>:
> > El Wed, Feb 04, 2009 at 11:13:13AM -0700, Alejandro Weinstein escribio:
> > Si quieres saber si esta muy cargado, el uso de CPU es irrelevante.
> >
> > Un ejemplo: si quieres saber si un estudiante tiene una carga de ramos
> > muy grande, ¿te sirve mirar si en este minuto esta ocupado?. Claramente,
> > en el momento que muestrees, o bien el estudiante está en clases (con un
> > uso de casi 100% ojalá) o no (con un uso de 0%). Por más que lo desee,
> > no puede está haciendo más del 100% en un momento determinado.
> 
> Pero si miro lo que hace el estudiante durante todo el dia, con una
> ventana de tiempo de, por ejemplo, 5 minutos, y la mayor parte del
> tiempo esta ocupado, puedo concluir que su carga es alta.
>

Porque asumes que una ventana de 5 minutos es un muestreo razonable para
este caso. Tu computador, en cambio, cambia de tarea unas cientos de
veces por segundo de ser necesario, por lo que no es razonable muestrear
un instante específico.
 
> > Lo que debes mirar, es el tamaño de la cola de cosas por hacer promediado
> > en el tiempo... osea, el promedio de cuantas cosas por hacer tienes.
> >
> > Esta medición, en un sistema Unix, la entregan las columnas "load average"
> > que aparecen al principio en el top, o se pueden obtener con "uptime".
> >
> > Los números corresponden a la carga promedio de 1, 5 y 15 minutos.
> >
> > Si la carga promedio es mayor que el número de CPUs de tu computador,
> > significa que estas con sobrecarga.
> 
> OK. Supongamos que descubro que la carga promedio es mayor que 1
> (asumiendo un CPU), como determino quien es el "culpable"? Mirar la
> lista de procesos (por un rato), y ver el que tiene un %CPU mas alto
> no es lo correcto? Volviendo a la analogia del estudiante, si el tipo
> esta muy ocupado, como determino si es porque tiene muchas clases o si
> es porque se la pasa pegado jugando al computador?
> 

Ninguna de las dos, no puedes definir un culpable. Si está muy ocupado es
porque tiene más de una cosa que hacer todo el tiempo, si lo que tiene
que hacer te interesa a ti o no no importa realmente.

¿Cuáles son los casos de uso?

- Tienes un computador que debe realizar varias cosas (por ejemplo, es
  servidor web, de correo y base de datos) y ves que su carga es muy
  alta.
 -> debes pasar algunas de las tareas a otro computador o cambiar
    el computador por uno más rápido.

- Debes realizar una tarea en un tiempo determinado y está demorando más
  de lo necesario.
 -> En este caso, la carga no es útil como medición (es úna sóla tarea),
    lo que necesitas medir es simplemente cuanto tiempo demora en realizar
    la tarea necesaria, y aumentar CPU de ser necesario.

- En tu computador, te das cuenta que la carga es muy alta cuando no
  debería serlo.
 -> Tienes procesos que no controlas peleando por CPU, en este caso paras
    todos los procesos tuyos y con TOP puedes ver que otros procesos se
    están ejecutando en este momento.

Debido a la manera en que funciona TOP (en particular el muestreo de uso
de CPU), las únicas medidas realmente confiables son de 0% y 100%, las
que corresponden a un proceso durmiendo y uno ejecutándose respectivamente.

Esto es así porque en un instante de muestreo (se muestrea en los momentos
en que el S.O. decide cambiar de tarea en ejecución), sólo sabes que una
tarea determinada ocupó la CPU por el slot de tiempo recién terminado.

Y como la interacción entre las tareas es compleja, puede suceder que
una tarea *nunca* termine su slot de tiempo, por lo que nunca se va a
contabilizar.

Versiones modernas de Linux usan distintas eurísticas en el scheduler
para determinar el uso de CPU de casa tarea, y así distribuir la CPU
entre las tareas de manera más eficiente. Esto produce que la medición
de CPU por tarea se desvíe de la medición de uso de CPU total, pero
ninguna de las dos es realmente "mejor" que la otra, simplemente
miden cosas ligeramente distintas.

Una manera de ver esto es con un programa que latere rápidamente
entre usar CPU y dormir por un intervalo corto de tiempo, la medición
de uso de CPU por tarea será mucho más alta que la medición global.

Para muestra, ver el programa adjunto, puedes probar, por ejemplo,
 "testtop 10 150000", el primer parámetro es el tiempo que duerme
en microsegundos, el segundo el número de cuentas en un loop que
no hace nada.

    Daniel.

----------------- testtop.c ---------------------
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int st = atoi(argv[1]), lp = atoi(argv[2]);
    while(1)
    {
        int i;
        for(i=0;i<lp;i++);
        usleep(st);
    }
    return 0;
}
--------------------------------------------------


Más información sobre la lista de distribución Linux