Valores de carga de CPU en Linux

Linux Tux Linux Tux

Si disfrutas de la gestión de un sistema Linux, estarás acostumbrado a los valores de carga de la CPU que se representan como tres números decimales al ejecutar comandos como uptimetal que:

load average: 0.09, 0.05, 0.01

Las tres cifras que aparecen indican respectivamente la carga de trabajo media de 1, 5 y 15 últimos minutos. Cuanto menor es el valor mejor; número altos pueden representan un problema de sobrecarga de la máquina.

Mucha gente no sabe es diferenciar cuando esos valores de carga de trabajo son “buenos” o “malos”. ¿Cuál es el umbral en el que un administrador debe preocuparse?

Para explicar la representación vamos a empezar con un ejemplo simple: una máquina con un procesador de un solo núcleo.

La analogía del tráfico

Una máquina con un solo núcleo es como un puente con una carretera de un solo carril. Los coches sólo pueden circular por ella de uno en uno, y sólo caben un determinado número de coches dentro del puente circulando simultáneamente. Una forma de medir la eficiencia de dicho puente sería: “¿Cuántos coches hay esperando en un determinado momento?“. Si no hay ningún coche esperando, los que lleguen al puente podrán circular por el directamente, sin esperas, pero si demasiados coches quieren cruzarlo a la vez, se producen retrasos al intentar atravesarlo formándose colas de espera para acceder al puente.

De este modo, como operador de puente, ¿qué sistema numérico vamos a emplear para valorar el tráfico?:

  • 0.00 significa que no hay ningún tráfico en el puente. Si el valor oscila entre 0.00 y 1.00 significa que no hay que esperar para circular por el puente. Cualquier coche que llegue podrá cruzarlo sin esperas.
    Un valor de 0.50 es equivalente a load average 0.70
  • 1.00 significa que el puente está a su máxima capacidad. Aún no tenemos ningún problema, pero si el tráfico aumenta un poco empezará a ralentizarse.
    Un valor de 1.00 es equivalente a load average 1.00
  • un valor por encima de 1.00 significa que hay que esperar. ¿Cuánto?. Si el valor es 2.00 significa que hay coches para llenar dos veces el carril. El número de coches que quepan en el carril estarán circulando, y otros tantos estarán esperando para circular. Si el valor es 3.00, entonces los coches que esperan pueden llenar dos veces el puente, así que tendrán que esperar su turno.
    Un valor de 1.70 equivale a load average 1.70

La carga de trabajo de la CPU son básicamente procesos (“coches”) que utilizan una porción de tiempo del trabajo de la CPU (“cruzando el puente“) o que están esperando para utilizar la CPU (cola de procesos). Unix se refiere a esto como la longitud de la cola de ejecución: la suma del número de procesos que están en ejecución más el número de procesos que están esperando (en cola) para ser ejecutados por la CPU.

Como administradores del puente, nos interesa que nunca existan coches/procesos esperando. Por lo tanto, nuestra carga de CPU debería estar situada idealmente en un valor por debajo de 1.00; si ocasionalmente se producen picos por encima de 1.00 tampoco es preocupante, pero cuando esos picos se mantienen de manera constante en el tiempo por encima de 1.00, entonces nos tenemos que empezar a preocupar.

Al principio hemos hablado del umbral a partir del que teníamos que empezar a preocuparnos y también hemos dicho que con valores de hasta 1.00 no hay problema. La realidad es que si un sistema se encuentra permanentemente con valores cercanos a 1.00 es un problema en potencia. Dónde establecer ese umbral de seguridad es algo que cada administrador debe decidir. Muchos administradores de sistemas establecen ese umbral en 0.70, aunque es posible que muchos consideren un 15% más que suficiente (0.85), todo depende de cada situación específica.

El caso, es que a partir de ese valor de umbral que hayamos definido, es momento de investigar antes de que las cosas vayan a peor. Si el valor llega a 1.00 es un problema que hay que solucionar YA. De otro modo es probable que te acaben despertando en mitad de la noche porque algo no funciona. Si los valores superan el 5.00, la máquina tiene un serio problema, todo el trabajo que realice la máquina se ralentizará y fallará en el peor momento posible, siempre lo hacen. No hay que dejar que nuestra máquina llegue a ese punto.

¿Y si tengo un procesador multinúcleo?

¿Tienes un procesador con cuatro núcleos? Si tu carga de trabajo esta 3.00, no tienes que preocuparte.

En un sistema con multinúcleo (pueden ser varios procesadores, un procesador con varios núcleos, o una combinación de ambos), la carga de trabajo es relativa al número de núcleos disponibles. El “100% de utilización” se marca con 1.00 en un sistema un solo núcleo, 2.00 en un sistema de doble núcleo, 4.00 en uno de cuatro núcleos, etc.

Si recuperamos la analogía del puente, el “1.00” realmente significa “los coches que un carril puede alojar“. En un puente de un solo carril, significa que el puente está lleno. En uno de dos carriles, 1.00 significa que está al 50% de su capacidad; un carril está lleno, pero el otro no tiene ningún coche por lo que aún podemos admitir más tráfico en nuestro puente.

Carga de 2.00 en una vía de 2 carriles bridge200

