Profilage de la mémoire PHP

95

Quel est un bon moyen de profiler l'utilisation de la mémoire d'une page PHP? Par exemple, pour voir combien de mémoire mes données utilisent et / ou quels appels de fonction allouent le plus de mémoire.

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

  • xdebug ne fournir 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 graphique, cela résoudrait mon problème.

Y a-t-il autre chose?

JW.
la source
Regardez la conférence de Rasmus Lerdorf intitulée "Simple is Hard" ( talk.php.net/show/froscon08 pour les diapositives, youtube.com/watch?v=RWRYX5eJbG0 pour la vidéo). Il passe en revue de nombreux outils utiles tels que "inclued" ( pecl.php.net/package/inclued ), xdebug et KCacheGrind.
TML
J'ai trouvé un correctif pour xdebug , qui fournit des informations sur la mémoire dans les profils. Jusqu'à présent, cela fonctionne très bien.
JW.
1
Comme vous le dites, xdebug fournit des informations dans les traces de fonctions. Heureusement, ils fournissent également un script pour interpréter cela. derickrethans.nl/xdebug-and-tracing-memory-usage.html Cela semble fonctionner pour moi jusqu'à présent ...
Luke H

Réponses:

10

Xdebug a réimplémenté le traçage de la mémoire dans 2.6 (2018-01-29) qui peut être utilisé dans Qcachegrind ou un outil similaire. Assurez-vous simplement de sélectionner l'option de mémoire :)

À partir de la documentation:

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

Je ne suis pas familier avec 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.

exemple qcachegrind

SeanDowney
la source
4
Et ils ont même utilisé mon billet. :)
JW.
Xdebug a abandonné le support de PHP 5 dans la version 2.6.
powtac
Si cela aide quelqu'un ... lors de l'utilisation de php-fpm, pid peut ne pas changer entre les différentes requêtes. Avec le profiler_output_name par défaut, cela conduit xdebug à écraser les données précédentes. Modifiez cette valeur en utilisant autre chose de xdebug.org/docs/all_settings#trace_output_name
aligot
Im essayant d'utiliser qcachegrind maintenant et ne comprends pas ce que je regarde. Je ne vois les numéros de mémoire nulle part. Combien de mémoire prend chaque variable? Je veux quelque chose qui puisse retracer l'exécution et montrer la mémoire à chaque point, et quelles variables occupent cette mémoire. Où puis-je obtenir plus d'informations à ce sujet?
john ktejik le
72

Comme vous le savez probablement, Xdebug a abandonné le support 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.outfichier avec KCachegrind

Utilisation de Google gperftools (recommandé!)

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

Puis 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:

Profilage de la mémoire PHP avec memprof et 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 profileur PHP 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 ;-)

Francesco Casula
la source
Comment en êtes-vous arrivé là? J'ai essayé de mettre memprof_enabledans mon code PHP et j'obtiens PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable(). J'ai fait installer gperftools à partir de leur code source actuel.
Andrey Pokhilko
Exécutez a php -isur le cli ou a phpinfo()pour voir si l'extension est correctement chargée. Si vous ne l'avez pas, il vaut probablement la peine de jeter un œil à vos *.inifichiers.
Francesco Casula
5
Remarque: la dernière version ne prend en charge que php7. Si vous utilisez php5, installez avec sudo pecl install memprof-1.0.0.
Djizeus
18

Eh bien, ce n'est peut-être pas exactement ce que vous recherchez, mais PHP a quelques fonctions intégrées qui généreront l'utilisation de la mémoire. Si vous vouliez juste voir combien de mémoire un 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 la très similaire memory_get_usage () .

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

zombat
la source
0

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 sous Windows, vous devrez tester cela, mais cela fonctionne pour moi.

J'ai modifié mon fichier tracefile-analyzer.php et ai ajouté le chemin vers le binaire PHP en haut afin 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 chmod ce fichier en 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 à plusieurs reprises.

2upmédia
la source