Профилирование памяти PHP - PullRequest
88 голосов
/ 19 мая 2009

Какой хороший способ профилировать использование памяти страниц PHP? Например, чтобы узнать, сколько памяти используют мои данные и / или какие вызовы функций выделяют больше всего памяти.

  • xdebug, похоже, не предоставляет информацию о памяти в своей функции профилирования.

  • xdebug обеспечивает в функции трассировки. Это довольно близко к тому, что я хочу, за исключением огромного количества данных, поскольку он показывает дельты памяти для каждого вызова функции. Если бы было возможно скрыть вызовы ниже определенной глубины, возможно, с помощью какого-либо инструмента с графическим интерфейсом, это решило бы мою проблему.

Есть что-нибудь еще?

Ответы [ 4 ]

64 голосов
/ 21 мая 2014

Как вы, наверное, знаете, Xdebug прекратил поддержку профилирования памяти начиная с версии 2. *. Пожалуйста, найдите строку "удаленные функции" здесь: http://www.xdebug.org/updates.php

Удаленные функции

Удалена поддержка профилирования памяти, так как это не работает должным образом.

Итак, я попробовал другой инструмент, и он работал хорошо для меня.

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

Вот что я сделал на своем сервере Ubuntu, чтобы включить его:

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

А потом в моем коде:

<?php

memprof_enable();

// do your stuff

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

Наконец, откройте файл callgrind.out с помощью KCachegrind

Использование Google gperftools (рекомендуется!)

Прежде всего установите Google gperftools , загрузив последнюю версию пакета здесь: https://code.google.com/p/gperftools/

Тогда как всегда:

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

Теперь в вашем коде:

memprof_enable();

// do your magic

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

Затем откройте свой терминал и запустите:

pprof --web /tmp/profile.heap

pprof создаст новое окно в существующем сеансе браузера, как показано ниже:

PHP memory profiling with memprof and gperftools

Xhprof + Xhgui (лучший, на мой взгляд, профиль для процессора и памяти)

С помощью Xhprof и Xhgui вы можете также профилировать использование процессора или только использование памяти, если это ваша проблема на данный момент. Это очень полное решение, оно дает вам полный контроль, и журналы могут быть записаны как на монго, так и в файловой системе.

Подробнее см. Мой ответ здесь .

Blackfire

Blackfire - это PHP-профилировщик от SensioLabs, ребята из Symfony2 https://blackfire.io/

Если вы используете puphpet для настройки своей виртуальной машины, вы будете рады узнать, что она поддерживается; -)

17 голосов
/ 19 мая 2009

Ну, это может быть не совсем то, что вы ищете, но в PHP действительно есть пара встроенных функций, которые выводят использование памяти. Если вы просто хотите узнать, сколько памяти использует вызов функции, вы можете использовать memory_get_peak_usage () до и после вызова и принять разницу.

Вы используете ту же технику в отношении ваших данных, используя очень похожую memory_get_usage () .

Довольно простой подход, но это быстрый способ проверить кусок кода. Я согласен с тем, что xdebug mem deltas может быть слишком многословным, чтобы иногда быть полезным, поэтому я часто просто использую его, чтобы сузить до фрагмента кода, а затем вручную выбрасываю конкретное использование памяти для небольших фрагментов.

8 голосов
/ 19 февраля 2018

Xdebug переопределена трассировка памяти в 2.6 (2018-01-29), которую можно использовать в Qcachegrind или аналогичном инструменте. Просто обязательно выберите опцию памяти :)

Из документов:

Начиная с Xdebug 2.6, профилировщик также собирает информацию о том, сколько памяти используется, и какие функции и методы увеличивают использование памяти.

Я не знаком с форматом файла, но его Qcachegrind отлично подходит для отслеживания нескольких проблем с памятью.

qcachegrind sample

0 голосов
/ 18 сентября 2012

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

Я на Mac, поэтому, если вы работаете в Windows, вам придется проверить это, но это работает для меня.

Я изменил свой файл tracefile-analyzer.php и добавил путь к двоичному файлу PHP вверху, чтобы вы могли вызывать его в терминале как обычный сценарий unix.

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

Не забудьте изменить этот файл на 755.

Вы можете легко создать скрипт ruby ​​watchr для автоматического вызова скрипта каждый раз, когда он создает файл профиля памяти (* .xt). Таким образом, вы сможете продолжать тестировать и видеть улучшения, не выполняя команду снова и снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...