Профилирование памяти PHP

96

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

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

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

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

JW.
источник
Ознакомьтесь с докладом Расмуса Лердорфа под названием «Простое - это сложно» ( слайды talk.php.net/show/froscon08 , видео youtube.com/watch?v=RWRYX5eJbG0 ). Он рассказал о множестве полезных инструментов, таких как «Inclued» ( pecl.php.net/package/inclued ), xdebug и KCacheGrind.
TML
Я нашел патч для xdebug , который предоставляет информацию о памяти в профилях. Пока все работает очень хорошо.
JW.
1
Как вы говорите, xdebug предоставляет информацию в виде трассировки функций. К счастью, они также предоставляют сценарий для интерпретации этого. derickrethans.nl/xdebug-and-tracing-memory-usage.html Похоже, у меня пока работает ...
Люк Х

Ответы:

11

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

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

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

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

образец qcachegrind

Шон Дауни
источник
4
И даже мой билет использовали. :)
JW.
Xdebug отказался от поддержки PHP 5 в версии 2.6.
powtac 09
Если это кому-то поможет ... при использовании php-fpm pid может не меняться между разными запросами. При использовании по умолчанию profiler_output_name это заставляет xdebug перезаписывать предыдущие данные. Измените это значение, используя что-нибудь еще из xdebug.org/docs/all_settings#trace_output_name
aligot
Я пытаюсь использовать qcachegrind сейчас и не понимаю, на что я смотрю. Я нигде не вижу номеров памяти. Сколько памяти занимает каждая переменная? Мне нужно что-то, что могло бы отслеживать выполнение и показывать память в каждой точке и какие переменные занимают эту память. Где я могу получить дополнительную информацию по этому поводу?
Джон Ктейк
72

Как вы, наверное, знаете, 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 с помощью memprof и gperftools

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

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

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

Черный огонь

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

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

Франческо Казула
источник
Как ты заставил это работать? Я попытался вставить memprof_enableсвой PHP-код и получил PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable(). Я сделал gperftools для установки из текущего исходного кода.
Андрей Похилко
Запустите php -iкоманду a на cli или a, phpinfo()чтобы проверить, правильно ли загружается расширение. Если у вас его там нет, возможно, стоит взглянуть на ваши *.iniфайлы.
Francesco Casula
5
Примечание: последняя версия поддерживает только php7. Если вы используете php5, установите с помощью sudo pecl install memprof-1.0.0.
Джизеус
18

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

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

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

зомбат
источник
0

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). Таким образом, вы могли продолжать тестирование и видеть свои улучшения без необходимости повторять команду снова и снова.

2upmedia
источник