Lo mismo para las CPU: una carga de 1.00 será 100% en un sistema mononúcleo. En un sistema de doble núcleo una carga de 2.00 será 100% de utilización de la CPU.

Multinúcleo vs. Multiprocesador

En cuanto a propósitos de rendimiento, ¿una máquina con un procesador de doble núcleo es equivalente a una máquina con dos procesadores de un solo núcleo?.

Si. Aunque hay que tener en cuenta muchos factores como cantidad de memoria cache, frecuencia de intercambio de procesos entre procesadores, etc. A pesar de la infinidad de factores a tener en cuenta, si nos referimos al cálculo del valor de la carga de trabajo de la CPU, el número total de núcleos es lo que importa, independientemente como estén esos núcleos repartidos.

Lo que nos lleva a dos normas básicas:

  • El “número de núcleos = carga máxima”: en un sistema multinúcleo, la carga de trabajo no debe exceder el número de núcleos disponibles.
  • Los “núcleos son núcleos”: Como estén repartidos esos núcleos no importa. Dos tetranúcleos == cuatro binúcleos == ocho mononúcleos. Son ocho núcleos a todos los efectos.

Veamos un ejemplo real

Echemos un vistazo a la salida de los valores de carga de un uptime:

root@srv01 ~/ # uptime
 16:59:48 up 6 days, 21:17, 1 user, load average: 0.34, 0.28, 0.38

Este es un sistema trinúcleo, así que aún tenemos mucho margen hasta llegar a ese “umbral” peligroso de carga de trabajo que hemos definido. Ni siquiera vamos a pensar en eso hasta que llegue a valores de 2.55 o superior.

¿Qué significan esos tres números?. 0.34 es la media del último minuto, 0.28 es la media de los últimos cinco minutos, y 0.38 es la media de los últimos quince minutos. Lo que nos arroja la pregunta:

¿Qué media debo observar? ¿1, 5, ó 15 minutos?

Con las cifras de las que hemos hablado (1.00 = solucionalo YA, etc.), deberíamos estar atentos a la medias de 5 y 15 minutos. Si observamos un pico sobre 1.00 en la media de un minuto, no hay que preocuparse, el sistema sigue funcionando bien. Es cuando la media de los 15 minutos crece por encima de 1.00 y se queda ahí cuando debemos maniobrar nuestro sistema antes de que pueda llegar a colapsar (obviamente, ya hemos aprendido a ajustar esos números al número de núcleos que tiene nuestro sistema).

Si el número de núcleos es importante para interpretar las cargas medias de trabajo… ¿cómo averiguo cuántos núcleos tiene mi sistema?

cat /proc/cpuinfo

Esta instrucción nos devuelve información de cada procesador en nuestra máquina (ten en cuenta que el primer procesador es el número 0).

Si tan solo queremos una suma total y no necesitamos más datos, podemos hacerlo a través de grep:

grep 'processor' /proc/cpuinfo | wc -l

Para conocer los valores medios de carga (load average) también podemos utilizar las bien conocidas tophtop. Con top si pulsamos “1” la linea de datos de carga de la CPU se desglosará en tantas lineas como núcleos tengamos. En htop no es necesario hacer nada, puesto que ya nos muestra la información desglosada por núcleos representado con barras y colores en nuestra consola.

Ejemplo de carga media con htop
Ahora ya sabemos como interpretar los valores de carga de nuestras máquinas; no hay razón para hacerlas sufrir más de lo necesario… aunque se lo merezcan.

Fuentes consultadas: blog.scoutapp.comwikipedia.org

6 Comments

  1. Hola,
    El articulo:
    http://blog.calat.com/valores-de-carga-de-cpu-en-linux/

    Me parece una muy buena traducción del articulo original:
    http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages
    El cual no veo que cites y creo que deberías.
    Saludos.

  2. hola, disculpa la molestia pero he estado buscando información y no encuentro nada que pueda ayudarme, el asunto es que, estoy desarrollando un middleware y necesito que mi planificador conozca los recursos de cada nodo, una parte importante de esa información es saber cuantos procesos está ejecutando cada núcleo de cada nodo para hacer la asignación correspondiente, espero haber sido claro porque me urgesaber como hacerlo u.u de antemano gracias y buena tarde.

    • Roberto Cervero Sola 7 mayo, 2014 at 9:37

      Puedes probar con “mpstat -P ALL”, no te da información del número de procesos por núcleo, pero si que te da información de utilización de cada uno. Puede que eso te sirva. Ya te lo investigo más a fondo en cuanto tenga unos minutos.

      Ya me dirás si mpstat te ha servido de algo. 😉
      Un saludo.

  3. Hola! te hago una consulta ya que esto no me quedo claro, si yo tengo 2 procesadores con 2 nucleos cada uno, el comando grep ‘processor’ /proc/cpuinfo | wc -l me arroja 2, pero no deberia ser 4 mi capacidad maxima de procesamiento? deberia usar cpu cores en lugar de processor? o es el numero de procesadores y no de cores lo que realmente importa? Gracias!

  4. Espectacular articulo muy bien explicado!!!

Anímate a compartir con nosotros tus inquietudes y experiencias.

A %d blogueros les gusta esto: