PHP-Speicherprofilerstellung

95

Was ist ein guter Weg, um die Speichernutzung einer PHP-Seite zu profilieren? Zum Beispiel, um zu sehen, wie viel Speicher meine Daten belegen und / oder welche Funktionsaufrufe den meisten Speicher zuweisen.

  • xdebug scheint in seiner Profilierungsfunktion keine Speicherinformationen bereitzustellen.

  • xdebug bietet es in seiner Tracing-Funktion. Dies ist ziemlich nahe an dem, was ich will, außer dass die schiere Datenmenge überwältigend ist, da es Speicher-Deltas für jeden einzelnen Funktionsaufruf anzeigt. Wenn es möglich wäre, Anrufe unterhalb einer bestimmten Tiefe zu verbergen, möglicherweise mit einem GUI-Tool, würde dies mein Problem lösen.

Gibt es noch etwas?

JW.
quelle
Schauen Sie sich Rasmus Lerdorfs Vortrag mit dem Titel "Simple is Hard" an ( talk.php.net/show/froscon08 für Folien, youtube.com/watch?v=RWRYX5eJbG0 für Video). Er geht viele nützliche Tools wie "Inclued" ( pecl.php.net/package/inclued ), xdebug und KCacheGrind durch.
TML
Ich habe einen Patch für xdebug gefunden , der Speicherinformationen in den Profilen enthält. Bisher funktioniert es sehr gut.
JW.
1
Wie Sie sagen, bietet xdebug Informationen in Funktionsspuren. Glücklicherweise stellen sie auch ein Skript zur Verfügung, um dies zu interpretieren. derickrethans.nl/xdebug-and-tracing-memory-usage.html Es scheint bisher für mich zu funktionieren ...
Luke H
Mögliches Duplikat von Tools zur visuellen Analyse der Speichernutzung einer PHP-App
Francesco Casula

Antworten:

10

Xdebug hat die Speicherverfolgung in 2.6 (29.01.2018) neu implementiert , die in Qcachegrind oder einem ähnlichen Tool verwendet werden kann. Stellen Sie einfach sicher, dass Sie die Speicheroption auswählen :)

Aus den Dokumenten:

Seit Xdebug 2.6 sammelt der Profiler auch Informationen darüber, wie viel Speicher verwendet wird und welche Funktionen und Methoden die Speichernutzung erhöhen.

Ich bin mit dem Format der Datei nicht vertraut, aber Qcachegrind hat bei der Suche nach einigen Speicherproblemen hervorragend funktioniert.

qCachegrind Probe

SeanDowney
quelle
4
Und sie haben sogar mein Ticket benutzt. :)
JW.
Xdebug hat die Unterstützung für PHP 5 in der Version 2.6 eingestellt.
Powtac
Wenn es jemandem hilft ... bei der Verwendung von php-fpm ändert sich pid möglicherweise nicht zwischen verschiedenen Anforderungen. Bei der Standardeinstellung profiler_output_name führt dies dazu, dass xdebug vorherige Daten überschreibt. Ändern Sie diesen Wert mit etwas anderem von xdebug.org/docs/all_settings#trace_output_name
Aligot
Ich versuche jetzt, Qcachegrind zu verwenden und verstehe nicht, was ich sehe. Ich sehe nirgendwo Speichernummern. Wie viel Speicher belegt jede Variable? Ich möchte etwas, das die Ausführung verfolgen und den Speicher an jedem Punkt anzeigen kann und welche Variablen diesen Speicher belegen. Wo kann ich mehr dazu erfahren?
John Ktejik
72

Wie Sie wahrscheinlich wissen, hat Xdebug die Unterstützung für Speicherprofile seit der 2. * -Version eingestellt. Suchen Sie hier nach der Zeichenfolge "Entfernte Funktionen": http://www.xdebug.org/updates.php

Funktionen entfernt

Die Unterstützung für die Speicherprofilerstellung wurde entfernt, da dies nicht ordnungsgemäß funktioniert hat.

Also habe ich ein anderes Tool ausprobiert und es hat bei mir gut funktioniert.

https://github.com/arnaud-lb/php-memory-profiler

Folgendes habe ich auf meinem Ubuntu-Server getan, um es zu aktivieren:

sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof
echo "extension=memprof.so" > /etc/php5/mods-available/memprof.ini
sudo php5enmod memprof
service apache2 restart

Und dann in meinem Code:

<?php

memprof_enable();

// do your stuff

