web-dev-qa-db-fra.com

Comment étudier une fuite de mémoire avec Apache et PHP?

Nous exécutons un site Web lourd Drupal qui effectue une modélisation financière. Nous semblons courir dans une sorte de fuite de mémoire étant donné que les heures supplémentaires utilisées par Apache se développent lorsque le nombre de processus Apache reste stable:

enter image description here

enter image description here

Nous savons que le problème de la mémoire provient d'Apache/PHP car chaque fois que nous émettons un /etc/init.d/httpd reload Les gouttes d'utilisation de la mémoire (voir Capture d'écran ci-dessus et les sorties CLI ci-dessus):

Avant la recharge httpd

[... Swap: 2097144 536552 1560592 [.____]

Après la recharge httpd

[. ____ Swap: 2097144 536552 1560592 [.____]

Chaque thread Apache est attribué à un PHP memory_limit De 512 Mo, ce qui explique la dépistée de l'utilisation de la mémoire haute, le faible volume des demandes et un max_execution_time De 120 secondes qui doivent terminer les threads qui L'exécution prend plus de temps et devrait donc empêcher la croissance constante de l'utilisation de la mémoire que nous voyons.

Q: Comment pourrions-nous enquêter sur quoi causer cette fuite de mémoire?

Idéalement, je cherche des étapes de dépannage que je peux effectuer sur le système sans avoir à déranger l'équipe DEV.

Information additionnelle:

OS: RHEL 5.6
PHP: 5.3
Drupal: 6.x
MySQL: 5.6

FYI Nous sommes au courant du numéro d'échange que nous enquêtais séparément et que nous n'avons rien à voir avec la fuite de mémoire que nous avons observée avant que l'échange a commencé à se produire.

17
Max

Nous savons que le problème de la mémoire vient d'Apache/PHP car chaque fois que nous émettons un /etc/init.d/httpd recharger les gouttes d'utilisation de la mémoire

Non - cela signifie simplement qu'il est lié au trafic Web. Vous avez mentionné que vous exécutez MySQL sur la boîte - Gestion probable des données pour le serveur Web - cela pourrait tout aussi facilement être le coupable ici. Comme d'autres services, votre site Web utilise lesquels vous n'avez pas mentionné.

Chaque fil Apache est attribué à un PHP memory_limit de 512 Mo explique

Non ça ne le fait pas. Vous rapportez une moyenne de 7 et un maximum de 25 serveurs occupés - mais votre graphique de mémoire montre un delta d'environ 25 Go.

Vraiment, vous devriez recommencer à nouveau avec le réglage HTTP de base - vous semblez exécuter une constante 256 httpds, mais votre consommation de crête est 25 - c'est tout simplement stupide.

et un maximum_execution_time de 120 secondes qui devraient mettre fin aux threads que l'exécution prend plus de temps

Non - seulement si le fil de l'exécution est dans l'interprète PHP - non si PHP est bloqué.

qui effectue une modélisation financière

(soupir)

Il aurait été utile que vous avez fourni des détails sur la manière dont vous avez configuré Apache, fileté ou préfigurkek, quelle version, comment PHP est appelée (module, CGI, FastCGI), que vous utilisiez des connexions persistantes, si vous utilisez des procédures stockées.

Je vous suggère de commencer par déplacer MySQL sur une machine séparée et arrêtez d'utiliser des connexions persistantes (si vous les utilisez actuellement). Définissez la limite de mémoire beaucoup plus bas et remplacez-la sur une base de script. Assurez-vous que vous avez le collecteur de déchets de référence circulaire installés et configurés.

11
symcbean

Vous avez probablement résolu votre problème maintenant. En tant qu'intim pour maintenir le serveur d'échanger/battre, j'exécute la commande suivante toutes les heures de cron:

#!/bin/sh 
sync; echo 3 > /proc/sys/vm/drop_caches

Je ne dis pas que ceci est une solution, juste un moyen de maintenir les choses à courir et de minimiser les baisse lorsque vous investissez la cause réelle de la fuite de mémoire.

Plus de détails ici.

http://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/

2
patrick