Инструменты для визуального анализа использования памяти приложения PHP - PullRequest
23 голосов
/ 01 ноября 2008

Есть ли что-нибудь бесплатное или коммерческое, которое может облегчить анализ использования памяти приложением PHP? Я знаю, что xdebug может создавать файлы трассировки, которые показывают использование памяти при вызове функции, но без графического инструмента данные трудно интерпретировать.

В идеале я хотел бы иметь возможность просматривать не только общее использование памяти, но и то, какие объекты находятся в куче, и кто ссылается на них, аналогично Jprofiler .

Ответы [ 7 ]

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

8 голосов
/ 01 декабря 2008

Недавно я столкнулся с той же проблемой, но, к сожалению, не смог найти никаких конкретных инструментов.

Но кое-что, что помогло, это вывести трассировку xdebug в удобочитаемом для человека формате с включенными мем-дельтами (настройка INI, xdebug.show_mem_deltas или что-то, что я думаю?). Затем запустите sort (если вы используете * nix) для вывода:

sort -bgrk 3 -o sorted.txt mytracefile.xt 

Это сортирует по третьему столбцу, mem deltas. Вы также можете отсортировать по второму столбцу, и в этом случае вы можете найти строку, в которой ваше приложение использует больше всего памяти.

Конечно, это не может обнаружить, когда использование памяти объектом только увеличивается с небольшими приращениями, но в итоге использует много памяти в целом. У меня есть довольно глупый метод, который пытается сделать это, используя комбинацию итерации объекта и сериализации. Вероятно, это не совсем соответствует использованию памяти, но, надеюсь, дает представление о том, с чего начать. Имейте в виду, что он израсходует саму память, а также не был тщательно протестирован, поэтому покупатель остерегается:

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()));

Кроме того, только что был предложен этот метод коллегой (ура Деннис ;-) Это скрывает шаги, которые находятся ниже 2 уровней отступа, вы можете довольно легко увидеть точки, где общее использование памяти подпрыгивает, и могут сузить кругозор вниз, увеличивая отступ:

egrep '[0-9]+ (  ){1,2}-> ' mytracefile.xt
6 голосов
/ 26 февраля 2009

Вкл. http://www.xdebug.org/updates.php для Xdebug 2.0.4 они пишут в разделе «удаленные функции»: «... Удалена поддержка профилирования памяти, так как это не работает должным образом ...». Следовательно, xdebug не будет опцией

1 голос
/ 02 февраля 2019

Я лично использовал https://github.com/arnaud-lb/php-memory-profiler

в PHP 5.6 и Ubuntu 18, а также Kcachegrind для визуализации.

Kcachegrind в порядке, но не самый лучший. Я надеюсь найти лучшую альтернативу, даже если она на Mac или Windows.

0 голосов
/ 02 ноября 2008

phpDesigner 2008 может отлаживать и тестировать сайты с помощью xdebug и KCacheGrind. Он также имеет встроенный монитор.

0 голосов
/ 02 ноября 2008

Попробуйте webgrind . Это дает вам профилирование CacheGrinder в удобном для чтения, основанном на браузере формате. Я на Mac, и он сделал профилирование на одном дыхании.

0 голосов
/ 01 ноября 2008

Графический инструмент для вывода xdebug: KCacheGrind .

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