Профілювання пам'яті PHP


95

Що є хорошим способом профілактики використання пам'яті сторінки PHP? Наприклад, щоб побачити, скільки пам'яті використовують мої дані та / або які виклики функцій виділяють найбільшу кількість пам'яті.

  • Здається, xdebug не надає інформацію про пам'ять у своїй функції профілювання.

  • Xdebug робить надати його у відстеженні функції. Це досить близько до того, що я хочу, за винятком того, що велика кількість даних є непосильною, оскільки показує дельти пам'яті для кожного виклику функції. Якби можна було приховати дзвінки нижче певної глибини, можливо, за допомогою інструменту GUI, який би вирішив мою проблему.

Є ще щось?


Ознайомтеся з розмовою Расмуса Лердорфа під назвою "Просте важко" ( розмови.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 Здається, це працює для мене поки що ...
Люк H

Відповіді:


10

Xdebug повторно вдосконалив трасування пам'яті в 2.6 (2018-01-29), яке можна використовувати в Qcachegrind або подібному інструменті. Просто переконайтесь, що виберіть варіант пам'яті :)

З документів:

Оскільки Xdebug 2.6, профілер також збирає інформацію про те, скільки пам’яті використовується, і які функції aGnd методами збільшують використання пам'яті.

Я не знайомий з форматом файлу, але це Qcachegrind для мене чудово працював у пошуку кількох проблем із пам'яттю.

qcachegrind зразок


4
І вони навіть використали мій квиток. :)
JW.

Xdebug відмовився від підтримки PHP 5 у версії 2.6.
powtac

Якщо це допомагає комусь ... при використанні php-fpm, pid може не змінюватися між різними запитами. Якщо за замовчуванням profiler_output_name, це призводить xdebug до заміни попередніх даних. Змініть це значення, використовуючи щось інше з xdebug.org/docs/all_settings#trace_output_name
aligot

Я намагаюся використовувати qcachegrind зараз і не розумію, на що я дивлюся. Я ніде не бачу номери пам'яті. Скільки пам’яті займає кожна змінна? Я хочу щось, що може простежити виконання та показати пам’ять у кожній точці та які змінні займають цю пам'ять. Де я можу отримати більше інформації про це?
Джон ktejik

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 встановити з поточного вихідного коду їх.
Андрій Похілько

Запустіть a php -iна cli чи a, phpinfo()щоб побачити, чи правильно ви завантажуєте розширення. Якщо у вас його немає, можливо, варто переглянути свої *.iniфайли.
Франческо Касула

5
Примітка: остання версія підтримує лише php7. Якщо ви використовуєте php5, встановіть sudo pecl install memprof-1.0.0.
Джизей

18

Ну, це може бути не саме те, що ви шукаєте, але в PHP є вбудована пара функцій, яка виводить використання пам'яті. Якщо ви просто хотіли побачити, скільки пам'яті використовує функція виклику, ви можете використовувати memory_get_peak_usage () до і після дзвінка, і визначити різницю.

Ви використовуєте ту саму техніку навколо своїх даних, використовуючи дуже схожий memory_get_usage () .

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


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 )
{

Не забудьте chmod цей файл на 755.

Ви можете легко створити сценарій рубінового спостерігача для автоматичного виклику сценарію кожного разу, коли він створює файл профілю пам'яті (* .xt). Таким чином, ви можете продовжувати тестувати та бачити свої вдосконалення без необхідності виконувати команду знову і знову.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.