Qué hacer después de alcanzar las temidas 256 conexiones máximas de Apache Limit

9

Después de rascarme la cabeza tratando de averiguar por qué mi sitio respondía tan lentamente a pesar de que los recursos del servidor están bien, finalmente verifiqué el estado de Apache y descubrí:

78 requests/sec - 0.7 MB/second - 8.5 kB/request
256 requests currently being processed, 0 idle workers

Parece que mi apache está literalmente lleno con conexiones. Cualquier persona que intente visitar mi sitio se pone en una "lista de espera" hasta que Apache vuelva a estar libre.

Parece que tengo dos opciones.

A) Eleve el límite máximo de conexiones por encima de 256. Aunque según este artículo no es tan fácil:

De manera predeterminada, el parámetro MaxClients tiene un límite duro compilado de 256. Sin embargo, esto se puede cambiar volviendo a compilar Apache. Algunas distribuciones, o empresas de alojamiento, elevan este límite a un valor muy alto, como 512 o incluso 1024 para hacer frente a grandes cargas.

B) Localice los scripts que están ocupando demasiado tiempo. Esto me parece mucho más complicado, ya que la mayoría de los procesos de apache simplemente aparecen y luego desaparecen nuevamente. Además, los scripts PHP de mis sitios están optimizados bastante bien ... y una vez más, los recursos del servidor están bien:

Server load 2.69 (8 CPUs)   
Memory Used 25.33% (2,039,108 of 8,048,804) 
Swap Used   1.32% (54,156 of 4,095,992)

¿Qué opción (si alguna de ellas) debo elegir y cómo debo hacerlo?

EDITAR

Más información: Versión del servidor: Apache / 2.2.23 (Unix) mod_ssl / 2.2.23 OpenSSL / 1.0.0-fips DAV / 2 mod_auth_passthrough / 2.1 mod_bwlimited / 1.4 FrontPage / 5.0.2.2635

Conf HTTP: http://pastebin.com/yBeLt6mP

Ejemplo de solicitud parital: http://pastebin.com/vzUVDMPR

Alterne Text-Wrap si los bins de pasta aparecen raros.

kmoney12
fuente
El artículo que citó tiene ~ 6 años. Cambios de software. Ver la respuesta de Shane.
Chris S
1
@ChrisS Aún más desactualizado: el límite compilado era una cosa 1.x (2.0 salió en 2002), y el artículo incluso se vincula explícitamente a los documentos 2.0.
Shane Madden

Respuestas:

10

Ese artículo es inexacto; MaxClientspuede elevarse por encima de 256 cuando se usa el MPM prefork (que es lo que supongo que está usando actualmente según su descripción del problema). De la documentación :

Para servidores sin subprocesos (es decir, prefork), se MaxClientstraduce en el número máximo de procesos secundarios que se iniciarán para atender solicitudes. El valor predeterminado es 256; para aumentarlo, también debes subir ServerLimit.

ServerLimites el que tiene el límite compilado, pero está más allá de donde debería llegar sin que su servidor se encuentre con algún otro cuello de botella. Documentación :

Existe un límite ServerLimit 20000estricto de compilación en el servidor (para el prefork MPM 200000). Esto está destinado a evitar los efectos desagradables causados ​​por errores tipográficos.

Entonces, si desea aumentar el límite de su cliente a algo así como 512, entonces:

MaxClients 512
ServerLimit 512

También debe echar un vistazo a qué MPM está utilizando, ya que los MPM que no sean prefork son mejores para la escala. Ver aquí para más información.

Shane Madden
fuente
Veo que se ejecutan core.c y worker.c httpd -l. Supongo que eso significa que estoy ejecutando trabajador MPM?
kmoney12
@hellohellosharp De hecho - en ese caso, tendrá que ajustar su potencial MaxClients, ServerLimit, ThreadsPerChild, y ThreadLimit. ¿Puede proporcionar su configuración de trabajador actual httpd.conf?
Shane Madden
Sí ... ¿hay algún peligro en publicar esto públicamente? Esperemos que no, aquí está: pastebin.com/yBeLt6mP
kmoney12
No, no hay problemas para publicar la mayoría de los archivos httpd.conf. Solo asegúrate de no tener algo extraño como comentarios con contraseñas / nombres de usuario / etc. Estos a veces se arrastran en las secciones de configuración de proxy y similares. A muchas personas también les gusta editar IP y nombres de dominio, solo para no llamar la atención
Chris S
1
El módulo de estado puede mostrarle estos detalles.
ETL
-1

Sugeriría que use un proxy inverso, algo como nginx o lighttpd puede manejar muchas más conexiones que apache. Dependiendo de cómo usen sus sitios htaccess, también puede usar nginx / lighttpd con fcgi y renunciar completamente a apache.

Shoshomiga
fuente
44
¿¿De Verdad?? ¿Necesita agregar dos líneas de configuración httpd.confy su solución es extraer la mayor parte del software que tiene en funcionamiento y reemplazarlo? Cada pieza de software tiene sus problemas, pero el mal uso sin educación causa peores problemas.
Chris S
En última instancia, nginx puede manejar conexiones más activas, depende del OP decidir qué usar, solo estaba presentando mi sugerencia.
Shoshomiga