memprof_dump_callgrind(fopen("/tmp/callgrind.out", "w"));

Öffnen Sie schließlich die callgrind.outDatei mit KCachegrind

Verwendung von Google Gperftools (empfohlen!)

Installieren Sie zunächst die Google Gperftools, indem Sie das neueste Paket hier herunterladen: https://code.google.com/p/gperftools/

Dann wie immer:

sudo apt-get update
sudo apt-get install libunwind-dev -y
./configure
make
make install

Jetzt in Ihrem Code:

memprof_enable();

// do your magic

memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));

Öffnen Sie dann Ihr Terminal und starten Sie:

pprof --web /tmp/profile.heap

pprof erstellt in Ihrer vorhandenen Browsersitzung ein neues Fenster mit den folgenden Angaben :

PHP-Speicherprofilerstellung mit memprof und gperftools

Xhprof + Xhgui (meiner Meinung nach das Beste, um sowohl CPU als auch Speicher zu profilieren)

Mit Xhprof und Xhgui können Sie auch die CPU-Auslastung oder nur die Speichernutzung profilieren, wenn dies momentan Ihr Problem ist. Es ist eine sehr vollständige Lösung, es gibt Ihnen die volle Kontrolle und die Protokolle können sowohl auf Mongo als auch im Dateisystem geschrieben werden.

Für weitere Details siehe meine Antwort hier .

Schwarzes Feuer

Blackfire ist ein PHP-Profiler von SensioLabs, den Symfony2-Jungs https://blackfire.io/

Wenn Sie Ihre virtuelle Maschine mit puphpet einrichten, werden Sie froh sein zu wissen, dass sie unterstützt wird ;-)

Francesco Casula
quelle
Wie hast du es geschafft zu arbeiten? Ich habe versucht, memprof_enablein meinen PHP-Code zu setzen und ich bekomme PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable(). Ich habe gperftools aus dem aktuellen Quellcode installieren lassen.
Andrey Pokhilko
Führen Sie a php -iauf der CLI oder a aus phpinfo(), um festzustellen , ob die Erweiterung ordnungsgemäß geladen wurde. Wenn Sie es dort nicht haben, lohnt es sich wahrscheinlich, einen Blick auf Ihre *.iniDateien zu werfen .
Francesco Casula
5
Hinweis: Die neueste Version unterstützt nur PHP7. Wenn Sie PHP5 verwenden, installieren Sie mit sudo pecl install memprof-1.0.0.
Djizeus
18

Nun, dies ist möglicherweise nicht genau das, wonach Sie suchen, aber PHP verfügt über einige integrierte Funktionen, die die Speichernutzung ausgeben. Wenn Sie nur sehen möchten, wie viel Speicher ein Funktionsaufruf verwendet, können Sie memory_get_peak_usage () vor und nach einem Aufruf verwenden und die Differenz ermitteln.

Sie verwenden dieselbe Technik für Ihre Daten mit dem sehr ähnlichen memory_get_usage () .

Ziemlich unkomplizierter Ansatz, aber es ist eine schnelle Möglichkeit, einen Code zu überprüfen. Ich bin damit einverstanden, dass xdebug mem deltas manchmal zu ausführlich sein können, um nützlich zu sein. Deshalb benutze ich sie oft nur, um mich auf einen Codeabschnitt zu beschränken und dann die spezifische Speichernutzung für kleine Teile manuell auszugeben.

Zombat
quelle
0

http://geek.michaelgrace.org/2012/04/tracing-php-memory-usage-using-xdebug-and-mamp-on-mac/

Ich bin auf einem Mac. Wenn Sie also unter Windows arbeiten, müssen Sie dies testen, aber das funktioniert bei mir.

Ich habe meine Datei tracefile-analyzer.php geändert und den Pfad zur PHP-Binärdatei oben hinzugefügt, damit Sie sie im Terminal als normales Unix-Skript aufrufen können.

#!/Applications/MAMP/bin/php5.3/bin/php
<?php
if ( $argc <= 1 || $argc > 4 )
{

Vergessen Sie nicht, diese Datei auf 755 zu ändern.

Sie können leicht ein Ruby Watchr-Skript erstellen, um das Skript jedes Mal automatisch aufzurufen, wenn eine Speicherprofildatei (* .xt) erstellt wird. Auf diese Weise können Sie Ihre Verbesserungen weiter testen und sehen, ohne den Befehl immer wieder ausführen zu müssen.

2upmedia
quelle