1 votes

Réduire l'utilisation de la mémoire d'apache VIRT et RES

Sur un serveur quadricœur avec 8 Go de mémoire vive, j'ai des processus Apache qui utilisent jusqu'à 2,3 Go de mémoire RES et 2,6 Go de mémoire VIRT. Voici une copie du fichier top -c command : Top command

Existe-t-il un moyen de réduire l'utilisation de la mémoire pour ces processus apache ?

Ce sont mes httpd.conf des paramètres :

Timeout 160
TraceEnable Off
ServerSignature Off
ServerTokens ProductOnly
FileETag None
StartServers 6
<IfModule prefork.c>
MinSpareServers 4
MaxSpareServers 16
</IfModule>
ServerLimit 400
MaxClients 320
MaxRequestsPerChild 10000
KeepAlive On
KeepAliveTimeout 4
MaxKeepAliveRequests 80

Nota : Il semble y avoir un délai de connexion. De plus, si 16 connexions utilisent 8GB ou de la mémoire vive. J'ai un peu peur que si mon serveur reçoit 300 connexions, il se déconnecte. En outre, dans Munin, je peux voir la mémoire engagée passer de quelques Go à 80 Go en l'espace de deux semaines. A chaque redémarrage d'apache, elle redescend à quelques Go.

1voto

jcollum Points 10236

La mémoire d'Apache est utilisée par les modules et par la mémoire utilisée par les modules. Désactivez les modules inutilisés et pour voir quels sont les modules restants que vous devez régler, utilisez pmap <PID> pour voir comment la mémoire a été allouée. Utiliser dmalloc y valgrind pour déboguer les problèmes d'allocation de mémoire restants.

0voto

robert Points 143

Il s'agit d'une utilisation anormalement élevée de la mémoire. Il se peut qu'il y ait un fuite de mémoire .

Pour l'instant, essayez de mettre à jour votre installation d'Apache2 (y compris les modules) et réduisez le nombre de MaxRequestsPerChild c'est-à-dire à 500. Ce dernier paramètre réduit essentiellement la durée de vie maximale des sous-processus Apache2 en termes de "requêtes traitées". En d'autres termes, s'il y a des fuites de mémoire, elles ne s'accumuleront pas de manière aussi importante.

0voto

Ryan Sampson Points 2898

La suppression des modules inutiles est la solution de base au problème, mais il faut utiliser un nombre impressionnant de modules pour que le processus Apache prenne 2 Go de RAM. Il est beaucoup plus probable que vous ayez des modules de code dynamique (tels que mod_php ) qui exécute un méchant code qui fuit, ou bien un module qui est mal codé et qui fuit lui-même de la mémoire.

Vous pouvez déposer MaxRequestsPerChild à quelque chose d'assez petit, ou vous pouvez faire le travail correctement et trouver les fuites de mémoire. Une solution intermédiaire consiste à pousser l'exécution du code dynamique dans un processus séparé (en utilisant suPHP, suexec, php-fpm, etc.), ce qui est de toute façon une bonne idée pour des raisons de sécurité.

0voto

Giacomo1968 Points 3512

Je ne sais pas quel type de trafic vous observez qui nécessiterait de tels paramètres, mais il semble que vos paramètres pourraient être réduits pour faire un meilleur usage des ressources puisqu'il semble que vous surchargez Apache dès le départ et qu'il n'est pas configuré pour un trafic de site réaliste. A moins que vous ne puissiez fournir des statistiques sur le site qui justifient les chiffres élevés de la configuration initiale.

La clé est MaxRequestsPerChild ce qui permettra d'éviter les fuites de mémoire en faisant réapparaître les processus parents plus souvent. J'ai également abaissé la valeur de ServerLimit y MaxClients puisqu'il s'agit du nombre de clients connectés PAR SECONDE. Donc, si quelqu'un saisit une page de votre site et qu'elle est affichée en 1 seconde, devinez quoi ? Le serveur a fait son travail. Dans le même ordre d'idées, j'ai abaissé MaxKeepAliveRequests et le KeepAliveTimeout pour redevenir plus réaliste. J'ai également abaissé le Timeout puisque 120 secondes correspondent à 2 minutes. Si un client met 2 minutes à obtenir du contenu de votre part, c'est un délai plus que généreux à lui accorder avant que le serveur ne s'arrête. J'aime garder ce chiffre en place, juste au cas où un scénario de trafic élevé se produirait.

Rappelez-vous : Un serveur web ne maintient pas une connexion constante entre le serveur et le client. Un client fait une demande, le serveur délivre la page et c'est tout. Il faut donc garder cela à l'esprit. En savoir plus.., veuillez lire cette autre réponse Je l'ai fourni à un autre internaute qui s'inquiétait de l'utilisation de la mémoire sur son serveur web.

Timeout 120
TraceEnable Off
ServerSignature Off
ServerTokens ProductOnly
FileETag None
StartServers 6

<IfModule prefork.c>
  MinSpareServers 4
  MaxSpareServers 16
</IfModule>

ServerLimit 80
MaxClients 60
MaxRequestsPerChild 2000
KeepAlive On
KeepAliveTimeout 2
MaxKeepAliveRequests 30

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X