Valores óptimos para las directivas ServerLimit, MaxClients, MaxRequestsPerChild

29

Estoy ejecutando un sitio de tráfico intenso con mucho contenido dinámico, principalmente generado por el usuario.

El servidor es dedicado y tiene un total de 4 procesadores Intel (R) Xeon (R) CPU X3210 @ 2.13GHz. Necesito conocer los valores óptimos para las directivas de Apache ServerLimit y MaxClients, teniendo en cuenta que el servidor tiene 4 GB de RAM y la base de datos MySQL se ejecuta en un servidor separado. El panel es DirectAdmin con CentOS.

A continuación se encuentran mis directivas actuales, pero durante las horas pico con más de 5k usuarios, se nota un retraso importante, y no es completamente culpa de MySQL, porque las páginas parecen generarse rápidamente (implementé un contador de tiempo de generación de páginas), pero hay un largo retraso de conexión hasta que la página comience a responder y se envíe al navegador.

<IfModule prefork.c>
    StartServers     800
    MinSpareServers   20
    MaxSpareServers   60
    ServerLimit      900
    MaxClients       900
    MaxRequestsPerChild  2000
</IfModule>
Timeout 90
KeepAlive On
KeepAliveTimeout 5

Debo mencionar que al monitorear el servidor usando el comando superior, el uso de la CPU nunca va más allá del 20% ~ 30% en la hora pico. El servidor MySQL también tiene un uso del 30 ~ 50% en ese momento, y estoy trabajando constantemente para solucionar consultas lentas, pero ese es un problema diferente. Sé que no es un cuello de botella de DB porque las páginas estáticas también tardan mucho en cargar en las horas pico.

Cualquier consejo para optimizar estos valores será muy apreciado, gracias.

andreszs
fuente

Respuestas:

24

Su MaxClients es WAY WAY WAY demasiado alto. ¿Cuál es el tamaño actual de su proceso de apache? Multiplique eso x 900. ¿Es mayor que 4 GB? Si es así, es probable que la máquina se cambie. Normalmente comienzo con MaxClients = 2x vCPU en el cuadro (grep -c procesador / proc / cpuinfo). Que en este caso sería de aproximadamente 8. Luego, asegúrese de que el tamaño del proceso MaxClients x apache no supere los 4 GB.

Puede subir sus MaxClients desde allí, dependiendo del tipo de conexión que tengan sus clientes. (Los usuarios de acceso telefónico necesitan una cuchara, etc.) Pero asegúrese de nunca meterse en una situación de intercambio.

Luego configure sus servidores Min, Max e Start en MaxClients. No hay necesidad real de que difieran en un entorno de servidor dedicado.

Luego haga algunas pruebas con ab (como notas de ganso).

carro derribado
fuente
Por alguna razón, parece que determiné el tamaño del proceso incorrectamente ... ahora veo en el comando superior que los procesos de apache de TAMAÑO RESIDENTE oscilan entre 10 y 15 MB. Leí en alguna parte que, dado que las bibliotecas compartidas están incluidas en este número, el tamaño "real" es la mitad de ese tamaño. Considerando esto, debo calcular que puedo acomodar 570 procesos de 7 MB de tamaño cada uno, ¿crees que esto es correcto?
andreszs
Le sugiero que use 15 MB para los cálculos y luego comience a verificar las métricas: # proceso de http vs. uso de memoria. Esto le dará una mejor idea del número de MaxClients
hdanniel
1
Lo bajé a 400 e incluso antes de la hora pico, el resultado tuvo el efecto contrario al deseado: cualquier valor inferior al original crea tiempos de espera y largos retrasos. De hecho, ahora lo aumenté a 1500 clientes y el uso de memoria ahora es de 3 GB, mientras que el uso promedio de la CPU es del 8%. Por supuesto, ahora hay más carga en el servidor SQL y tendré que trabajar en eso.
andreszs
Aquí está mi comando htop ahora, 1500 procesos de apache y casi 100 procesos del sistema. Esto con un 75% de uso de RAM. a.imagehost.org/0011/htop.png ¿Debería reconsiderar su fórmula? ;)
andreszs
1
Es por eso que necesita hacer pruebas en su propio entorno. Tenemos aceleradores http en frente de nuestros apaches, por lo que no están alimentando a los usuarios móviles. Su aplicación también parece ser muy ligera. Si ha movido la carga a su base de datos, eso me dice que más de esos procesos de apache en realidad están sirviendo datos frente a sentarse y esperar una conexión mysql. ¿Qué me lleva a preguntar cuántas conexiones está permitiendo a su base de datos? ¿Ese número excede sus MaxClients? ¿Tienes 5,000 conexiones simultáneas? Si es así, es posible que desee ver algo como perlbal en el frente.
toppledwagon
5

