Optimisation d'Apache2 prefork MaxClients ServerLimit

22

J'ai une machine avec 128 Go de Ram qui utilise Apache2 comme serveur Web (dans cette machine, il n'y a pas de serveur de base de données, la machine de base de données est une machine Ram de 64 Go qui peut gérer 2000 connexions max). Je vois avec un outil de surveillance qu'il y a actuellement environ 44 travailleurs occupés et 12 travailleurs inactifs, quelles sont les meilleures valeurs théoriques pour mon module de préfork?

j'ai des pages blanches chargeant parfois des sites Web pendant des heures de chargement élevées et j'ai cette erreur sur mon journal d'erreurs apache:

[avis] enfant pid 13595 signal de sortie défaut de segmentation (11)

comment résoudre ce problème aussi?

Configuration de mon module Apache2 Prefork:

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

Free -h sur la www machine :

total: 128 G libres: 97 Go (avec apache2 en cours d'exécution) tampons partagés 0b cache 1,9 G 23 G

Ram utilisé par Apache2 et d'autres programmes:

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
Utilisateur-N
la source
2
Quel est le code d'application qui s'exécute sur le serveur Web? C'est probablement le coupable.
Shane Madden
veuillez envoyer quelques échantillons de l'état d'apache2ctl; y a-t-il quelque chose dans error_log peut-être?
Hrvoje Špoljar

Réponses:

63

Paramètres de préfork Apache, selon les directives de réglage des performances d'Apache

citation:

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.

vous devez le configurer comme ceci en fonction de votre entrée pour:

  • Mémoire totale: 128 Go
  • -10% de mémoire pour tout sauf apache: 115 Go
  • Maintenant, nous devons déterminer la quantité de processus Apache utilisé.

Pour calculer cela, vous pouvez utiliser le script suivant:

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}'

Il s'agit de la meilleure estimation de la quantité de processus Apache unique qui utilise la mémoire tout en essayant de diviser proportionnellement l'utilisation partagée par le nombre de processus Apache actifs et de l'ajouter au-dessus de Pss (taille de jeu proportionnelle).

Enfin, vous divisez 115 Go avec ce chiffre et vous obtenez MaxClients/ServerLimit. De là, vous pouvez calculer relativement d'autres chiffres comme

  • StartServers 30% des MaxClients
  • MinSpareServers 5% des MaxClients
  • MaxSpareServers 10% de MaxClients
  • ServerLimit == MaxClients
  • MaxConnectionsPerChild 10000 (comme alternative conservatrice pour résoudre un problème possible avec des applications qui fuient la mémoire)
Hrvoje Špoljar
la source
2
j'espère que quelqu'un avec plus de points de rep que moi vous donnera le vote pour cette réponse, merci beaucoup!
User-N
2
Votre script de calcul me donne 842,13 Mo. C'est à peu près un ordre de grandeur au-dessus de ce que je voudrais (apache 2.2 sur CentOS 6.7).
Quinn Comendant
1
C'est en mode préfork. Voici la sortie de /server-info: i.imgur.com/SS2gIXI.png
Quinn Comendant
1
@QuinnComendant astucieux mais IfModule sera vrai si le module préfork est disponible (ce qu'il est), et en fait les deux options sont disponibles pour le travailleur et le MPM ... J'ai une utilisation identique du serveur et de la mémoire sur mon système pour le travailleur est ~ 850 Mo. Il n'y a aucun moyen que prefork puisse utiliser pour 1 processus 800 Mo de mémoire. Vous avez modifié la ligne dans le script où elle fait référence au nom du processus apache2 à httpd, n'est-ce pas?
Hrvoje Špoljar
1
@shawn pourquoi diriez-vous cela? comment croyez-vous qu'il devrait être calculé?
Hrvoje Špoljar