que - servlets java
Mejores prácticas para configurar Apache/Tomcat (3)
Actualmente estamos usando Apache 2.2.3 y Tomcat 5 (incrustado en JBoss 4.2.2) usando mod_proxy_jk
como el conector.
¿Puede alguien arrojar algo de luz sobre la forma correcta de calcular / configurar los valores a continuación (así como cualquier otra cosa que pueda ser relevante). Tanto Apache como Tomcat se ejecutan en máquinas separadas y tienen cantidades abundantes de ram (4 gb cada uno).
Partes server.xml relevantes:
<Connector port="8009"
address="${jboss.bind.address}"
protocol="AJP/1.3"
emptySessionPath="true"
enableLookups="false"
redirectPort="8443"
maxThreads="320"
connectionTimeout="45000"
/>
Partes relevantes de httpd.conf:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 0
</IfModule>
Clientes maximos
Este es el límite fundamental de las conexiones de clientes paralelas que su apache debe manejar de una vez.
Con prefork, solo se puede gestionar una solicitud por proceso. Por lo tanto, todo apache puede procesar a lo sumo $ solicitudes de MaxClients en el tiempo que lleva manejar una sola solicitud. Por supuesto, este máximo ideal solo puede alcanzarse si la aplicación necesita menos de 1 / $ de recursos MaxClients por solicitud.
Si, por ejemplo, la aplicación tarda un segundo de cpu-time para responder una sola solicitud, establecer MaxClients en cuatro limitará su rendimiento a cuatro solicitudes por segundo: cada solicitud utiliza una conexión apache y apache solo manejará cuatro a la vez. . Pero si el servidor tiene solo dos CPU, ni siquiera esto se puede alcanzar, porque cada segundo del reloj de pared solo tiene dos segundos de CPU, pero las solicitudes necesitarían cuatro segundos de CPU.
MinSpareServers
Esto le dice a apache cuántos procesos inactivos deberían esperar. Cuanto mayor sea este número, más carga de ráfaga que apache puede tragar antes de necesitar generar procesos adicionales, lo cual es costoso y, por lo tanto, ralentiza la solicitud actual.
La configuración correcta de esto depende de su carga de trabajo. Si tiene páginas con muchas sub-solicitudes (imágenes, iframes, javascript, css), entonces presionar una sola página puede agotar muchos más procesos por un corto tiempo.
MaxSpareServers
Tener demasiados procesos de Apache sin utilizar se desperdicia memoria, por lo que apache utiliza el número de MaxSpareServers para limitar la cantidad de procesos de repuesto que tiene en reserva para ráfagas de solicitudes.
MaxRequestsPerChild
Esto limita la cantidad de solicitudes que manejará un único proceso durante su vida útil. Si está muy preocupado por la estabilidad, debe poner un límite real aquí para reciclar continuamente los procesos de Apache para evitar que las filtraciones de recursos afecten al sistema.
StartServers
Esta es solo la cantidad de procesos que Apache inicia por defecto. Establezca esto en la cantidad habitual de ejecución de procesos de apache para reducir el tiempo de calentamiento de su sistema. Incluso si ignora esta configuración, apache utilizará los valores Min / MaxSpareServers para generar nuevos procesos según sea necesario.
Más información
Consulte también la documentación de los módulos de procesamiento múltiple de apache .
Debería considerar la carga de trabajo que los servidores podrían obtener.
El factor más importante podría ser la cantidad de clientes conectados simultáneamente en las horas pico. Intente determinarlo y ajustar su configuración de una manera que:
- hay suficientes hilos de procesamiento tanto en Apache como en Tomcat que no necesitan engendrar nuevos hilos cuando el servidor está muy cargado
- no hay mucho más subprocesos de procesamiento en los servidores, ya que desperdiciarían recursos.
Con este tipo de configuración puede minimizar la sobrecarga interna de mantenimiento de los servidores, que podría ayudar mucho, especialmente cuando su carga es esporádica.
Por ejemplo, considere una aplicación en la que tenga ~ 300 solicitudes nuevas / segundo. Cada solicitud requiere un promedio de 2.5 segundos para servir. Significa que en un momento dado tienes ~ 750 solicitudes que necesitan ser manejadas simultáneamente. En esta situación, es probable que desee sintonizar sus servidores para que tengan ~ 750 subprocesos de procesamiento al inicio y es posible que desee agregar algo así como ~ 1000 subprocesos de procesamiento al máximo para manejar cargas extremadamente altas.
También considere exactamente para qué necesita un hilo. En el ejemplo anterior, cada solicitud era independiente de las demás, no se utilizó el seguimiento de sesión. En un escenario más "web-ish", es posible que los usuarios inicien sesión en su sitio web, y según el software utilizado, Apache y / o Tomcat podrían necesitar utilizar el mismo hilo para atender las solicitudes que vienen en una sola sesión. En este caso, es posible que necesite más hilos. Sin embargo, como conozco a Tomcat al menos, no será necesario que tengas en cuenta esto, ya que funciona de todos modos con los grupos de hilos internos.
La configuración predeterminada generalmente es un buen punto de partida para ver qué aplicaciones necesitarán realmente. No sé cuánto tráfico está esperando, así que adivinar MaxThreads, MaxClients y MaxServers es un poco difícil. Puedo decirles que la mayoría de los clientes con los que trato (trabajan para un host web de Linux, que se ocupa principalmente de clientes que ejecutan aplicaciones Java en Tomcat) usan la configuración predeterminada durante bastante tiempo sin necesitar demasiados ajustes.
Si no espera mucho tráfico, estas configuraciones son "demasiado altas" y tampoco deberían afectarlo demasiado. Apache no va a asignar recursos para los 256 clientes potenciales a menos que sea necesario. Lo mismo vale para Tomcat también.