Инструменты для визуального анализа использования памяти приложением PHP

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

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

Возможный дубликат Профилирование памяти PHP

Francesco Casula 26.11.2015 16:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
23
1
15 092
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

Я знаю о KCacheGrind и WinCacheGrind. Насколько я могу судить, ни один из этих инструментов не позволяет анализировать использование памяти.

Oleg Barshay 01.11.2008 22:12

Попробуйте webgrind. Он дает вам профилирование CacheGrinder в удобном для чтения формате на основе браузера. Я использую Mac, и профилирование стало проще простого.

К сожалению, webgrind не сообщает об использовании памяти - только о скорости выполнения.

Oleg Barshay 02.11.2008 03:13

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

Обрабатывает ли он профилирование использования памяти или просто профилирование производительности? На их веб-сайте я видел только профилирование производительности.

Oleg Barshay 02.11.2008 21:37

Не могу тебе сказать. Программист этой программы очень хороший парень. Не помешало бы отправить ему электронное письмо и спросить себя!

user29772 10.11.2008 00:47

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

Но кое-что, что помогло, заключалось в том, чтобы вывести трассировку 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()));

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

egrep '[0-9]+ (  ){1,2}-> ' mytracefile.xt

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

Ответ принят как подходящий

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

Removed functions

Removed support for Memory profiling as that didn't work properly.

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

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 - это профилировщик PHP от SensioLabs, ребята из Symfony2 https://blackfire.io/

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

sudo pecl install memprof не проходит стадию make. Выдает ошибку: Makefile:194: recipe for target 'memprof.lo' failed
Buddy 23.06.2016 22:00

Важно отметить, что php-memory-profiler не поддерживает php7.

Heath N 15.09.2016 19:38

Должен быть принят ответ ... Спасибо за информацию. Обратите внимание, что хотя kcachegrind / qcachegrind предназначены для анализа ЦП, при анализе файла cachegrind, выдаваемого php-memory-profiler, вы обнаружите, что указанные значения и поля соответствуют анализу памяти.

Ezekiel Victor 18.10.2016 21:08

@HeathN Это так. В репозитории есть ветка master, предназначенная только для PHP 7, а также ветка php5, которая поддерживает только PHP5.

starbeamrainbowlabs 11.04.2017 13:07

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

на PHP 5.6 и Ubuntu 18 и Kcachegrind для визуализации.

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

В версии 2.6.0 от 29.01.2018 в xdebug добавлена ​​поддержка профилирования использования памяти. Теперь вы можете создавать файлы callgrind с информацией о времени и памяти. На Mac вы можете визуализировать эту информацию, например, с помощью Qcachegrind или Средство просмотра профилей (премиум).

Profiling Viewer callgraph

Другие вопросы по теме