Alto Uso de CPU: Diagnóstico con top, ps, pidstat

Introducción

El alto uso de CPU es uno de los problemas de rendimiento más comunes que enfrentan los administradores de sistemas. Cuando los recursos de CPU se agotan, los servidores se vuelven lentos, no responden o quedan completamente no disponibles, impactando directamente el rendimiento de las aplicaciones y la experiencia del usuario. Identificar rápidamente la causa raíz es crítico para mantener la calidad del servicio y prevenir tiempo de inactividad.

Esta guía completa proporciona un enfoque sistemático para diagnosticar alto uso de CPU utilizando herramientas de línea de comandos disponibles en todos los sistemas Linux. Aprenderás cómo usar top, ps, pidstat y otras utilidades de diagnóstico para identificar procesos intensivos en CPU, analizar su comportamiento e implementar soluciones efectivas.

Ya sea que estés administrando servidores web, servidores de bases de datos o servidores de aplicaciones, comprender el diagnóstico de CPU es esencial para mantener un rendimiento óptimo. Esta guía cubre todo, desde el monitoreo básico de CPU hasta técnicas avanzadas de perfilado que te ayudan a identificar las causas exactas de los cuellos de botella de CPU.

Comprendiendo el Uso de CPU

Métricas de CPU Explicadas

Antes de diagnosticar problemas, comprende estas métricas clave de CPU:

Tiempo de Usuario (us): Tiempo de CPU dedicado a ejecutar procesos en espacio de usuario Tiempo de Sistema (sy): Tiempo de CPU dedicado a operaciones en espacio del kernel Tiempo Nice (ni): Tiempo de CPU para procesos con prioridad ajustada Tiempo Inactivo (id): Tiempo de CPU inactivo Espera de I/O (wa): Tiempo de CPU esperando operaciones de I/O Interrupciones de Hardware (hi): Tiempo de CPU atendiendo interrupciones de hardware Interrupciones de Software (si): Tiempo de CPU atendiendo interrupciones de software Tiempo Robado (st): Tiempo de CPU robado por el hipervisor (virtualización)

¿Qué Constituye un Alto Uso de CPU?

La interpretación del uso de CPU depende del contexto:

  • 0-40%: Carga ligera normal
  • 40-70%: Carga moderada, generalmente aceptable
  • 70-90%: Carga alta, investigar si es sostenida
  • 90-100%: Crítico, investigación inmediata necesaria

Importante: Picos breves al 100% son normales. El uso alto sostenido indica problemas.

Promedio de Carga vs Uso de CPU

El promedio de carga representa la carga promedio del sistema durante 1, 5 y 15 minutos:

# Ver promedio de carga
uptime
# Salida: load average: 2.50, 1.80, 1.45

# Interpretación:
# - Carga < conteo de CPU: Sistema saludable
# - Carga = conteo de CPU: Sistema a capacidad
# - Carga > conteo de CPU: Sistema sobrecargado

Para un sistema de 4 núcleos:

  • Promedio de carga de 2.0 = 50% utilizado
  • Promedio de carga de 4.0 = 100% utilizado
  • Promedio de carga de 8.0 = 200% sobrecargado

Evaluación Inicial de CPU

Verificación Rápida del Estado de CPU

Comienza con estos comandos de evaluación rápida:

# Carga del sistema y tiempo de actividad
uptime

# Conteo de CPU
nproc
lscpu | grep "^CPU(s)"

# Uso actual de CPU
top -bn1 | grep "Cpu(s)"

# Uso de CPU por núcleo
mpstat -P ALL

# Vista rápida de procesos
ps aux --sort=-%cpu | head -10

# Resumen de recursos del sistema
vmstat 1 5

Interpretación rápida:

# Si promedio de carga > conteo de CPU
# Y uso de CPU > 80%
# ENTONCES investigar inmediatamente

# Si iowait > 30%
# ENTONCES el problema es I/O, no CPU pura

# Si steal > 10%
# ENTONCES problema de sobrecarga de virtualización

Paso 1: Usar top para Análisis de CPU

Uso Básico de top

El comando top es la herramienta de monitoreo de CPU más común:

# top interactivo
top

# Modo batch (una iteración)
top -bn1

# Monitorear usuario específico
top -u username

# Actualizar cada 2 segundos
top -d 2

