Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

PHP Speicherproblem

bechri / 11 Antworten / Baumansicht Nickles

Hallo!
Seit einigen Tagen habe ich das Problem, dass bei der Ausführung meines recht komplexen PHP-Scripts innerhalb von einigen Stunden der gesamte Arbeitsspeicher gefüllt wird. Das Problem ist neu, ich weiß allerdings nicht, woher es kommt, da ich keine nennenswerte Änderungen am Script vorgenommen habe.

Das kuriose hierbei ist: In der Prozessliste wird PHP konstant mit 2,3% Speicherauslastung aufgelistet! Es wird auch kein Prozess aufgelistet, der mehr verbrauchen würde, als PHP...

Ich bin ratlos, da ich zu diesem Problem bisher keine Lösung finden konnte.

Wenn ihr weitere Infos benötigt, bitte einfach fragen!
OS: Ubuntu Server 11.04
PHP: die aktuelle PHP5

Ich verwende keinerlei Objekte, Klassen und Datenbanken sondern nur Funktionen, die 1- und 2 dimensionale Arrays übergeben, berechnen und in Dateien abspeichern.

Wenn ihr mir helfen könntet, den Fehler zu lokalisieren oder grundsätzlich den Verursacher zu finden, wäre ich euch sehr dankbar. Was mich verwundert ist eben, dass laut der Prozessliste PHP nur 23 MB verbraucht, aber dennoch der freie Gesamtspeicher stetig abnimmt.


//Das Problem habe ich auf allen Rechnern mit gleicher Konfiguration (Ubuntu + PHP5).

///Nach dem Beenden des Scripts erhöht sich der freie Speicher nur um 20-30 MB, die PHP ja auch laut Prozessliste offiziell verbraucht.

MfG Chris
bei Antwort benachrichtigen
Borlander bechri „PHP Speicherproblem“
Optionen

Wie genau hast du das denn festgestellt? Macht sich das irgendwie bemerkbar?
Bist Du Dir sicher, dass der Speicher nicht einfach nur durch den Cache belegt wird? (das wäre normale und ist auch wünschenswert...)

In der Prozessliste wird PHP konstant mit 2,3% Speicherauslastung aufgelistet!
Wo hast Du diese Liste her?

nur Funktionen, die 1- und 2 dimensionale Arrays übergeben,
Arrays können auch schon mal sehr groß werden ;-)

Btw.: In der Standardeinstellung darf ein PHP-Script AFAIR nur 16MB RAM benutzen. Dann wird aber ein entsprechender Fehler ausgegeben...


Gruß
Borlander

bei Antwort benachrichtigen
bechri Borlander „Wie genau hast du das denn festgestellt? Macht sich das irgendwie bemerkbar?...“
Optionen

die Prozessliste lass ich per "top" anzeigen, dort steht ja auch, welcher Prozess wie viel Prozent vom Speicher abgreift. Wegen des Memory-limits gibt PHP keinen Fehler aus, da es ja offiziell auch nur 23 MB braucht.

Selbst wenn ich das Memory-limit auf 25 MB einstelle, kommt kein Fehler. Bei weniger als 23 MB jedoch schon.

Der freie Gesamtspeicher (angezeigt über vmstat 30) geht aber pro Minute um knapp 5 MB zurück.


MfG Chris
bei Antwort benachrichtigen
bechri Nachtrag zu: „die Prozessliste lass ich per top anzeigen, dort steht ja auch, welcher Prozess...“
Optionen

Update: Ich meine den Fehler nun durch teilweises Auskommentieren und Testen lokalisiert zu haben und bräuchte nun Hilfe bei der Behebung.

Wie gesagt werden sekündlich Ergebnisse in Dateien eingetragen. Dazu nutze ich folgende Funktion:

function adden($datei, $text){
$handler = fOpen($datei , "a");
fWrite($handler , $text);
fClose($handler);
}

Dabei füllen sich laut "vmstat" cache & buffer und der freie Arbeitsspeicher geht kontinuierlich zurück.
Wie gesagt bleibt aber laut "top" die Speicherauslastung durch php dauerhaft bei nur 2,3%

Wenn ich keine Dateien schreiben lasse, bleiben auch der freie Gesamtspeicher und der Cache auf einem gleichbleibenden Niveau, so wie es sein sollte.

Woran könnte das liegen?

MfG Chris
bei Antwort benachrichtigen
Borlander bechri „Update: Ich meine den Fehler nun durch teilweises Auskommentieren und Testen...“
Optionen
Dabei füllen sich laut "vmstat" cache & buffer und der freie Arbeitsspeicher geht kontinuierlich zurück.
Das ist absolut kein Grund zur Sorge und soll wie schon oben geschrieben so sein. Linux verwendet den ansonsten unbenutzten Arbeitsspeicher als Cache für Datenträgerzugriffe, wobei der Cache nur bei Zugriffen (wie sie auch durch Dein PHP-Script erfolgen) gefüllt wird und nicht vorbeugend. Damit bekommst Du auch 16GB RAM voll. Bei bedarf wird der Speicher sofort für andere Anwendungen freigegeben...

btw.: htop zeigt das ganze deutlich schöner als top ;-)


Gruß
Borlander
bei Antwort benachrichtigen
bechri Borlander „ Das ist absolut kein Grund zur Sorge und soll wie schon oben geschrieben so...“
Optionen

naja, das Problem ist, dass wenn irgendwann überhaupt kein Speicher mehr frei ist, die Festplatte gefüllt wird. Wenn die voll ist, meldet sich Ubuntu und stoppt alles, was läuft.

