Todo empieza con una pregunta: ¿qué hacen esos usuarios? Mil personas conectadas a una aplicación no hacen mil peticiones por segundo, y una página servida desde una caché cuesta cien veces menos que una página calculada. Esta guía traduce usuarios en peticiones, peticiones en procesador y memoria, y después muestra cómo verificarlo con una prueba de carga.
«Usuarios simultáneos» designa tres magnitudes distintas según quién hable:
Se pasa de una a otra con la ley de Little: el número de peticiones en curso es igual al caudal, en peticiones por segundo, multiplicado por la duración media de una petición.
Ejemplo. 600 usuarios activos al mismo tiempo, que lanzan cada uno una petición cada 20 segundos, generan 30 peticiones por segundo. Si cada petición dura 100 ms, el servidor solo tiene 3 peticiones en curso de media. Lo que está en juego se encuentra en otra parte: en los picos y en las peticiones lentas.
Una petición ocupa el procesador durante su cálculo: ejecutar el código, consultar la base de datos, construir la respuesta. Un vCPU procesa, por tanto, como máximo 1000 ÷ t peticiones por segundo, donde t es el tiempo de cálculo de una petición en milisegundos. El tiempo de espera (una API externa, un disco) deja libre el procesador, pero sí ocupa un worker.
| Tipo de petición | Tiempo de cálculo típico | Por vCPU, orden de magnitud |
|---|---|---|
| Archivo estático, o página servida desde una caché | Menos de 1 ms | Varios miles de peticiones por segundo |
| Página WordPress servida por una caché de páginas | 1 a 5 ms | Varios cientos por segundo |
| API JSON (Node.js, Go, FastAPI) con una consulta SQL indexada | 5 a 20 ms | 50 a 200 por segundo |
| Página WordPress o Laravel calculada en cada visita | 100 a 300 ms | 3 a 10 por segundo |
| Informe, exportación, generación de PDF | 500 ms a varios segundos | Menos de 2 por segundo |
Con estos órdenes de magnitud, 30 peticiones de API por segundo a 10 ms de cálculo ocupan el 30 % de un solo vCPU. Las mismas 30 peticiones por segundo sobre páginas WordPress sin caché piden de 3 a 9 vCPU. La caché de páginas sirve precisamente para que una página pase de la cuarta fila de la tabla a la segunda.
Cada petición en curso la atiende un worker, y los workers ocupan memoria, trabajen o no. A menudo es la memoria, más que el procesador, la que fija el número de peticiones procesadas en paralelo:
pm.max_children fija el tope: 20 procesos son de 800 MB a 1,6 GB.max_connections.Las conexiones persistentes (websockets, notificaciones en tiempo real) se cuentan aparte: abiertas de forma permanente, ocupan poco procesador y unas decenas de kilobytes de memoria cada una. Un servidor Node.js mantiene miles de ellas en unos cientos de MB.
En una aplicación real, el servidor rara vez se satura donde se espera. Las causas más frecuentes, en el orden en que conviene buscarlas:
pg_stat_statements en PostgreSQL, o el registro de consultas lentas de MySQL, la señala.Los órdenes de magnitud dan un primer tamaño; una prueba de carga da el real. El principio: simular usuarios cada vez más numerosos sobre una copia de la aplicación, y anotar el momento en que el tiempo de respuesta se dispara.
wrk -t2 -c50 -d30s --latency https://preprod.su-sitio.com/
Para un recorrido completo (inicio de sesión, navegación, búsqueda), k6 describe un escenario en JavaScript y hace subir la carga por escalones:
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 100 },
{ duration: '5m', target: 100 },
{ duration: '2m', target: 300 },
{ duration: '5m', target: 300 },
{ duration: '2m', target: 0 },
],
thresholds: { http_req_duration: ['p(95)<500'] },
};
export default function () {
http.get('https://preprod.su-sitio.com/');
sleep(15);
}
htop para el procesador, free -h para la memoria, los registros para los errores.El orden que menos cuesta y más aporta:
Las tres primeras etapas cubren la gran mayoría de las aplicaciones de gestión, los sitios web y las API: varios cientos de usuarios activos al mismo tiempo caben en un solo servidor bien ajustado.
El VPS Pro se ofrece en seis tamaños, sobre procesadores Intel Xeon, memoria ECC y SSD NVMe en espejo, y pasa al tamaño superior en cualquier momento, sin reinstalación. La Asistencia integral está incluida: díganos cuántos usuarios espera en el lanzamiento y dentro de un año, y le aconsejamos el tamaño; y cuando una página se ralentiza, diagnosticamos y le indicamos qué hacer, desde el sistema hasta el código de su aplicación.
Para una API o una aplicación cuyas peticiones requieren de 10 a 20 ms de cálculo, varios cientos de usuarios activos al mismo tiempo. Para un sitio WordPress sin caché de páginas, un centenar aproximadamente. La diferencia depende del tiempo de cálculo de cada petición y de la caché, de ahí el interés de una prueba de carga.
El número de visitas al día dice poco: lo que cuenta es el pico. Para pasar de una cifra a otra, divida las visitas del día entre las horas de actividad, multiplique por las páginas vistas por visita y, después, por un factor de pico de 3 a 5. Así, 10 000 visitas en 10 horas, a 4 páginas cada una, dan alrededor de 1 página por segundo de media, y de 3 a 5 en el pico.
Tres señales: el tiempo de respuesta sube con el tráfico, el procesador se mantiene por encima del 80 % en horas punta, o la memoria disponible cae cerca de cero. Los registros del servidor web muestran entonces errores 502 o 504, y las peticiones esperan a que quede libre un worker.
Sí: una conexión websocket permanece abierta de forma continua. Consume poco procesador y unas decenas de kilobytes de memoria. Un servidor Node.js mantiene miles de ellas; son los mensajes enviados, más que las conexiones abiertas, los que cargan el procesador.
Simafri
Hablemos de su proyecto
Díganos en pocas palabras lo que necesita: le respondemos rápidamente.
¡Gracias! Su solicitud ha sido enviada. Le responderemos en breve.
¿Prefiere el correo? Escríbanos a support@simafri.com.