# Mostrar número específico de procesos
top -bn1 -n 20

# Ordenar por uso de CPU (predeterminado)
# En modo interactivo, presionar:
# P = Ordenar por CPU
# M = Ordenar por Memoria
# T = Ordenar por Tiempo
# c = Mostrar línea de comandos
# 1 = Mostrar núcleos individuales

Interpretando la Salida de top

top - 10:30:45 up 5 days, 2:15, 3 users, load average: 4.23, 3.87, 2.91
Tasks: 247 total, 2 running, 245 sleeping, 0 stopped, 0 zombie
%Cpu(s): 87.3 us, 8.2 sy, 0.0 ni, 2.1 id, 2.1 wa, 0.0 hi, 0.3 si, 0.0 st
MiB Mem: 16384.0 total, 2048.5 free, 12288.3 used, 2047.2 buff/cache
MiB Swap: 4096.0 total, 3072.5 free, 1023.5 used. 3584.2 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1234 www-data  20   0  2.1g   1.5g   12m R  95.3  9.3  123:45 php-fpm
 5678 mysql     20   0  3.2g   2.1g  256m S  45.1 13.1  567:23 mysqld

Observaciones clave:

  • Promedio de carga 4.23 en sistema de 4 núcleos = sobrecargado
  • CPU de usuario 87.3% = problema de aplicación/proceso
  • Espera de I/O 2.1% = no es un problema de I/O
  • PID 1234 usando 95.3% CPU = culpable principal
  • El proceso php-fpm es el problema

Comandos Avanzados de top

# Guardar salida de top en archivo
top -bn1 > cpu-snapshot.txt

# Monitorear proceso específico
top -p 1234

# Monitorear múltiples procesos
top -p 1234,5678,9012

# Mostrar hilos en lugar de procesos
top -H

# Mostrar hilos para proceso específico
top -H -p 1234

# Resaltar procesos en ejecución
# En modo interactivo, presionar 'z' para color

# Mostrar ruta completa del comando
# Presionar 'c' en modo interactivo

# Filtrar por usuario
# Presionar 'u' luego ingresar nombre de usuario

Capturando Instantáneas de CPU

# Capturar uso de CPU a lo largo del tiempo
for i in {1..10}; do
    echo "=== Snapshot $i at $(date) ===" >> cpu-monitor.log
    top -bn1 | head -20 >> cpu-monitor.log
    sleep 60
done

# Script de monitoreo automatizado
cat > /tmp/cpu-monitor.sh << 'EOF'
#!/bin/bash
while true; do
    CPU=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
    if (( $(echo "$CPU > 80" | bc -l) )); then
        echo "$(date): High CPU detected: $CPU%" >> /var/log/cpu-alerts.log
        top -bn1 | head -20 >> /var/log/cpu-alerts.log
    fi
    sleep 60
done
EOF
chmod +x /tmp/cpu-monitor.sh

Paso 2: Usar ps para Análisis de Procesos

Comandos Básicos de ps

El comando ps proporciona información detallada de procesos:

# Todos los procesos ordenados por CPU
ps aux --sort=-%cpu

# Top 10 consumidores de CPU
ps aux --sort=-%cpu | head -11

# Todos los procesos ordenados por memoria
ps aux --sort=-%mem | head -11

# Procesos por usuario específico
ps aux | grep username

# Mostrar jerarquía de procesos
ps auxf
ps -ejH

# Formato de salida personalizado
ps -eo pid,ppid,user,%cpu,%mem,cmd --sort=-%cpu | head -20

# Mostrar hilos
ps -eLf

# Conteo de procesos por usuario
ps aux | awk '{print $1}' | sort | uniq -c | sort -rn

Análisis Avanzado con ps

# Procesos de larga duración
ps -eo pid,user,lstart,etime,%cpu,cmd --sort=-etime | head -20

# Procesos con más hilos
ps -eo pid,nlwp,cmd --sort=-nlwp | head -15

# Procesos agrupados por comando
ps aux --sort=-%cpu | awk '{print $11}' | sort | uniq -c | sort -rn

# Procesos zombies
ps aux | awk '$8 ~ /Z/ {print}'

# Monitoreo de procesos en tiempo real
watch -n 1 'ps aux --sort=-%cpu | head -15'

# Árbol de procesos para PID específico
ps --forest -p 1234
pstree -p 1234

