Cómo detectar procesos que consumen demasiada CPU en Linux y hacer troubleshooting

Guía paso a paso para administrar incidentes de CPU alta en Linux: detección, análisis, identificación de procesos y acciones recomendadas para recuperar la estabilidad del sistema.


Te explico cómo identifico procesos de alto consumo de CPU en servidores Linux, cómo interpreto los indicadores y qué pasos sigo para diagnosticar un problema de forma profesional.

Cómo detectar procesos que consumen demasiada CPU en Linux (troubleshooting real)


Cuando un servidor empieza a responder lento, uno de los primeros sospechosos es la CPU.
Pero un consumo alto no siempre es un problema, y un consumo bajo no siempre significa que todo está bien.

En esta guía te muestro cómo identifico procesos que consumen CPU de forma anormal y cómo hago troubleshooting, usando comandos del sistema y patrones que aplico en mi trabajo diario como administrador Linux.


1. Inicio con top: no para ver números, sino patrones

top -o %CPU

🔍 Qué observo realmente:

  • Procesos en estado R (running) que se mantienen arriba
  • Cambios bruscos en el load average
  • Porcentaje de %us, %sy y especialmente %wa (I/O wait)
  • Si el proceso “culpable” es un servicio, un usuario o un demonio
  • Si el consumo es estable o sube y baja constantemente

📌 Si %wa está alto → no sigo con CPU. El cuello está en el disco.


2. Confirmo con ps para ver el consumo real

Uso ps para obtener una fotografía exacta del uso de CPU:

ps aux --sort=-%cpu | head

Ejemplo de salida:

USER   PID   %CPU  %MEM  COMMAND
root   1503  180   3.1   java -jar servicio.jar
www    2291  95    1.5   php-fpm: pool www

Qué me indica esto:

  • Si es Java, reviso hilos y flags de memoria.
  • Si es php-fpm, suelen ser bots o consultas lentas.
  • Si es un proceso propio, reviso logs inmediatamente.

3. Identifico si el consumo es legítimo o anómalo

Hay tareas que deben usar CPU:

  • Compilaciones
  • Procesamiento en batch
  • Conversión de imágenes/videos
  • Indexado de datos
  • Cargas programadas

El problema real aparece cuando hay:

  • CPU alta sin tráfico
  • Picos inesperados
  • Un proceso al 100% por varios minutos
  • Servicios reiniciándose por límite de CPU

4. Reviso los hilos del proceso (clave para Java, Python, Node)

top -H -p PID

Ejemplo:

PID   USER   %CPU   COMMAND
1503  root   120    java
1504  root   2      java
1505  root   1      java

Interpretación:

Si un solo hilo está consumiendo casi todo el CPU:

  • Loop infinito
  • Thread bloqueado
  • Sección crítica no protegida
  • Contención de recursos

5. Reviso los logs del servicio

Siempre hago esto después de identificar el proceso:

journalctl -u servicio -f

o

tail -f /var/log/servicio.log

Busco:

  • Errores repetidos
  • Timeouts
  • Reconexiones constantes
  • Advertencias de rendimiento
  • Fallos en bucle

Los logs casi siempre explican lo que top no te dice.


6. Confirmo si es CPU real o I/O disguised como CPU

Muchos confunden “CPU alta” con “sistema lento”.

Con iostat descubro si el problema es realmente el disco:

iostat -xz 1 3

Indicadores clave:

MétricaInterpretación
%util > 80%disco saturado
await > 20 msI/O lenta
%iowait altoCPU esperando al disco
r/s, w/sprocesos leyendo/escribiendo demasiado

Si el I/O está saturado → el problema no es la CPU, aunque lo parezca.


7. Casos reales que me pasaron

Caso 1: CPU alta por ataque a php-fpm

  • Bots saturando PHP
  • Workers al límite
  • Tiempo de respuesta altísimo

Solución: rate limiting + ajuste de workers.


Caso 2: Microservicio Java consumiendo un core

  • Un hilo en loop infinito
  • Generaba logs repetidos

Solución: corregir código + ajustar JVM.


Caso 3: Proceso Python que parecía CPU pero era I/O

  • Espera de disco muy alta
  • Escrituras dentro de un bucle
  • %wa elevado

Solución: mover proceso a SSD + optimizar escrituras.


Checklist rápido

  • top → detectar patrones
  • ps → confirmar proceso
  • Revisar si el consumo es normal
  • top -H -p PID → revisar hilos
  • Revisar logs
  • iostat → descartar I/O
  • Tomar acción según causa

Conclusión

Un proceso que consume mucha CPU no siempre es un error.
Lo importante es entender el contexto, revisar hilos, analizar logs y verificar si la causa real está en CPU, I/O o una mala configuración.

Con un flujo ordenado, diagnosticar estos problemas es rápido y evita matar procesos innecesariamente.


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *