Utilisation de la mémoire httpd

13

Avoir des problèmes avec l' utilisation de la mémoire httpd( Apache/2.2.29).

Au fil du temps, l'utilisation de la mémoire dans les httpdprocessus augmente jusqu'à ce qu'elle atteigne finalement 100%.

La dernière fois que j'ai redémarré, httpdc'était il y a environ 24 heures. La sortie de free -mest:

[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655       1415        239          0        202        424
-/+ buffers/cache:        788        866
Swap:         1023          4       1019

Pour prouver que c'est définitivement httpd, j'ai redémarré httpdet j'ai couru à free -mnouveau:

[ec2-user@www ~]$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655        760        894          0        202        360
-/+ buffers/cache:        197       1457
Swap:         1023          4       1019

Ainsi, le redémarrage d'Apache prend de la mémoire libre de 239 Mo à 894 Mo - ce qui semble être un grand saut.

J'ai parcouru la liste des modules Apache actuellement activés (il y en a beaucoup) et désactivé / supprimé mod_wsgietmod_perl (aucun d'entre eux n'est requis pour ce serveur, qui exécute une application Web basée sur PHP - Magento, en particulier).

Basé sur https://servercheck.in/blog/3-small-tweaks-make-apache-fly , j'ai exécuté ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'et obtenu la sortie suivante:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}' 15.1328 MB 118.09 MB 127.449 MB 129.059 MB 117.734 MB 113.824 MB 125.062 MB 123.922 MB 119.855 MB 108.066 MB 136.23 MB 114.031 MB 113.27 MB 110.695 MB 102.113 MB 113.234 MB 186.816 MB 118.602 MB 0.835938 MB

L'exécution de l'autre outil de diagnostic suggéré pour MaxClientslequel ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'renvoie les éléments suivants:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
110.212 MB

Ce serveur ( m1.smallinstance Amazon AWS ) dispose 1.7 Gbde RAM. Ainsi donc:

Avez-vous d'autres pointeurs / suggestions sur la meilleure façon de modifier les httpdparamètres ou de diagnostiquer exactement ce qui pourrait en être la cause?

James Spittal
la source
Notez que pour vérifier l'utilisation de la mémoire par les processus, vous devez regarder la -/+ buffers/cacheligne; cependant, dans ce cas, le changement est comparable. Selon la façon dont apache a été réglé, il peut commencer avec seulement quelques processus prêts à traiter les demandes; après une période de nombreuses demandes simultanées, il y aura probablement plus de processus bifurqués pour gérer la charge. Le nombre de processus inactifs peut également être réglé. Donc, si apache se développe pour utiliser trop de mémoire, vous devez faire quelques réglages.
wurtel
Je suis d'accord sur la configuration du serveur Apache mais je n'ai pas fait énormément de réglages des performances pour Apache dans le passé. Avez-vous des suggestions sur les directives à consulter ou les guides? Existe-t-il un paramètre de configuration que je peux activer pour dire à Apache de tuer les processus fourchus après un certain temps? (Il semble qu'Apache ne le fasse pas par défaut pour une raison quelconque.)
James Spittal
C'est la raison exacte pour laquelle je me suis éloigné d'Apache ... essayez Nginx ou même Lighttpd.
Intéressant. J'ai entendu de bonnes choses, nginxalors il est peut-être temps d'essayer, mais honnêtement, j'utilise Apache depuis des années et je n'ai jamais eu de problème majeur. Magento mâche vraiment la mémoire.
James Spittal
Notez que votre script pour calculer l'utilisation moyenne de la mémoire inclut la faible utilisation de la mémoire du grep httpdprocessus (au moins pour moi). Pour résoudre ce problème, je recommanderais d'exclure cette ligne du calcul comme ceci:ps aux | grep 'httpd' | grep -v grep | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
MaPePeR

Réponses:

11

Voici ce que j'ai fait pour le «résoudre»:

  1. Set MaxClients 7(basé sur (1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7.5747747747747747747747747747748)

Donc:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients         7
MaxRequestsPerChild  4000
</IfModule>
  1. Désactiver tous les modules Apache à l' exception authz_host_module, log_config_module, expires_module, deflate_module, setenvif_module, mime_module, autoindex_module, negotiation_module, dir_module, alias_module, rewrite_module,php5_module

  2. Supprimez le mod_sslpackage car le client n'utilise pas du https://tout.

Je ferai rapport une fois que cette nouvelle configuration aura fonctionné un certain temps pour voir si cela le résout.

Une inspiration ici a été empruntée à: http://www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/ et http://www.activoinc.com/ téléchargements / httpd.conf-magento

James Spittal
la source
La configuration ci-dessus a certainement aidé massivement.
James Spittal
1
Quelques jours plus tard, les problèmes de «fuite de mémoire» httpdsemblent avoir complètement disparu.
James Spittal
2

Je crains que l'option MaxRequestsPerChild ait aidé dans votre cas, car elle permet le recyclage des processus après un nombre défini de demandes, donc une fuite de mémoire est là, mais n'est plus visible.

De plus: MaxClients = ServerLimit * ThreadsPerChild

Dans votre cas, si vous n'avez besoin que de 7 utilisateurs simultanés (MaxClients = 7), cela suffit totalement avec 2 processus (juste au cas où l'un ne parviendrait pas à minimiser les temps d'arrêt), la configuration peut donc être:

<IfModule prefork.c>
StartServers       2
MinSpareServers    2
MaxSpareServers   20
ServerLimit        2
MaxClients         8
ThreadsPerChild    4
MaxRequestsPerChild  4000
</IfModule>

J'utilise MaxClients 8 , juste pour faire une distribution de demande plus égale entre 2 processus.

Igor Levkov
la source