# Uso de CPU por nombre de proceso
ps aux | grep process_name | awk '{sum+=$3} END {print "Total CPU:", sum"%"}'

Información Detallada del Proceso

# Detalles completos del proceso
ps -fp 1234

# Toda la información del proceso
ps -F -p 1234

# Variables de entorno del proceso
cat /proc/1234/environ | tr '\0' '\n'

# Línea de comandos del proceso
cat /proc/1234/cmdline | tr '\0' ' '

# Estado del proceso
cat /proc/1234/status

# Afinidad de CPU del proceso
taskset -p 1234

# Límites del proceso
cat /proc/1234/limits

# Descriptores de archivo del proceso
ls -l /proc/1234/fd | wc -l

Paso 3: Usar pidstat para Análisis Detallado

Instalación y Uso Básico

# Instalar sysstat (incluye pidstat)
apt install sysstat          # Debian/Ubuntu
yum install sysstat          # CentOS/RHEL

# Habilitar sysstat
systemctl enable sysstat
systemctl start sysstat

# Uso básico de pidstat
pidstat

# Monitorear cada 2 segundos
pidstat 2

# Monitorear por 10 iteraciones
pidstat 2 10

# Monitorear proceso específico
pidstat -p 1234

# Monitorear múltiples procesos
pidstat -p 1234,5678,9012 2

Análisis Avanzado con pidstat

# Estadísticas por hilo
pidstat -t

# Por hilo para proceso específico
pidstat -t -p 1234 2

# Mostrar nombre del comando
pidstat -l

# Solo estadísticas de CPU
pidstat -u

# Estadísticas de I/O
pidstat -d

# Estadísticas de memoria
pidstat -r

# Cambios de contexto
pidstat -w

# Todas las estadísticas combinadas
pidstat -u -d -r -w -p 1234 2

# Monitorear por nombre de tarea
pidstat -C php-fpm 2

# Salida legible
pidstat -h 2

Interpretando la Salida de pidstat

# pidstat -u 2
Linux 5.4.0-42-generic (server01)     01/11/2026      _x86_64_

10:45:32 AM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
10:45:34 AM  1000      1234   85.00    5.00    0.00    2.00   90.00     2  php-fpm
10:45:34 AM  1001      5678   25.00   15.00    0.00    5.00   40.00     0  mysqld

Métricas clave:

  • %usr: Uso de CPU en espacio de usuario
  • %system: Uso de CPU en espacio del kernel
  • %guest: Tiempo de CPU virtual (VMs)
  • %wait: Tiempo esperando por CPU
  • %CPU: Uso total de CPU
  • CPU: Número de núcleo de CPU

Análisis de Cambios de Contexto

Los cambios de contexto altos indican contención de CPU:

# Monitorear cambios de contexto
pidstat -w 2

# Interpretación de salida:
# cswch/s = cambios de contexto voluntarios (espera de I/O, sleep)
# nvcswch/s = cambios de contexto involuntarios (preemptados)

# Cambios involuntarios altos = contención de CPU
# Cambios voluntarios altos = proceso limitado por I/O

Paso 4: Perfilado y Análisis de CPU

Usando mpstat

Monitorear estadísticas por núcleo de CPU:

# Instalar si es necesario (parte de sysstat)
apt install sysstat

# Mostrar todos los núcleos de CPU
mpstat -P ALL

# Actualizar cada 2 segundos
mpstat -P ALL 2

# Mostrar núcleo de CPU específico
mpstat -P 0 2

# Estadísticas extendidas
mpstat -A 2

# Salida JSON
mpstat -o JSON 2 5

Interpretando mpstat:

# Carga desbalanceada entre núcleos
# CPU0: 100%, CPU1: 20%, CPU2: 15%, CPU3: 10%
# Indica: Cuello de botella de un solo hilo

# Carga balanceada
# CPU0: 80%, CPU1: 85%, CPU2: 82%, CPU3: 87%
# Indica: Aplicación multi-hilo

Usando vmstat

Vista general del rendimiento del sistema:

# vmstat básico
vmstat 1 10

# Estadísticas extendidas de CPU
vmstat -a 2

# Desglose detallado de CPU
vmstat -w 2

# Interpretación de salida:
# r = procesos esperando por CPU (ejecutables)
# b = procesos en sleep no interrumpible
# us = tiempo de CPU de usuario
# sy = tiempo de CPU de sistema
# id = tiempo inactivo
# wa = tiempo de espera de I/O

