Objetivos de aprendizaje
Después de leer este artículo podrás:
- Reconocer CPU steal, throttling y overselling por los números
- Diagnosticar memoria, disco, red y event loop con comandos reales
- Decidir si conviene optimizar el código o cambiar de servidor
En esta página
- ¿Cómo saber si es CPU, memoria, disco o red?
- ¿Qué es el CPU steal y qué es el overselling?
- ¿Qué es el throttling de CPU en un contenedor?
- ¿La aplicación se queda sin memoria?
- ¿Y si la CPU y la memoria tienen margen?
- ¿Cómo encontrar el cuello de botella dentro del código?
- ¿Cuál es el orden correcto para investigar?
- Cómo hacerlo en Square Cloud
- Preguntas frecuentes
"El servidor está lento" no es un diagnóstico, es un síntoma. Detrás hay un recurso saturado (CPU, memoria, disco, red) o un límite impuesto desde fuera (CPU compartida con vecinos, cuota del contenedor). Y a veces no es el servidor: es una consulta sin índice o un bucle que bloquea el proceso.
Cambiar de plan sin medir es el error más caro en este escenario. La investigación de abajo va de lo más barato a lo más difícil, con los comandos que separan cada causa.
¿Cómo saber si es CPU, memoria, disco o red?#
Empieza por lo que la máquina dice de sí misma. En un servidor Linux, tres comandos responden casi todo:
top # línea "%Cpu(s)": us, sy, wa (I/O) y st (steal)
vmstat 1 5 # r (cola de CPU), si/so (swap), wa, st, una línea por segundo
free -m # memoria disponible y uso de swapLéelo así:
- us/sy altos y cola
rmayor que el número de núcleos: CPU saturada. si/sodistintos de cero: el sistema está usando swap, es decir, falta memoria.waalto: procesos esperando al disco.stalto: CPU robada por el hipervisor (siguiente sección).- Todo bajo y la aplicación lenta: el tiempo se va esperando algo externo (base de datos, API, red) o dentro de código que no usa mucha CPU.
¿Qué es el CPU steal y qué es el overselling?#
En un VPS, tu "servidor" es una máquina virtual, y varias VM comparten los mismos núcleos físicos. El campo steal de Linux es, según la página proc_stat del manual, el tiempo dedicado a otros sistemas operativos cuando se ejecuta en un entorno virtualizado: tu VM tenía trabajo que hacer y el hipervisor le dio el núcleo a otra.
El overselling (u overcommit) ocurre cuando el proveedor asigna a los clientes más vCPU que núcleos físicos tiene, apostando a que no todos los usan al mismo tiempo. Es una práctica común en planes baratos, pero cuando los vecinos usan CPU a la vez, tu steal sube. Algunos tipos de instancia también son explícitamente "burstable": AWS describe las instancias T como una CPU base con capacidad de ráfagas por encima de ella, no como CPU completa todo el tiempo.
Cómo diagnosticarlo:
- Ejecuta
vmstat 1 60durante la lentitud y mira la columnast. - Si
stse mantiene alto de forma repetida mientras tu CPU de usuario (us) es baja, el cuello de botella no es tu código. - Repite en horarios distintos. Un steal que desaparece de madrugada y vuelve por la noche apunta a un vecino ruidoso.
La corrección no está en tu aplicación: es cambiar de tipo de instancia (CPU dedicada), de región o de proveedor. Antes, abre un ticket con los números, que es la prueba que pide el soporte.
¿Qué es el throttling de CPU en un contenedor?#
En contenedores hay otra causa que parece steal pero no lo es. El contenedor recibe una cuota de CPU: en cgroup v2, el archivo cpu.max define cuánto tiempo de CPU puede usar el grupo por período (el valor por defecto es max 100000, sin límite). Al pasar la cuota, el kernel pausa los procesos hasta el siguiente período, y eso se ve como picos de latencia.
Dentro del contenedor, revisa:
cat /sys/fs/cgroup/cpu.max # ej.: "50000 100000" = medio núcleo
cat /sys/fs/cgroup/cpu.stat # nr_throttled y throttled_usec creciendo = throttlingSi nr_throttled crece mientras la aplicación está lenta, el límite de CPU del contenedor es el cuello de botella. Sube el límite o reduce el trabajo por petición. A diferencia del steal, aquí la solución está en tus manos.
¿La aplicación se queda sin memoria?#
La falta de memoria suele manifestarse de dos formas. La primera es lentitud por swap: el sistema mueve páginas al disco y todo se ralentiza, y vmstat muestra si/so activos. La segunda es que el proceso muere: el kernel termina procesos que superan el límite del contenedor y el contador oom_kill de memory.events sube.
cat /sys/fs/cgroup/memory.events # oom_kill > 0: algo se terminó por falta de memoriaUna señal clásica es que la aplicación se vuelve más lenta con el paso de las horas y vuelve a la normalidad tras un reinicio: eso es una fuga de memoria o una caché sin límite. Aprende a medir el pico y dimensionar con margen en ¿Cuánta RAM y CPU necesita mi aplicación?.
¿Y si la CPU y la memoria tienen margen?#
Entonces el tiempo se va esperando. Los sospechosos, por orden de frecuencia:
- Base de datos: consulta sin índice, N+1 (una consulta por cada elemento de una lista) o una conexión abierta en cada petición. Activa el log de consultas lentas de tu base de datos y mide el tiempo de cada una.
- API externa: una llamada lenta a un tercero dentro del camino de la petición. Ponle timeout y, cuando puedas, sácala del camino crítico.
- Disco:
waalto envmstat, oiostat -x 1(paquetesysstat) con el disco saturado. Los logs excesivos, los archivos temporales grandes y las bases de datos en discos lentos son los culpables típicos. La página del manual advierte que el valor de iowait es poco fiable, así que úsalo como pista, no como prueba. - Distancia: latencia de red entre la aplicación y la base de datos, o entre el servidor y el usuario. La aplicación y la base de datos deben estar en el mismo datacenter, y el contenido estático gana mucho con un CDN.
¿Cómo encontrar el cuello de botella dentro del código?#
En Node.js, el síntoma típico es el event loop bloqueado: un bucle pesado o una operación síncrona impide que el proceso atienda cualquier otra petición. El módulo perf_hooks mide ese retraso directamente:
// event-loop.js: imprime el retraso del event loop cada 5 segundos
const { monitorEventLoopDelay } = require("node:perf_hooks");
const h = monitorEventLoopDelay({ resolution: 20 });
h.enable();
setInterval(() => {
const ms = (ns) => (ns / 1e6).toFixed(1);
console.log(
`event loop: media=${ms(h.mean)} ms p99=${ms(h.percentile(99))} ms máx=${ms(h.max)} ms`,
);
h.reset();
}, 5000);Los valores vienen en nanosegundos, por eso la división entre 1e6. Con la CPU libre, un p99 de cientos de milisegundos indica código que bloquea el loop. En Python, el equivalente es un profiler como cProfile ejecutándose unos minutos bajo carga. El patrón es el mismo: mide a dónde va el tiempo antes de cambiar una sola línea.
Registra también la duración de cada petición en los logs. Con la duración y la ruta en cada línea, el cuello de botella suele aparecer solo, y leer los logs de la aplicación es el siguiente paso cuando los números por sí solos no lo explican.
¿Cuál es el orden correcto para investigar?#
- Confirma el síntoma con un número: tiempo de respuesta por ruta, no "parece lento".
top/vmstat: CPU, steal, swap, iowait.- Cgroup (
cpu.stat,memory.events) si estás en un contenedor. - Base de datos y APIs externas: consultas lentas y timeouts.
- Profiler en el código.
- Solo entonces cambia de plan o de servidor, y vuelve a medir para confirmar que mejoró.
Si el steal es la causa, la elección entre VPS y plataforma cambia: consulta VPS o nube: qué conviene a tu proyecto para comparar lo que aísla cada modelo.
Cómo hacerlo en Square Cloud#
En Square Cloud, las aplicaciones se ejecutan en contenedores aislados, siempre encendidos, sin cold start ni modo de suspensión, en un datacenter Tier 3 en Nueva York con procesadores Intel Dual Xeon de 3 GHz o más y almacenamiento NVMe. Sigues los logs en tiempo real en el panel, la CLI, VS Code y la app móvil, y las métricas de CPU, RAM y red se registran cada 5 minutos y se guardan durante 24 horas.
Si la falta de memoria es la causa, cambias la RAM de cada aplicación en la configuración o por la API. La RAM del plan es un pool compartido entre tus aplicaciones, con un mínimo de 256 MB por aplicación en segundo plano y 512 MB por aplicación web. El vCPU del plan es el techo por entorno, calculado a partir de la RAM asignada.
El hosting de bases de datos (desde el plan Standard) está en el mismo datacenter que las aplicaciones, con alrededor de 1 ms de latencia media, lo que saca la distancia entre aplicación y base de datos de la lista de sospechosos. En los planes Pro y Enterprise, la analítica muestra la latencia en p50, p95 y p99, además de los logs HTTP, para que encuentres las rutas lentas.
No hay autoscaling: tú decides cuándo subir la RAM o repartir la carga con load balancing, poniendo el mismo dominio personalizado en varias aplicaciones (desde el plan Standard). Mira los recursos de logs, métricas y escalado.
Deploy
Sube desde GitHub, la CLI o un ZIP y publica en segundos
Preguntas frecuentes
¿Qué es el CPU steal?
Es el tiempo en que tu máquina virtual quería usar la CPU, pero el hipervisor se la dio a otra máquina virtual. Aparece como st en top y en vmstat y solo existe en entornos virtualizados.
¿Cómo sé si mi servidor sufre overselling de CPU?
Con la aplicación lenta y tu uso de CPU bajo, mira el steal. Valores altos y repetidos indican que los núcleos físicos están disputados por vecinos. Mide en horarios distintos, porque la disputa cambia a lo largo del día.
¿Más RAM hace que la aplicación sea más rápida?
Solo si la falta de memoria es el problema, por ejemplo con swap activo o procesos terminados por falta de memoria. Si te sobra RAM, contratar más no cambia la velocidad.
La aplicación solo es lenta en la primera petición. ¿Por qué?
Suele ser una inicialización perezosa (conexión con la base de datos, cachés vacías) o un proceso que se terminó y tiene que arrancar de nuevo. Mantén el proceso encendido y calienta las conexiones al inicio.
Más en Deploy
Ver los 33 artículos- Qué son las variables de entornoLas variables de entorno son pares clave-valor que el sistema operativo entrega a un proceso al iniciar. Aprende a leerlas en Node.js y Python sin exponer tokens.
- Qué es un deploy o despliegueUn deploy o despliegue lleva una versión de tu código a un servidor, la prepara y la pone en marcha. Conoce las etapas, los métodos y cómo hacer rollback.
- ¿Cuánta RAM y CPU necesita mi aplicación?Dimensiona RAM y CPU midiendo el pico real de la aplicación y sumando un margen del 30%. Mira cómo medir en Node.js, Python y Java y qué hacer cuando falte.
- Deploy automático con GitHub ActionsEl deploy automático con GitHub Actions envía tu código al servidor en cada push. Mira el workflow paso a paso, los secrets, las pruebas y los errores comunes.