Инструменты для визуального анализа использования памяти приложения PHP
Есть ли что-нибудь бесплатное или коммерческое, которое может облегчить анализ использования памяти приложением PHP? Я знаю, что xdebug может создавать файлы трассировки, которые показывают использование памяти вызовом функции, но без графического инструмента данные трудно интерпретировать.
В идеале я хотел бы иметь возможность просмотра не только общего использования памяти, но и того, какие объекты находятся в куче, и кто ссылается на них подобно Jprofiler.
Ответы
Ответ 1
Как вы, наверное, знаете, 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 вы можете также профилировать использование процессора или просто использовать память, если это ваша проблема на данный момент.
Это очень полные решения, они дают вам полный контроль, и журналы могут быть написаны как на mongo, так и в файловой системе.
Подробнее... см. мой ответ здесь.
Blackfire
Blackfire - это профилировщик PHP от SensioLabs, ребята Symfony2 https://blackfire.io/
Если вы используете puphpet для настройки своей виртуальной машины, вы будете рады узнать, что она поддерживается; -)
Ответ 2
Недавно я столкнулся с той же проблемой, но не смог найти каких-либо конкретных инструментов.
Но что-то, что помогло, было вывести трассировку xdebug в человекообразном формате с включенными mem deltas (параметр INI, xdebug.show_mem_deltas или что-то, что я думаю?). Затем запустите сортировку (если вы на * nix) на выходе:
sort -bgrk 3 -o sorted.txt mytracefile.xt
Это сортирует по третьему col, дельтам mem. Вы также можете сортировать второй столбец, и в этом случае вы можете найти строку, в которой ваше приложение использует наибольшую память.
Конечно, это не может обнаружить, когда использование памяти объекта только ползучее с небольшим шагом, но заканчивается тем, что использует большую часть памяти в целом. У меня довольно глупый метод, который пытается сделать это, используя комбинацию итерации объектов и сериализации. Скорее всего, это не означает, что использование памяти явно не соответствует действительности, но, надеюсь, дает представление о том, с чего начать искать. Имейте в виду, что он будет использовать всю память, а также не подвергался всестороннему тестированию, поэтому покупатель остерегается:
function analyzeMem($obj, $deep=false)
{
if (!is_scalar($obj))
{
$usage = array('Total'=>strlen(serialize($obj)));
while (list($prop, $propVal) = each($obj))
{
if ($deep && (is_object($propVal) || is_array($propVal)))
{
$usage['Children'][$prop] = analyzeMem($propVal);
}
else
{
$usage['Children'][$prop] = strlen(serialize($propVal));
}
}
return $usage;
}
else
{
return strlen(serialize($obj));
}
}
print_r(analyzeMem(get_defined_vars()));
Кроме того, только что предложил этот метод коллеге (приветствует Денниса;-) Это скрывает шаги, которые ниже двух уровней отступов, вы можете легко увидеть точки, в которых скапливается общая память, и может сузить вещи вниз, увеличив отступ:
egrep '[0-9]+ ( ){1,2}-> ' mytracefile.xt
Ответ 3
В http://www.xdebug.org/updates.php для Xdebug 2.0.4 они пишут в разделе "Удаленные функции": "... Удалена поддержка профилирования памяти как это не работает должным образом...". Следовательно, xdebug не будет вариантом
Ответ 4
Я лично использовал https://github.com/arnaud-lb/php-memory-profiler
на PHP 5.6 и Ubuntu 18, и Kcachegrind для визуализации.
Kcachegrind это хорошо, но не самый лучший. Я надеюсь найти лучшую альтернативу, даже если она на Mac или Windows.
Ответ 5
Графический инструмент для вывода xdebug KCacheGrind.
Ответ 6
Попробуйте webgrind. Он дает вам профилирование CacheGrinder в удобном для чтения формате на основе браузера. Я нахожусь на Mac, и он сделал профилирование легким ветром.
Ответ 7
phpDesigner 2008 может отлаживать и тестировать веб-сайты с помощью xdebug и KCacheGrind. Он также имеет встроенный монитор.
Ответ 8
В версии 2.6.0 на 2018-01-29 в xdebug добавлена поддержка профилирования памяти. Теперь вы можете создавать файлы callgrind со временем и информацией о памяти. На Mac вы можете визуализировать эту информацию, например, с помощью Qcachegrind или Profiling Viewer (Premium).
![Profiling Viewer callgraph]()