Indicadores críticos:

# columna r > conteo de CPU = cuello de botella de CPU
# wa > 30% = cuello de botella de I/O, no CPU
# sy > 30% = llamadas al sistema excesivas
# us > 70% con r > núcleos = sobrecarga de CPU

Usando sar

Datos históricos de rendimiento:

# Instalar y habilitar
apt install sysstat
systemctl enable sysstat

# Uso de CPU (últimos 10 minutos)
sar -u -s $(date -d '10 minutes ago' +%H:%M:%S)

# Estadísticas por núcleo
sar -P ALL

# Datos históricos de CPU
sar -u -f /var/log/sysstat/sa$(date +%d)

# Datos de CPU de ayer
sar -u -f /var/log/sysstat/sa$(date -d yesterday +%d)

# Estadísticas de CPU para hora específica
sar -u -s 10:00:00 -e 11:00:00

# Generar reporte
sar -u > cpu-report.txt

Paso 5: Identificando Causas de Cuellos de Botella de CPU

Problemas de Aplicación

# Verificar procesos descontrolados
ps aux --sort=-%cpu | head -5

# Verificar tiempo de actividad del proceso
ps -eo pid,user,etime,%cpu,cmd --sort=-etime | head -15

# Múltiples instancias del mismo proceso
ps aux | grep process_name | wc -l

# Verificar valores nice del proceso
ps -eo pid,ni,cmd --sort=ni

# Procesos en sleep no interrumpible (estado D)
ps aux | awk '$8 ~ /D/ {print}'

Bucles Infinitos y Bugs

# Monitorear CPU del proceso a lo largo del tiempo
while true; do
    ps -p 1234 -o %cpu,cmd
    sleep 1
done

# Verificar si el proceso está atascado
strace -p 1234 -c
# Buscar llamadas al sistema repetitivas

# Muestrear ejecución del proceso
strace -p 1234 -f -e trace=all 2>&1 | head -100

# Verificar bucles cerrados
perf record -p 1234 -g -- sleep 10
perf report

Problemas de Consultas de Base de Datos

# Consultas lentas de MySQL
mysql -e "SHOW FULL PROCESSLIST;" | grep -v Sleep

# Lista de procesos de MySQL por tiempo
mysql -e "SELECT * FROM information_schema.processlist WHERE command != 'Sleep' ORDER BY time DESC;"

# Consultas activas de PostgreSQL
sudo -u postgres psql -c "SELECT pid, now() - pg_stat_activity.query_start AS duration, query FROM pg_stat_activity WHERE state = 'active' ORDER BY duration DESC;"

# Verificar uso de CPU de la base de datos
ps aux | grep -E "mysqld|postgres" | awk '{sum+=$3} END {print "DB CPU:", sum"%"}'

Carga del Servidor Web

# Procesos de Apache
ps aux | grep apache2 | wc -l
ps aux | grep httpd | wc -l

# Uso de CPU de Apache
ps aux | grep apache2 | awk '{sum+=$3} END {print "Apache CPU:", sum"%"}'

# CPU de workers de Nginx
ps aux | grep "nginx: worker" | awk '{sum+=$3} END {print "Nginx CPU:", sum"%"}'

# Estado del pool PHP-FPM
curl http://localhost/status

Problemas de Contenedores/Virtualización

# Uso de CPU de contenedor Docker
docker stats --no-stream

# Límites de CPU del contenedor
docker inspect container_name | grep -i cpu

# Verificar steal time (sobrecarga del hipervisor)
top -bn1 | grep "Cpu(s)" | awk '{print $16}'

# Si steal > 10%, la sobrecarga de virtualización es alta

Paso 6: Técnicas Avanzadas de Diagnóstico

Usando perf

Herramienta de perfilado de rendimiento:

# Instalar perf
apt install linux-tools-common linux-tools-$(uname -r)

# Grabar perfil de CPU del sistema completo
perf record -a -g -- sleep 30

# Grabar proceso específico
perf record -p 1234 -g -- sleep 30

# Ver reporte
perf report

# Funciones principales consumiendo CPU
perf top

# Análisis de ciclos de CPU
perf stat -p 1234 sleep 10

