l'utilisation de la memory httpd

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

Au fil du time, l'utilisation de la memory dans les process httpd augmente jusqu'à atteindre 100%.

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

 [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é httpd et j'ai lancé free -m nouveau:

 [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 

Donc, redémarrer Apache prend la memory libre de 239 Mo à 894 Mo – ce qui semble être un grand bond en avant.

J'ai passé en mod_wsgi la list des modules Apache actuellement activés (il y en a pas mal) et désactivé / supprimé mod_wsgi et mod_perl (aucun d'entre eux n'est requirejs pour ce server, qui exécute une application Web basée sur PHP, en particulier Magento) .

Basé sur https://servercheck.in/blog/3-small-tweaks-make-apache-fly , j'ai lancé ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}' ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}' ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}' et obtenez 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

Exécuter l'autre outil de diagnostic suggéré pour MaxClients qui est ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}' ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}' ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}' renvoie ce qui suit:

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

Ce server (instance Amazon AWS m1.small ) a 1.7 Gb de RAM. Ainsi donc:

Avez-vous d'autres conseils / suggestions sur la meilleure façon de modifier les parameters httpd ou comment diagnostiquer ce qui pourrait causer cela?

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

  1. Réglez 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 de authz_host_module , log_config_module , expires_module , deflate_module , setenvif_module , mime_module , autoindex_module , dir_module , alias_module , rewrite_module , php5_module , php5_module

  2. Supprimez le packageage mod_ssl car le client n'utilise pas https:// mod_ssl soit.

Je vous ferai un rapport une fois que cette nouvelle configuration aura fonctionné pendant un certain time pour voir si cela résout le problème.

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

J'ai bien peur que l'option MaxRequestsPerChild ait aidé dans votre cas, car elle permet le recyclage des process après un nombre défini de requêtes, de sorte que la fuite de memory est là, mais n'est plus visible.

De plus: MaxClients = ServerLimit * ThreadsPerChild

Dans votre cas, si vous avez besoin de seulement 7 users simultanés (MaxClients = 7), il est tout à fait suffisant avec 2 process (juste au cas où l'on échouera à minimiser les time d'arrêt), donc config peut ê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 dissortingbution de requête plus égale entre 2 process.