Actualmente tengo un servidor Apache2 que se ejecuta con mpm-prefork
y mod_php
en un VPS OpenVZ con 512M de RAM real / 1024M (sin intercambio). Después de ejecutar algunas pruebas, descubrí que el tamaño máximo de proceso que Apache obtiene es de 23M, así que lo configuré MaxClients
en 25 (23M x 25 = 575 MB, está bien para mí). Decidí ejecutar algunas pruebas de carga en mi servidor, y los resultados me dejaron perplejo.
Estoy usando ab
en mi máquina de escritorio solicitando la página principal de un blog de WordPress.
Cuando corro ab
con 24 conexiones concurrentes, todo parece estar bien. Claro, la CPU sube, la RAM libre baja y el resultado es un tiempo de respuesta de 2-3 segundos por solicitud.
Pero si ejecuto ab
con 25 conexiones concurrentes (el límite de mi servidor), Apache simplemente se cuelga después de un par de segundos. Comienza a procesar las solicitudes, luego deja de responder, la CPU vuelve al 100% de inactividad y ab
agota el tiempo de espera. El registro de Apache dice que llegó MaxClients
.
Cuando esto sucede, Apache se mantiene encerrado con 25 procesos en ejecución (todos están en "W" si verifico el estado del servidor) y solo después de la TimeOut
configuración, los procesos comienzan a morir y el servidor comienza a responder nuevamente (en mi caso, está configurado a 45).
Mi pregunta: ¿es ese comportamiento esperado? ¿Por qué Apache simplemente muere cuando llega MaxClients
? Si funciona con 24 conexiones, ¿no debería funcionar con 25, simplemente tomando más tiempo para responder cada solicitud y haciendo cola con el resto?
Me parece un poco extraño que cualquier niño corriendo ab
solo pueda matar un servidor web simplemente configurando las conexiones concurrentes a los servidores MaxClients
.