# Fallos de caché
perf stat -e cache-misses,cache-references -p 1234 sleep 10

Gráficos de Llama de CPU

Visualizar consumo de CPU:

# Clonar herramientas FlameGraph
git clone https://github.com/brendangregg/FlameGraph
cd FlameGraph

# Capturar datos
perf record -F 99 -a -g -- sleep 60

# Generar gráfico de llama
perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > cpu-flamegraph.svg

# Para proceso específico
perf record -F 99 -p 1234 -g -- sleep 60
perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > process-flamegraph.svg

Usando strace

Rastrear llamadas al sistema:

# Rastrear proceso
strace -p 1234

# Contar llamadas al sistema
strace -c -p 1234

# Rastrear con marcas de tiempo
strace -tt -p 1234

# Rastrear llamadas específicas
strace -e trace=open,read,write -p 1234

# Seguir forks
strace -f -p 1234

# Guardar en archivo
strace -o trace.log -p 1234

Usando htop

Visor de procesos mejorado:

# Instalar htop
apt install htop

# Ejecutar htop
htop

# Características clave:
# F5 = Vista de árbol
# F6 = Ordenar por (CPU, Memoria, etc.)
# F9 = Matar proceso
# Space = Marcar proceso
# u = Filtrar por usuario
# t = Vista de árbol
# H = Ocultar/mostrar hilos

Soluciones y Remediación

Acciones Inmediatas

Matar proceso descontrolado:

# Terminación elegante
kill 1234

# Matar forzadamente
kill -9 1234

# Matar todas las instancias del proceso
pkill -9 process_name
killall -9 process_name

Reducir prioridad del proceso:

# Menor prioridad (aumentar valor nice)
renice +10 1234

# Establecer prioridad muy baja
renice +19 1234

# Establecer alta prioridad (requiere root)
renice -10 1234

Gestión de afinidad de CPU:

# Vincular proceso a núcleos de CPU específicos
taskset -p -c 0,1 1234

# Iniciar proceso en núcleos específicos
taskset -c 0,1 command

# Verificar afinidad actual
taskset -p 1234

Correcciones a Nivel de Aplicación

Reiniciar servicio problemático:

# Reiniciar servicio
systemctl restart service-name

# Recargar configuración
systemctl reload service-name

# Verificar estado del servicio
systemctl status service-name

Limitar recursos del proceso:

# Usando ulimit
ulimit -t 3600  # Límite de tiempo de CPU (segundos)

# Usando límites de servicio systemd
cat > /etc/systemd/system/service-name.service.d/limits.conf << 'EOF'
[Service]
CPUQuota=50%
EOF

systemctl daemon-reload
systemctl restart service-name

Optimizar configuración de aplicación:

# Optimización de PHP-FPM
# Editar /etc/php/7.4/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10

# Optimización de Apache
# Editar /etc/apache2/mods-available/mpm_prefork.conf
<IfModule mpm_prefork_module>
    StartServers         5
    MinSpareServers      5
    MaxSpareServers     10
    MaxRequestWorkers  150
    MaxConnectionsPerChild  1000
</IfModule>

Optimización de Base de Datos

# Matar consulta de MySQL de larga duración
mysql -e "KILL 1234;"  # ID de consulta de SHOW PROCESSLIST

# Optimizar tablas de MySQL
mysqlcheck -o database_name

# Terminación de consulta de PostgreSQL
sudo -u postgres psql -c "SELECT pg_terminate_backend(1234);"  # PID

# Habilitar log de consultas lentas (MySQL)
mysql -e "SET GLOBAL slow_query_log = 'ON';"
mysql -e "SET GLOBAL long_query_time = 2;"

Optimización a Nivel de Sistema

Parámetros del kernel:

# Editar /etc/sysctl.conf

# Optimización del planificador
kernel.sched_migration_cost_ns = 5000000
kernel.sched_autogroup_enabled = 0

# Aplicar cambios
sysctl -p

Configuración del gobernador de CPU:

# Verificar gobernador actual
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# Establecer gobernador de rendimiento
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
    echo performance > $cpu
done

# Instalar cpufrequtils
apt install cpufrequtils

# Establecer gobernador permanentemente
echo 'GOVERNOR="performance"' > /etc/default/cpufrequtils
systemctl restart cpufrequtils

Prevención y Monitoreo

Script de Monitoreo Continuo