Necesita obtener el tamaño promedio de su proceso de apache. Con este número y el tamaño total de su RAM, puede calcular la directiva MaxClients. Recuerde esto: "Un servidor web nunca debería tener que intercambiar" ( Apache Performance Tuning )

Monitorear con top o htop está bien, pero necesita una mejor vista de todas las estadísticas de sus servidores (CPU, RAM, E / S de disco, solicitudes de Apache, consultas lentas de MySQL, etc.) con alguna herramienta de monitoreo como ganglia o munin para encontrar posibles cuellos de botella.

hdanniel
fuente
Por el momento solo tengo los comandos top y htop, y no puedo entender toda su información de todos modos. Esta es la actividad de ayer en la hora pico, parece que no hay intercambio; dígame si me equivoco: Tareas: 1043 en total, 2 en ejecución, 1041 durmiendo, 0 detenidas, 0 CPU (s) zombie: 13.8% us, 1.8% sy, 0.0% ni, 82.1% id, 0.8% wa, 0.0% hi, 1.5% si, 0.0% st Mem: 4138360k total, 3961276k usado, 177084k gratis, 75016k buffers Swap: 2031608k total, 1484k usado, 2030124k gratis, 1836600k en caché
andreszs
Sí, su servidor no está intercambiando. Prefiero las métricas de la vida real, pero si lo desea, puede usar una herramienta estresante como ab o httperf para verificar cuánto puede manejar su servidor. Para las pruebas, cuide a MaxClients y comience con un número bajo (basado en la suposición de 15 MB).
hdanniel
4

Recomiendo jugar con la herramienta de referencia (ab) de apache. Puede jugar con los valores para que coincidan con su flujo de tráfico y ver qué tipo de respuestas está obteniendo en cuanto al tiempo promedio de carga y similares. En ese momento, puedes jugar con la configuración de la que estás hablando para intentar optimizarla. Debería ser capaz de controlar el rendimiento óptimo de cada ajuste de rendimiento con ab.

Realmente no sería prudente para mí hablar sobre su configuración, sin embargo, también debe tener en cuenta su RAM porque parece que está comiendo mucha RAM con esa configuración. Aunque eso es solo especulación sin ningún dato. htop le brinda una buena lectura visual de sus recursos.

También su promedio de carga podría decir mucho. Dudo que su uso sea mucho más alto que su cantidad total de núcleos de 20-30% de CPU, pero es otro indicador de cuán duro está trabajando realmente su servidor.

ganso
fuente
El problema es que no tengo suficiente experiencia en la administración de servidores, así que comience a jugar con los ajustes y supervise los resultados. Nunca he usado la herramienta ab para ser honesto. También cambiar los valores requiere reiniciar HTTDP, lo que causa inconvenientes a mis usuarios, por lo que prefiero evitar esto. Imagine que está enviando un mensaje a otro usuario y después de hacer clic en "Enviar", aparece un problema de conexión con el servidor. Sobre el uso de la CPU, vea la información de mi comentario anterior: no debe ir más allá del 15% en la hora pico. Creo que eso es bastante aceptable teniendo en cuenta que ayer tuve 6000 usuarios en línea.
andreszs
Bueno, definitivamente no quiero que hagas esto en un entorno de producción. Recomiendo hacer esto en su tiempo de tráfico más bajo si otro servidor (con hardware muy similar si no idéntico) para probar. ab es bastante fácil de usar, pero definitivamente creo que toppledwagon dio una buena instrucción para calcular sus MaxClients. Una vez que deje de usar el espacio de intercambio, verá una mejora definitiva. comprobar httpd.apache.org/docs/2.0/programs/ab.html y cyberciti.biz/tips/... para AB
ganso