2009-06-10 2 views
0

Okay Leute,So finden & fix memleaks innerhalb Apache + PHP + Win2k3

Wir haben Apache 2.2.11 Mod_php 5.2.9-2 auf einem Windows Server 2003 (Small Business Edition) Box läuft, und Jede Anfrage erreicht irgendwo zwischen 4 und 8 MB RAM, gefolgt von etwa 2 bis 6 MB. Grundsätzlich ist die Menge, die Apache veröffentlicht, immer merklich geringer (um Megabytes) als die Menge, die es während der Anfrage zuweist, und nach ein paar Stunden verbraucht der httpd.exe-Prozess den gesamten verfügbaren RAM und der Server hängt.

Dieses Verhalten tut haupt nicht auf unserer Windows XP Entwicklung Boxen mit der gleichen Code-Basis auftreten und folgenden Konfigurationen:

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

Einfache PHP-Skripte auf dem Produktionsserver (Win2k3) scheinen nicht zu lecken zB:

  • Basis PHP echo Funktionen
  • Erstellen und Referenzierung Klassen
  • Ausgabepufferung
  • PDO mit und ohne persistente Verbindungen

Wenn unsere volle App ausgeführt wird, jedoch beginnen die Dinge zu lecken. Die einzigen Dinge, die wir uns vorstellen können, wären Objekte, Sitzungsdetails, globale Variablen - aber wie kann ich herausfinden, was das Leck ist? Und was verursacht es? Ohne die einzige Maschine zu stören, können wir das Problem duplizieren?

Antwort

1

PHP verfügt über eigene Speicherfunktionen und Sie können __zerstörende magische Funktionen zum Überwachen von Objekten erstellen. Ich persönlich würde eine Testkopie machen, ein paar Änderungen vornehmen, damit Sie Ram überwachen können und sehen, wo es erhöht oder verringert wird.

Persönlich hätte ich zuerst angenommen, dass es sich um ein Caching-Problem handelt, wobei der RAM zunimmt, aber wenn es das System instabil macht, dann ist es eindeutig nicht so einfach.

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>"; 

Und nur nach offensichtlichen Lauch suchen. Tut mir leid, ich kann nicht mehr hilfreich sein.

+0

Hmm. Wir machen niemals explizite Unscharfschaltung oder verwenden __zerstören. Unsere Skripte selbst verwenden ungefähr ~ 8MB nach einem Aufruf von memory_get_usage() kurz vor dem Ende der Ausführung. Wir gingen davon aus, dass Apache in der Lage sein würde, den Speicher von dieser bestimmten Anforderung wiederherzustellen. Ich nehme an, dass es nicht sicher ist, das dann anzunehmen? – spronkey