21 Stimmen

Wie kann ich die Speichernutzung von php unter Linux überwachen?

Ich habe in der Vergangenheit Valgrinds Massiv-Tool zur Überwachung der Speichernutzung verwendet.

Weiß jemand, wie die Speichernutzung von PHP-Prozesse zu erfassen, die auf einem Linux-Lighttpd-Server erzeugt werden?

Ich habe festgestellt, dass Valgrind nicht an einen laufenden Prozess anhängen kann (und ich würde die PID des php-Prozesses sowieso nicht kennen)

Ich sehe nur den Speicherverbrauch von lighttpd, nicht die PHP-Prozesse, die vom lighttpd cgi-Modul erzeugt werden.

Vielen Dank im Voraus.

16voto

scragar Punkte 6654

PHP hat eigene Funktionen zum Testen des Speichers. Ich weiß nicht, ob das für Sie von Nutzen ist, aber wenn Sie es nur protokollieren wollen, können Sie es verwenden: http://php.net/manual/en/function.memory-get-peak-usage.php

    echo "Using ", memory_get_peak_usage(1), " bytes of ram.";

2 Stimmen

Ist dies der Speicherverbrauch nur für das Skript, oder ist der Speicherverbrauch des PHP-Prozesses ebenfalls enthalten? Außerdem wird es schwierig sein, den Spitzenwert der Nutzung zu einem bestimmten Zeitpunkt zu ermitteln, wenn mehrere Skripte laufen.

3 Stimmen

Durch Hinzufügen des booleschen true als ersten Parameter in memory_get_peak_usage(true) wird auch der Speicher für den PHP-Prozess zurückgegeben.

9voto

Palm Punkte 359

Können Sie nicht das Werkzeug "ps" verwenden?

$ ps -F -C php-cgi

UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
http     10794 10786  0  4073   228   0 Jun09 ?        00:00:00 /usr/bin/php-cgi
http     10795 10794  0  4073    28   0 Jun09 ?        00:00:00 /usr/bin/php-cgi
http     10796 10786  0  4073   228   0 Jun09 ?        00:00:00 /usr/bin/php-cgi
http     10797 10796  0  4613  3544   0 Jun09 ?        00:00:00 /usr/bin/php-cgi
...

RSS ist die Größe des Echtspeichers (residente Gruppe) des Prozesses in Kilobyte.

Um das Ganze in Bash zusammenzufassen (etwas eingerostet, sorry)

#!/bin/bash

total=0
for i in `ps -C php-cgi -o rss=`
do
    total=$(($total + $i))
done
echo "Memory usage: $total kb"

# Output: Memory usage: 4540 kb

Nur eine Zeile:

total=0; for i in `ps -C php-cgi -o rss=`; do total=$(($total+$i)); done; echo "Memory usage: $total kb";

Ich kenne die Zuverlässigkeit des Speicherteils in ps wird in Frage gestellt, aber es gibt Ihnen zumindest eine Vorstellung davon, wie die Nutzung ist.

0 Stimmen

Dies ist gut, wenn Sie php-cgi verwenden, wenn Sie mod_php verwenden, haben Sie Pech und sollten wahrscheinlich die erste Antwort wählen.

4voto

Michael Lihs Punkte 6580

Neben den oben gezeigten eingebauten Befehlen können Sie auch XHProf für die Profilerstellung Ihrer Skripte und XHGui für die Anzeige von Profilergebnissen in einer schönen Browseranwendung. Sie erhalten ausführliche Informationen darüber, wie Ihre Methoden den Speicher nutzen und welche Spitzenwerte bei der Speichernutzung in Ihrer Anwendung auftreten.

0 Stimmen

Danke, ich höre immer gerne von neuen Tools für die Profilerstellung. Ich werde auf jeden Fall XHProf und XHGUI ausprobieren.

2voto

Meep3D Punkte 3764

http://php.net/manual/en/function.memory-get-usage.php

sollte Ihnen den Speicherplatz anzeigen, den der Thread im Skript selbst verwendet. Ich denke, da das Skript (und der Thread) höchstens ein paar Millisekunden lang existiert - nur die Zeit, die es braucht, um die Seite zu generieren - könnte es schwierig sein, es außerhalb von PHP zu erkennen.

  • Plan B

Sie können auch Debugging-Informationen vom Server erhalten, die möglicherweise genauer sind - ich persönlich verwende xdebug, und wenn es einen Fehler/eine Meldung auslöst, gibt es Ihnen eine Stack-Trace, Zeit und Speicherverbrauch. Sie können es am Ende des Skripts mit auslösen:

trigger_error ('Finished', E_USER_NOTICE);

Und es wird Ihnen die Informationen geben. Ich bin mir nicht sicher, wie man die Daten abfängt - wenn Sie es brauchen, gibt es vielleicht eine Funktion in den Dokumenten - ich erinnere mich vage, eine gesehen zu haben.

2 Stimmen

Hallo, ja, ich habe sowohl memory_get_usage als auch memory_get_peak_usage an einem Skript ausprobiert, das eine Zeichenfolge erstellt und in einer Schleife 50-mal die Zeichenfolge jedes Mal erhöht. Es scheint, dass memory_get_usage() immer 2mb (in Bytes) zurückgibt. Das scheint mir falsch zu sein (es sei denn, php weist allen Skripten 2 MB im Voraus zu?

1 Stimmen

Ich habe meine Antwort etwas aktualisiert - xdebug kann man sich unter xdebug.org

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X