El uso de CPU alto en un servidor VPS casi siempre tiene una causa concreta: un proceso descontrolado, un bot que martilla tu sitio o un script mal optimizado. Identificar ese proceso en menos de dos minutos basta para resolver el problema sin reiniciar nada a ciegas.
¿Por qué sube al 100% la CPU de un VPS?
Un servidor VPS comparte el hardware físico del host mediante virtualización, pero tiene una cuota fija de núcleos de CPU. Cuando esa cuota se agota, las peticiones se acumulan y el sitio se vuelve lento o deja de responder.
Las causas más comunes son:
- Tráfico malicioso o bots de scraping que generan miles de peticiones por minuto.
- Consultas MySQL/MariaDB sin índices que hacen full-table scans repetidos.
- Plugins o scripts PHP con bucles infinitos o fugas de memoria.
- Procesos de indexación (search engines, Elasticsearch) ejecutándose sin límite.
- Tareas cron acumuladas porque la anterior aún no terminó antes de la siguiente ejecución.
- Malware o minería de criptomonedas inyectado en el servidor.
Cómo identificar el proceso culpable
Antes de tocar nada, diagnostica. Conecta por SSH y ejecuta estos comandos en orden:
1. Ver la carga en tiempo real
top -o %CPU
La columna %CPU ordenada de mayor a menor te muestra el proceso más voraz en la parte superior. Anota el PID y el nombre del comando.
2. Profundizar con htop
htop
Si está instalado, htop muestra el uso por núcleo, la carga media (load average) y permite matar procesos sin salir de la vista. Un load average sostenido por encima del número de núcleos disponibles confirma saturación.
3. Detectar procesos Apache/Nginx específicos
ps aux --sort=-%cpu | head -20
Útil cuando hay decenas de procesos de servidor web. Identifica si el problema viene de PHP-FPM, Apache workers o algo completamente ajeno como un script Python o un demonio de terceros.
4. Revisar logs de acceso en busca de bots
tail -n 500 /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
Si ves una IP con cientos de peticiones en pocos segundos, esa IP está generando la carga.
Soluciones paso a paso
Matar el proceso inmediatamente
Si el culpable es un proceso descontrolado que no debería estar corriendo:
kill -15 <PID>
Usa kill -9 <PID> solo si el proceso ignora la señal 15. Reinicia el servicio afectado después de investigar la causa raíz.
Bloquear IPs o bots agresivos
Una vez identificada la IP problemática, bloquéala con iptables:
iptables -A INPUT -s 1.2.3.4 -j DROP
Para soluciones más duraderas, configura fail2ban o activa el WAF de tu panel de control. Si ya tienes Cloudflare delante, un desafío de JS o un bloqueo de IP en el panel es más limpio que una regla de iptables.
Optimizar consultas de base de datos
Activa el slow query log en MariaDB/MySQL:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
Revisa el log resultante y agrega índices a las columnas que aparezcan en los EXPLAIN sin usar índice (type: ALL).
Limitar workers de PHP-FPM o Apache
Si el problema es el propio servidor web generando demasiados procesos, ajusta en php-fpm.conf:
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
El valor de pm.max_children depende de la RAM disponible y el consumo promedio por proceso. Una regla práctica: RAM disponible para PHP ÷ RAM por proceso.
Revisar tareas cron
crontab -l
cat /etc/cron.d/*
Si una tarea pesada se ejecuta cada minuto y tarda más de 60 segundos, se acumula. Agrega un bloqueo de archivo (lock file) o usa flock:
* * * * * flock -n /tmp/tarea.lock /ruta/tarea.sh
Cuándo el problema no tiene solución en el mismo VPS
Si después de optimizar la CPU sigue al límite, el plan de recursos actual ya no alcanza para el tráfico real. En ese momento hay dos caminos: escalar verticalmente (más núcleos en el mismo VPS) o distribuir la carga entre varios servidores.
Para saber si conviene mejorar el VPS actual o contratar uno nuevo, consulta nuestra guía completa de servidores VPS donde comparamos planes por carga de trabajo.
| Síntoma | Causa probable | Solución rápida |
|---|---|---|
| CPU al 100% de forma súbita | Bot / ataque DDoS de capa 7 | Bloquear IP, activar WAF |
| CPU alta solo en horas de tráfico | Falta de caché / queries lentas | Caché de objetos, índices DB |
| CPU alta constante, poco tráfico | Malware / miner | Auditar procesos, escaneo antimalware |
| CPU se dispara en horas específicas | Cron acumulado | Usar flock, revisar duración de tareas |
Buenas prácticas para prevenir picos de CPU
- Instala un sistema de monitoreo (Netdata, Munin o el panel de tu proveedor) y configura alertas por correo cuando la CPU supere el 80% por más de 5 minutos.
- Activa caché de páginas completas (WP Super Cache, Varnish, FastCGI Cache de Nginx) para servir contenido estático sin tocar PHP.
- Configura opcache en PHP para evitar compilar scripts en cada petición.
- Revisa regularmente los plugins instalados: los abandonados o mal codificados son fuente frecuente de bucles.
- Realiza auditorías de seguridad periódicas para descartar malware. Un escáner como
rkhunterochkrootkittarda minutos.
Si el mantenimiento del servidor te quita tiempo que deberías dedicar a tu negocio, en elenlace.com ofrecemos servicios de administración de VPS y optimización de rendimiento para que tú solo te preocupes por crecer.
Conclusiones clave
- El uso de CPU alto en un VPS casi siempre tiene un proceso puntual como responsable;
topyps auxlo revelan en segundos. - Las causas principales son bots, consultas de base de datos sin índices, scripts PHP mal optimizados y tareas cron que se acumulan.
- Matar el proceso, bloquear la IP o corregir la consulta son las tres palancas de alivio inmediato.
- La prevención a largo plazo depende de monitoreo proactivo, caché agresiva y OPcache activado.
- Si la carga persiste tras optimizar, es señal de que el plan de VPS ya se quedó pequeño para el tráfico real.
Preguntas frecuentes
¿Cómo sé si el problema es un ataque o simplemente tráfico legítimo?
Revisa los logs de acceso: el tráfico legítimo suele mostrar variedad de IPs y rutas diversas. Un ataque o bot agresivo se distingue por una misma IP (o rango) golpeando la misma URL decenas de veces por segundo con el mismo User-Agent.
¿Puedo limitar la CPU que usa un proceso concreto?
Sí. Con cpulimit puedes poner un techo: cpulimit -p <PID> -l 30 restringe ese proceso al 30% de un núcleo. También puedes usar cgroups para grupos de procesos, aunque la configuración es más compleja.
¿Reiniciar el servidor soluciona el problema de CPU alta?
Solo temporalmente. Si no identificas y corriges la causa raíz, el proceso volverá a dispararse tras el reinicio. El reinicio es un último recurso para recuperar el servicio de inmediato, no una solución permanente.
¿Cuánta CPU necesita un sitio WordPress típico?
Un WordPress correctamente cacheado con menos de 5 000 visitas diarias funciona bien con 1-2 vCPU. Sin caché, el mismo sitio puede saturar 4 vCPU ante un pico de tráfico. La diferencia la hace el caché de páginas completas y OPcache.
¿Prefieres que lo hagamos por ti? En El Enlace resolvemos hosting y desarrollo web profesional.
Para saber más
Otros proveedores y guías que vale la pena comparar: