2009-06-10 9 views
0

gens bien,Comment trouver et réparer memleaks intérieur Apache + PHP + Win2k3

Nous avons Apache 2.2.11 en cours d'exécution mod_php 5.2.9-2 sur une boîte de Windows Server 2003 (Small Business Edition), et chaque requête est de l'ordre de 4 à 8 Mo de RAM, suivie d'environ 2 à 6 Mo de libération. Fondamentalement, le montant libéré par Apache est toujours nettement inférieur (en mégaoctets) à la quantité qu'il alloue lors de la requête, et après quelques heures le processus httpd.exe finit par consommer toute la RAM disponible et le serveur se bloque.

Ce comportement ne pas se du tout sur nos boîtes de développement de Windows XP avec le même code de base et configs suivants:

  • XP/Apache 2.2.11/PHP5.2.9-2/MySQL 5.1. 34
  • XP/Apache 2.0.x (divers) /PHP5.2.7/MySQL 5.0.67

scripts PHP simples sur le serveur de production (Win2k3) ne semblent pas fuir par exemple:

  • écho de base PHP fonctions
  • cours Création et référencement
  • mise en mémoire tampon de sortie
  • AOP avec et sans connexions persistantes

Lors de l'exécution de notre application complète, cependant, les choses commencent à fuir. Les seules choses que nous pouvons penser à cela sont l'utilisation d'objets, de détails de session, de variables globales - mais comment puis-je savoir quelle est la fuite? Et qu'est-ce qui le cause? Sans trop perturber la seule machine on peut dupliquer le problème sur ??

Répondre

1

PHP possède ses propres fonctions de mémoire, et vous pouvez créer des fonctions magiques __destroy pour surveiller les objets. Personnellement, je ferais une copie de test, faire quelques modifications afin que vous puissiez surveiller ram et voir où il augmente ou diminue. Personnellement, j'aurais d'abord supposé qu'il s'agissait d'un problème de mise en cache, avec l'élévation du bélier, mais si cela rend le système instable, alors ce n'est clairement pas si facile.

echo "Before SomeStrangeObject == ".memory_get_usage()."<br>"; 
    $x = new SomeStrangeObject(); 
    echo "During SomeStrangeObject == ".memory_get_usage()."<br>"; 
    unset($x); 
    echo "After SomeStrangeObject == ".memory_get_usage()."<br>"; 

Et juste chercher des poireaux évidents. Désolé, je ne peux pas être plus utile.

+0

Hmm. Nous ne faisons jamais explicitement unset() ting ou n'utilisons pas __destroy. Nos scripts utilisent environ ~ 8 Mo après un appel à memory_get_usage() juste avant la fin de l'exécution. Nous supposions qu'Apache serait capable de récupérer la mémoire de cette requête particulière. Je suppose que ce n'est pas tout à fait sûr de supposer cela alors? – spronkey