Optimización del uso de memoria de Apache

11

Apache está utilizando demasiada memoria de mi servidor, lo que hace que se bloquee. Tengo 4 GB de RAM en el servidor.

Estoy tratando de ajustar la configuración de Apache para mejorar su rendimiento, pero soy bastante nuevo en esto.

Estaba tratando de seguir el consejo de este artículo, pero no estoy seguro de cómo calcular las cosas y parece que lo estoy empeorando.

Mi top dice:

11697 apache    15   0  322m  37m 4048 S  0.0  0.9   0:00.52 httpd
13602 apache    15   0  323m  37m 3944 S  0.0  0.9   0:00.50 httpd
11786 apache    15   0  322m  36m 4052 S  0.0  0.9   0:00.50 httpd
12525 apache    15   0  322m  36m 4040 S  0.0  0.9   0:00.63 httpd
11806 apache    15   0  322m  36m 3952 S  0.0  0.9   0:00.42 httpd
11731 apache    15   0  322m  36m 4036 S  0.0  0.9   0:00.46 httpd
11717 apache    16   0  322m  36m 3956 S  0.0  0.9   0:00.54 httpd
11659 apache    15   0  322m  36m 3980 S  0.0  0.9   0:00.49 httpd

Entonces, sería

MaxClients = 3000/ (322-37) = 10

¿Está bien? Además, ¿cuáles deberían ser los valores para los demás parámetros, como MinSpareServers, MaxSpareServers, MaxRequestsPerChild, StartServers, MinSpareThreads, MaxSpareThreads, ThreadsPerChild, MaxRequestsPerChild?

Alguien me ayudaría por favor?

Actualizar

He intentado lo que ustedes han sugerido. Funciona, pero solo por un tiempo. Después de un tiempo después de que se inicia el servidor, el uso de memoria sigue aumentando y nunca disminuye.

Quiero decir, después de iniciar el servidor, supongamos que hay 500 usuarios en línea. El servidor consumirá X RAM. 2 horas después de eso, con los mismos 500 usuarios en línea, el servidor consumirá 10X RAM.

¿Hay alguna forma de evitar esto o tendré que seguir vigilando el servidor y reiniciarlo de vez en cuando?

Secuestrador de almas
fuente
1
al agregar actualizaciones a su pregunta, edite el original en lugar de publicar una respuesta. Esto también tiene la ventaja adicional de volver a colocar la pregunta en la parte superior de la página principal.
Ben Pilbrow

Respuestas:

14

El parámetro principal para ajustar el uso de memoria de Apache será MaxClients. Un valor demasiado bajo y se quedará sin espacios disponibles para atender las solicitudes de los clientes. Demasiados y usará toda su RAM y comenzará a usar el espacio de intercambio que matará el rendimiento (puede parecer un bloqueo del servidor).

Una forma de ajuste MaxClientses observar el uso de memoria del sistema y ajustar la configuración arriba / abajo según sea necesario. Si el servidor comienza a intercambiar, edítelo hacia abajo. Si el servidor tiene memoria libre, póngalo.

También puede estimar el valor máximo mirando el uso de memoria de Apache. Inicie topy presione Mpara ordenar los procesos por memoria. Deberías ver algo como:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18698 apache    17   0  141m  59m  41m S  0.0  1.6   4:57.46 httpd
18591 apache    17   0  141m  59m  41m S  0.0  1.5   4:54.79 httpd
22917 apache    16   0  141m  57m  39m S  0.0  1.5   4:57.44 httpd
18595 apache    16   0  142m  57m  38m S  0.0  1.5   5:23.43 httpd
18697 apache    16   0  139m  56m  41m S  0.0  1.5   5:09.29 httpd
18735 apache    25   0  141m  56m  38m S  0.0  1.5   5:05.32 httpd

Reste las columnas RES y SHR para obtener el uso aproximado de memoria por instancia de Apache. En este caso es de alrededor de 16 MB. Si tengo 4GB de RAM y deseo que se usen 3GB para Apache, la configuración de MaxClients estará alrededor:

MaxClients = 3000/16 = 188

