Solución 1:
Le di la respuesta a esto en los comentarios sobre El servidor no responde a SSH y HTTP, pero el ping funciona, pero aparentemente no me cree. ¡De verdad, es verdad!
Necesitas talla MaxClients
/ ServerLimit
a su sistema. Las "configuraciones de 5 a 10 para servidores mín./máx." que mencionas son básicamente irrelevantes; esa es solo la cantidad de extra servidores dando vueltas sin hacer nada que Apache retenga.
Para configurar MaxClients de manera adecuada, mire la marca típica de agua alta para su httpd
(o apache2
) procesa, y luego divida su memoria disponible por eso. Lo mejor es descender un poco para dar al resto del sistema espacio para respirar. Dado que tiene 4 GB de RAM y 185 MB de procesos, eso significa que su ServerLimit
el valor debe ser 21 como máximo, probablemente 20 o 19.
Ahora, puede ser que 190 MB sea atípico. Puede configurar ServerLimit más alto, en función de una estimación diferente del uso típico, pero básicamente está apostando a que nunca tendrá un pico. Si sucede, su sistema se quedará sin memoria.
Si puede encontrar una manera de limitar el uso de memoria por trabajador, será una victoria. Apuesto a que este es un caso de PHP Ate My RAM. ¿Puedes codificar tu aplicación para vivir dentro de un memory_limit
inferior? ? Si no puede hacer eso, necesita un modelo diferente bajo el cual ejecutar su PHP. Si no puede hacer eso, necesita comprar más RAM.
Solución 2:
Los servidores MPM prefork de Apache se autogestionan. Siempre comenzará con StartServers
demonios, y nunca ejecutará menos de MinSpareServers
una vez que se pone en marcha. Eventualmente también retirará/eliminará los servidores que superen los MaxSpareServers
si están inactivos el tiempo suficiente (no recuerdo qué es "Lo suficientemente largo" en este contexto, ni si/cómo se puede modificar).
ServerLimit
establece el número máximo de demonios apache que pueden estar ejecutándose en un momento dado. Esta es la razón por la que en su situación puede tener cientos de procesos apache inactivos (se generaron para atender una avalancha de solicitudes y no han estado inactivos el tiempo suficiente para ser asesinado por el proceso madre todavía).
Personalmente, creo que 1250 es un valor bastante alto para ServerLimit
/MaxClients
-- 250 puede ser un número más razonable (aunque esto puede resultar en el error ocasional 503/Servidor ocupado si recibe una avalancha masiva de solicitudes:si eso se convierte en un problema crónico, puede aumentar el número o agregar más servidores para manejar la carga ).
Relacionando esta pregunta con la anterior Re:un bloqueo por falta de memoria, definitivamente siga las instrucciones del Manual de Apache sobre este parámetro:
Most important is that MaxClients be big enough to handle as many simultaneous
requests as you expect to receive, but small enough to assure that there is enough
physical RAM for all processes.
…y mi axioma personal:It's better to give a client a 503 page than knock the server down
. :)
Solución 3:
Apague Keepalives y establezca MaxClients en 150. La razón más probable por la que tiene 260 procesos sentados allí es porque Apache mantiene abiertas las conexiones del navegador porque KeepAlive está activado en su archivo de configuración de Apache.