Wie gesagt, wenn ich das Schreiben von Dateien auskommentiere, funktioniert offenbar alles so wie es soll.

Aber ich muss regelmäßig auf der Festplatte speichern, weshalb ich verzweifelt auf der Suche nach einer Lösung bzw. nach dem Verursacher des Problems bin. Mein oben gezeigter "Schreib-Code" ist ja so, "wie er im Lehrbuch steht".

//htop werde ich testen, vllt hilft das ja weiter.

MfG Chris
bei Antwort benachrichtigen
Borlander bechri „naja, das Problem ist, dass wenn irgendwann überhaupt kein Speicher mehr frei...“
Optionen
das Problem ist, dass wenn irgendwann überhaupt kein Speicher mehr frei ist, die Festplatte gefüllt wird. Wenn die voll ist, meldet sich Ubuntu und stoppt alles, was läuft.
Das ist allerdings in der Tat sehr seltsam.

Lass Dir das ganze nebenbei am besten mal von htop sortiert nach Speicherbelegung anzeigen, ggf. auch als Baumstruktur...
bei Antwort benachrichtigen
bechri Borlander „ Das ist allerdings in der Tat sehr seltsam. Lass Dir das ganze nebenbei am...“
Optionen

ich habe gestern einen Screenshot erstellt. Der PHP-Prozess, um den es geht, wird in der Liste mit 98% CPU-Auslastung angezeigt.

http://img560.imageshack.us/img560/1411/unbenanntod.png

Mich wundert auch etwas, dass htop andere Speicherverbrauchs-Angaben macht als das parallel laufende vmstat.

MfG Chris
bei Antwort benachrichtigen
Borlander bechri „ich habe gestern einen Screenshot erstellt. Der PHP-Prozess, um den es geht,...“
Optionen
Der PHP-Prozess, um den es geht, wird in der Liste mit 98% CPU-Auslastung angezeigt.
Was ist aller Welt machst Du dann wenn das Ding schon eine Stunde Rechenzeit gefressen hat? ;-)

Mich wundert auch etwas, dass htop andere Speicherverbrauchs-Angaben macht als das parallel laufende vmstat.
Wo siehst Du da denn widersprüchliche Angaben? Die beiden Tools geben nun mal sehr unterschiedliche Werte zurück. Die Speicherbelegung durch buffers (blau) und cache (gelb) wird bei htop übrigens oben in der Memory bar angezeigt. Das gezeigte Bild ist aber absolut nicht ungewöhnlich...


Gruß
Borlander
bei Antwort benachrichtigen
bechri Borlander „ Was ist aller Welt machst Du dann wenn das Ding schon eine Stunde Rechenzeit...“
Optionen

super, danke! Wenn ich das richtig verstehe, wird um so mehr Cache von Linux benutzt, je mehr Dateien ich schreibe?

Ich fand das anfangs praktisch, da ich so leicher Dateninhalte lesen konnte, aber das Script schreibt mittlerweile einfach zu viele Dateien. Würde sich Linux für jede Datei nur 1kb Speicher genehmigen, würde das schon ausreichen um an dessen Grenzen zu stoßen.

Nehmen wir an, ich würde auf. MySQL umsteigen und alles in eine Tabelle schreiben. Könnte das mein Problem lösen?

MfG Chris
bei Antwort benachrichtigen
Borlander bechri „super, danke! Wenn ich das richtig verstehe, wird um so mehr Cache von Linux...“
Optionen
wird um so mehr Cache von Linux benutzt, je mehr Dateien ich schreibe?
Jein. Das passiert (normalerweise) nur so lange noch RAM frei und nicht von Anwendungen benötigt wird.

Ich fand das anfangs praktisch, da ich so leicher Dateninhalte lesen konnte, aber das Script schreibt mittlerweile einfach zu viele Dateien.
Häh?
Wie viele Dateien schreibt Dein Script denn? Wie viele Dateien werden gleichzeitig geschrieben, bzw. wie viele Datei-Ressourcen sind zeitgleich geöffnet? Werden die auch alle wieder geschlossen? Ggf. mal mit lsof während des Script-Ausführung prüfen auf welche Dateien gerade zugegriffen wird...

Nehmen wir an, ich würde auf. MySQL umsteigen und alles in eine Tabelle schreiben. Könnte das mein Problem lösen?
Also bei normaler Verwendung von Dateien sollte es auch keine Probleme geben. Wenn Du viele identisch strukturierte Datensätze vorhalten willst dann ist eine Datenbank im Zweifelsfall aber sicher besser geeignet...


Gruß
Borlander
bei Antwort benachrichtigen
bechri Borlander „ Jein. Das passiert normalerweise nur so lange noch RAM frei und nicht von...“
Optionen

Ok, ich habe mich in den letzten Tagen mit MySQl beschäftigt und meine Funktionen entsprechend angepasst. Die Datensätze werden nun nicht mehr in Dateien, sondern in einer DB gespeichert.

Die Arbeitsspeichernutzung gefällt mir nun schon viel besser! Zum Vergleich: Derzeit werden nach einer Stunde Laufzeit ca. 60 MB RAM "genutzt" (inkl. Puffer, Cache). Vor dem Umstieg auf MySQL waren es noch 400 MB.

Anscheinend führt an Datenbanken langfristig kein Weg vorbei. Wenn man ihr Prinzip versteht, sind sie eine durchaus praktische Angelegenheit :)

Danke für die kompetente Hilfe!

MfG Chris
bei Antwort benachrichtigen