Entonces, en este caso, podría comenzar con un valor de 150-200 pero vería el uso de la memoria y si alguna vez comenzara a acercarse al uso de swap, disminuiría los MaxClients 10-20%. También tenga en cuenta que el valor de 3GB es solo un ejemplo aleatorio. En los servidores que solo ejecutan Apache, podría usar casi todos los 4 GB. En otros casos, es posible que solo desee 1 o 2 GB para Apache, salvo el resto para otras aplicaciones, el sistema o la caché.

Editar: responder preguntas adicionales

Generalmente no hay valores mágicos de MaxClients u otros parámetros de configuración de Apache que harán que su servidor de repente sea dos veces más rápido. Parece que algunos servidores funcionan bien si MaxClients es 10 o 1000. Hay dos casos principales en los que la configuración de MaxClients es "incorrecta":

  • Demasiado bajo : cuando MaxClients es demasiado bajo, llegará a una situación en la que se están utilizando todos los clientes de Apache y las nuevas conexiones entran en cola esperando que el próximo cliente esté disponible. Si habilita el mod_status de Apache, puede obtener una vista en tiempo real de cuántos clientes están ocupados en cualquier momento. Este estado es relativamente fácil de diagnosticar, ya que el sitio se ralentizará en momentos de mucho tráfico y se observará que todos los clientes están en uso.
  • Demasiado alto : cuando MaxClients es demasiado alto, entrará en el caso de agotar toda la RAM y comenzará a usar el intercambio. Cuando esto ocurre, el rendimiento de su sitio caerá esencialmente a cero (considere la diferencia de velocidad entre la RAM y el disco). Este estado puede ser mucho más difícil de observar y diagnosticar, ya que un servidor funcionará bien con un MaxClients alto hasta que experimente un aumento en el tráfico. Por ejemplo, en un sitio que recibe algunas visitas por hora, puedo configurar MaxClients en 1000, mucho más de lo que admite RAM, pero nunca he visto un problema debido a que Apache solo necesita usar uno o dos clientes a la vez. Solo detectaré el problema cuando tenga un aumento en el tráfico, aumentando la cantidad de clientes utilizados simultáneamente, hasta que se agote la RAM y se necesite espacio de intercambio.

Si bien no conozco los detalles de su servidor, aplicación o tráfico, puedo sugerir los siguientes valores de configuración como punto de partida. Pruébelos, controle la carga y el uso del servidor y cambie la configuración según sea necesario.

  • mod_status : habilítelo para que pueda ver el uso de Apache. Para obtener estadísticas más avanzadas, instale una aplicación de monitoreo como Zabbix / Nagios para que pueda rastrear el uso del servidor y los patrones de tráfico.
  • MaxClients : establecido en un valor de 100-200. Comenzaría con un valor más bajo si no estoy seguro y monitorear el uso de memoria / CPU / Apache. Este será el parámetro principal para ajustar.
  • MaxRequestsPerChild : especifica cuándo se reiniciará un cliente / hijo Apache. No hay un valor incorrecto (aunque valores muy pequeños pueden ser ineficientes) y dependerá del contenido que esté sirviendo. Para contenido dinámico, un valor grande distinto de cero (digamos 1000) evitará que sus procesos httpd se vuelvan demasiado grandes.
  • Otros parámetros : si bien no he realizado una evaluación comparativa exhaustiva de los parámetros restantes, deberían tener un efecto relativamente menor a menos que los establezca en valores muy bajos o muy altos. El uso de los valores predeterminados debería estar bien para la mayoría de los sitios. Consulte la documentación del módulo Apache Prefork o Worker para obtener una descripción completa de los parámetros y cuál se utiliza en cada módulo (no tiene sentido intentar ajustar un parámetro que no utiliza).
  • Benchmarking : a medida que ajusta los parámetros, recomendaría usar una herramienta de benchmarking como ab (ApacheBench) o asedio para obtener un número cuantitativo de las capacidades de su servidor. Confiar solo en la sensación o algo peor, ver si se bloquea o no, no es un buen método para ajustar los parámetros de un servidor web.
uesp
fuente
MaxClients ha cambiado de nombre a MaxRequestWorkers a partir de Apache 2.4.
Jastram