cat > /usr/local/bin/cpu-monitor.sh << 'EOF'
#!/bin/bash

THRESHOLD=80
LOG_FILE="/var/log/cpu-monitor.log"
ALERT_EMAIL="[email protected]"

while true; do
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
    LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | cut -d',' -f1)

    if (( $(echo "$CPU_USAGE > $THRESHOLD" | bc -l) )); then
        echo "$(date): High CPU detected: $CPU_USAGE%" >> "$LOG_FILE"
        echo "Top processes:" >> "$LOG_FILE"
        ps aux --sort=-%cpu | head -10 >> "$LOG_FILE"

        # Enviar alerta por correo
        echo "High CPU alert on $(hostname): $CPU_USAGE%" | \
            mail -s "CPU Alert: $CPU_USAGE%" "$ALERT_EMAIL"
    fi

    sleep 60
done
EOF

chmod +x /usr/local/bin/cpu-monitor.sh

# Ejecutar como servicio systemd
cat > /etc/systemd/system/cpu-monitor.service << 'EOF'
[Unit]
Description=CPU Monitoring Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/cpu-monitor.sh
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl enable cpu-monitor.service
systemctl start cpu-monitor.service

Reportes Automatizados

cat > /usr/local/bin/cpu-report.sh << 'EOF'
#!/bin/bash

REPORT="/tmp/cpu-report-$(date +%Y%m%d).txt"

echo "CPU Usage Report - $(date)" > "$REPORT"
echo "================================" >> "$REPORT"
echo "" >> "$REPORT"

echo "System Load:" >> "$REPORT"
uptime >> "$REPORT"
echo "" >> "$REPORT"

echo "CPU Info:" >> "$REPORT"
lscpu | grep -E "^CPU\(s\)|^Model name" >> "$REPORT"
echo "" >> "$REPORT"

echo "Current CPU Usage:" >> "$REPORT"
mpstat -P ALL >> "$REPORT"
echo "" >> "$REPORT"

echo "Top 10 CPU Processes:" >> "$REPORT"
ps aux --sort=-%cpu | head -11 >> "$REPORT"
echo "" >> "$REPORT"

echo "Load Average History (today):" >> "$REPORT"
sar -q | tail -20 >> "$REPORT"

mail -s "Daily CPU Report - $(hostname)" [email protected] < "$REPORT"
EOF

chmod +x /usr/local/bin/cpu-report.sh

# Programar diariamente
echo "0 8 * * * /usr/local/bin/cpu-report.sh" | crontab -

Línea Base de Rendimiento

# Crear script de línea base
cat > /usr/local/bin/cpu-baseline.sh << 'EOF'
#!/bin/bash

BASELINE_DIR="/var/log/performance-baseline"
mkdir -p "$BASELINE_DIR"

DATE=$(date +%Y%m%d-%H%M%S)

# Capturar línea base
uptime > "$BASELINE_DIR/load-$DATE.txt"
mpstat -P ALL > "$BASELINE_DIR/mpstat-$DATE.txt"
ps aux --sort=-%cpu | head -50 > "$BASELINE_DIR/processes-$DATE.txt"
sar -u 1 60 > "$BASELINE_DIR/sar-$DATE.txt"

echo "Baseline captured: $DATE"
EOF

chmod +x /usr/local/bin/cpu-baseline.sh

Conclusión

Diagnosticar alto uso de CPU requiere análisis sistemático usando las herramientas correctas. Puntos clave:

  1. Comenzar con lo básico: Usar top y ps para identificación rápida
  2. Usar pidstat para detalle: Estadísticas a nivel de hilo y por proceso
  3. Perfilar cuando sea necesario: perf y gráficos de llama para análisis profundo
  4. Monitorear continuamente: Implementar monitoreo y alertas automatizadas
  5. Comprender métricas: Conocer la diferencia entre tiempo de usuario, sistema y espera
  6. Verificar contexto: Alto uso de CPU no siempre es malo - verificar si es esperado
  7. Documentar líneas base: Conocer cómo se ve lo normal para tus sistemas

El monitoreo regular, la configuración adecuada de aplicaciones y habilidades rápidas de diagnóstico minimizan el impacto de problemas relacionados con CPU. Mantén estos comandos y técnicas disponibles para solucionar rápidamente cuando ocurran cuellos de botella de CPU.