web-dev-qa-db-fra.com

PHP profilage de la mémoire

Quelle est la bonne façon de profiler une utilisation de la mémoire d'une page PHP? Par exemple, pour voir la quantité de mémoire utilisée par mes données et/ou les appels de fonction qui allouent le plus de mémoire).

  • xdebug ne semble pas fournir d'informations sur la mémoire dans sa fonction de profilage.

  • xdebug does le fournit dans sa fonction de traçage. C'est assez proche de ce que je veux, sauf que la quantité de données est écrasante, car elle montre des deltas de mémoire pour chaque appel de fonction. S'il était possible de masquer les appels en dessous d'une certaine profondeur, peut-être avec un outil GUI, cela résoudrait mon problème.

Y a-t-il autre chose?

90
JW.

Xdebugsuivi de la mémoire réimplémentée en 2.6 (2018-01-29) qui peut être utilisé dans Qcachegrind ou un outil similaire. Juste assurez-vous de sélectionner l'option de mémoire :)

De la documentation:

Depuis Xdebug 2.6, le profileur collecte également des informations sur la quantité de mémoire utilisée et sur les fonctions qui ont augmenté les méthodes d'utilisation de la mémoire.

Je ne connais pas le format du fichier, mais c'est Qcachegrind qui a très bien fonctionné pour moi en traçant quelques problèmes de mémoire.

qcachegrind sample

9
SeanDowney

Comme vous le savez probablement, Xdebug a supprimé la prise en charge du profilage de la mémoire depuis la version 2. *. Veuillez rechercher la chaîne "fonctions supprimées" ici: http://www.xdebug.org/updates.php

Fonctions supprimées

Suppression de la prise en charge du profilage de la mémoire car cela ne fonctionnait pas correctement.

J'ai donc essayé un autre outil et cela a bien fonctionné pour moi.

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

Voici ce que j'ai fait sur mon serveur Ubuntu pour l'activer:

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

Et puis dans mon code:

<?php

memprof_enable();

// do your stuff

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

Enfin, ouvrez le callgrind.out fichier avec KCachegrind

Utilisation de Google gperftools (recommandé!)

Tout d'abord, installez le Google gperftools en téléchargeant le dernier package ici: https://code.google.com/p/gperftools/

Alors comme toujours:

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

Maintenant dans votre code:

memprof_enable();

// do your magic

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

Ouvrez ensuite votre terminal et lancez:

pprof --web /tmp/profile.heap

pprof créera une nouvelle fenêtre dans votre session de navigateur existante avec quelque chose comme indiqué ci-dessous:

PHP memory profiling with memprof and gperftools

Xhprof + Xhgui (le meilleur à mon avis pour profiler à la fois le processeur et la mémoire)

Avec Xhprof et Xhgui vous pouvez également profiler l'utilisation du processeur ou simplement l'utilisation de la mémoire si c'est votre problème pour le moment. C'est une solution très complète, elle vous donne un contrôle total et les journaux peuvent être écrits à la fois sur mongo ou dans le système de fichiers.

Pour plus de détails voir ma réponse ici .

Blackfire

Blackfire est un PHP profiler de SensioLabs, les gars de Symfony2 https://blackfire.io/

Si vous utilisez puphpet pour configurer votre machine virtuelle, vous serez heureux de savoir qu'elle est prise en charge ;-)

65
Francesco Casula

Eh bien, ce n'est peut-être pas exactement ce que vous recherchez, mais PHP possède quelques fonctions intégrées qui généreront l'utilisation de la mémoire. Si vous vouliez simplement voir la quantité de mémoire l'appel de fonction utilise, vous pouvez utiliser memory_get_peak_usage () avant et après un appel, et prendre la différence.

Vous utilisez la même technique autour de vos données en utilisant le très similaire memory_get_usage () .

Approche assez simple, mais c'est un moyen rapide de vérifier un morceau de code. Je suis d'accord que les deltas mem de xdebug peuvent être trop verbeux pour être utiles parfois, donc je l'utilise souvent juste pour réduire à une section de code, puis vider manuellement l'utilisation spécifique de la mémoire pour les petits morceaux.

17
zombat

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

Je suis sur un Mac, donc si vous êtes sur Windows, vous devrez tester cela, mais cela fonctionne pour moi.

J'ai modifié mon fichier tracefile-analyzer.php et ajouté le chemin vers le binaire PHP en haut pour que vous puissiez l'appeler dans le terminal comme un script Unix normal.

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

N'oubliez pas de chmoder ce fichier au 755.

Vous pouvez facilement créer un script Ruby watchr pour appeler automatiquement le script chaque fois qu'il crée un fichier de profil de mémoire (* .xt). De cette façon, vous pouvez continuer à tester et à voir vos améliorations sans avoir à exécuter la commande encore et encore.

0
2upmedia