Ajuste de Apache2 prefork MaxClients ServerLimit

22

Tengo una máquina con 128 GB de RAM que está usando Apache2 como servidor web (en esta máquina no hay servidor de base de datos, la máquina de base de datos es una máquina de 64 GB Ram que puede manejar 2000 conexiones máximas). Veo con una herramienta de monitoreo que hay actualmente 44 trabajadores ocupados y 12 trabajadores inactivos, ¿cuáles son los mejores valores teóricos para mi módulo prefork?

Tengo páginas en blanco a veces cargando sitios web en horas de carga alta y recibí este error en mi registro de errores de apache:

[aviso] hijo pid 13595 señal de salida Fallo de segmentación (11)

¿Cómo puede resolver este problema también?

Configuración de mi módulo Apache2 Prefork:

StartServers          3
MinSpareServers       3
MaxSpareServers       5
ServerLimit           3200
MaxClients            3100
MaxRequestsPerChild   0

Gratis -h en la máquina www :

total: 128 G libre: 97 GB (con apache2 en ejecución) compartió 0b almacenamientos intermedios 1.9G caché 23G

Ram utilizado por Apache2 y otros programas:

Private  +   Shared  =  RAM used    Program

 96.0 KiB +  61.0 KiB = 157.0 KiB   sh
176.0 KiB +  26.0 KiB = 202.0 KiB   atd
176.0 KiB +  35.5 KiB = 211.5 KiB   acpid
208.0 KiB +  19.5 KiB = 227.5 KiB   mdadm
204.0 KiB +  30.0 KiB = 234.0 KiB   init
248.0 KiB +  62.0 KiB = 310.0 KiB   sendmail
376.0 KiB +  36.0 KiB = 412.0 KiB   dbus-daemon
388.0 KiB + 285.5 KiB = 673.5 KiB   cron (2)
820.0 KiB +  42.0 KiB = 862.0 KiB   gam_server
920.0 KiB + 108.0 KiB =   1.0 MiB   ntpd
968.0 KiB + 243.0 KiB =   1.2 MiB   getty (6)
  1.3 MiB + 351.5 KiB =   1.6 MiB   udevd (3)
  1.5 MiB + 343.0 KiB =   1.8 MiB   sendmail-msp
  2.0 MiB + 910.0 KiB =   2.9 MiB   plugin-localresources2
  3.4 MiB +  50.0 KiB =   3.4 MiB   rsyslogd
  3.6 MiB +  68.5 KiB =   3.7 MiB   bash
  1.9 MiB +   2.1 MiB =   4.0 MiB   sendmail-mta (4)
  3.8 MiB + 556.0 KiB =   4.3 MiB   sshd (2)
  3.7 MiB +   1.2 MiB =   4.8 MiB   plugin-apache2
  5.1 MiB +   1.2 MiB =   6.3 MiB   agent-service
  7.0 MiB + 654.0 KiB =   7.6 MiB   fail2ban-server
  9.6 MiB +   2.6 MiB =  12.2 MiB   proftpd (8)
 59.2 MiB +  70.0 KiB =  59.3 MiB   miniserv.pl
 96.8 MiB +   3.6 MiB = 100.4 MiB   php5-cgi (2)
196.4 MiB +  35.9 MiB = 232.3 MiB   apache2 (40)
---------------------------------
                     tot 450.0 MiB
Usuario-N
fuente
2
¿Cuál es el código de la aplicación que se ejecuta dentro del servidor web? Es muy probable que sea el culpable.
Shane Madden
envíe algunas muestras del estado de apache2ctl; ¿hay algo en error_log quizás?
Hrvoje Špoljar

Respuestas:

63

Configuración de prefork de Apache, pautas de ajuste de rendimiento por apache

citar:

The single biggest hardware issue affecting webserver performance is RAM.
A webserver should never ever have to swap, as swapping increases the latency
of each request beyond a point that users consider "fast enough". 
This causes users to hit stop and reload, further increasing the load.
You can, and should, control the MaxClients setting so that your server does
not spawn so many children it starts swapping. This procedure for doing this
is simple: determine the size of your average Apache process, by looking at
your process list via a tool such as top, and divide this into your total 
available memory, leaving some room for other processes.

debe configurarlo de esta manera según su aporte para:

  • Memoria total: 128 GB
  • -10% de memoria para todo excepto apache: 115 GB
  • Ahora tenemos que averiguar cuánto proceso de apache está usando.

Para calcular esto, puede usar el siguiente script:

pgrep apache2 | xargs -n1 -I{} cat /proc/{}/smaps | \
  awk '{if ($0 ~ /stack/) {pids+=1} else if ($0 ~/^Shared_/) 
    {shared+=$2} else if ($0 ~ /^Pss:/) {priv+=$2}} END {
      printf "%.2f MB\n",(priv+shared/(pids*pids))/1024}'

Esta es la mejor estimación de la cantidad de proceso de apache único que usa la memoria al intentar dividir proporcionalmente el uso compartido por el número de procesos de apache activos y agregarlo encima de Pss (tamaño de conjunto proporcional)

Finalmente divides 115 GB con esta cifra y obtienes MaxClients/ServerLimit. Desde aquí puede calcular relativamente otras cifras como

  • StartServers 30% de MaxClients
  • MinSpareServers 5% de MaxClients
  • MaxSpareServers 10% de MaxClients
  • ServerLimit == MaxClients
  • MaxConnectionsPerChild 10000 (como alternativa conservadora para abordar un posible problema con las aplicaciones con pérdida de memoria)
Hrvoje Špoljar
fuente
2
Espero que alguien con más puntos de representante que yo le dé su voto para esta respuesta, ¡muchas gracias!
Usuario-N
2
Su script de cálculo me da 842.13 MB. Se trata de un orden de magnitud superior a lo que yo haría (apache 2.2 en CentOS 6.7).
Quinn Comendant
1
Está en modo prefork. Aquí está la salida de /server-info: i.imgur.com/SS2gIXI.png
Quinn Comendant
1
@QuinnComendant truco perverso, sin embargo, IfModule será cierto si el módulo prefork está disponible (que es), y en realidad ambas opciones están disponibles para el trabajador y MPM ... Tengo un servidor idéntico y el uso de memoria en mi sistema para el trabajador es ~ 850 MB. No hay forma de que prefork pueda usar para 1 proceso de 800 MB de memoria. Alteraste la línea en el script donde hace referencia al nombre del proceso apache2 a httpd ¿verdad?
Hrvoje Špoljar
1
@shawn, ¿por qué lo dices? ¿Cómo crees que debe calcularse?
Hrvoje Špoljar