Profilowanie pamięci PHP

Jaki jest dobry sposób na profilowanie użycia pamięci strony PHP? Na przykład, aby sprawdzić, ile pamięci zużywają moje dane i / lub które wywołania funkcji przydzielają najwięcej pamięci.

  • Wydaje się, że Xdebug nie dostarcza informacji o pamięci w swojej funkcji profilowania.

  • Xdebug dostarcza go w swojej funkcji śledzenia. Jest to bardzo zbliżone do tego, czego chcę, z wyjątkiem samej ilości danych jest przytłaczająca, ponieważ pokazuje delty pamięci dla każdego jedno wywołanie funkcji. Gdyby możliwe było ukrycie połączeń poniżej pewnej głębokości, może za pomocą jakiegoś narzędzia GUI, rozwiązałoby to mój problem.

Jest coś jeszcze?

Author: JW., 2009-05-19

4 answers

Xdebug reimplemented memory tracing in 2.6 (2018-01-29), który może być używany w Qcachegrind lub podobnym narzędziu. Po prostu upewnij się, że wybrałeś opcję pamięci :)

From the docs:

Od wersji Xdebug 2.6, profiler zbiera również informacje o tym, ile pamięci jest używane i jakie funkcje metody aGnd zwiększają zużycie pamięci.

Nie znam formatu pliku, ale to Qcachegrind działał mi świetnie w namierzam kilka problemów z pamięcią.

qcachegrind sample

 11
Author: SeanDowney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-09 18:55:49

Jak zapewne wiesz, Xdebug zrezygnował z obsługi profilowania pamięci od 2.* wersja. Wyszukaj ciąg "usunięte funkcje" tutaj: http://www.xdebug.org/updates.php

Usunięte funkcje

Usunięto wsparcie dla profilowania pamięci, ponieważ nie działało to poprawnie.

Więc próbowałem innego narzędzia i działało dobrze dla mnie.

Https://github.com/arnaud-lb/php-memory-profiler

Oto co zrobiłem na moim Ubuntu server to enable it:

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

A potem w moim kodzie:

<?php

memprof_enable();

// do your stuff

memprof_dump_callgrind(fopen("/tmp/callgrind.out", "w"));

Na koniec otwórz plik callgrind.out za pomocą KCachegrind

Korzystanie z Google gperftools (zalecane!)

Najpierw zainstaluj Google gperftools pobierając najnowszy pakiet tutaj: https://code.google.com/p/gperftools/

Wtedy jak zawsze:

sudo apt-get update
sudo apt-get install libunwind-dev -y
./configure
make
make install

Teraz w Twoim kodzie:

memprof_enable();

// do your magic

memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));

Następnie otwórz terminal i uruchom:

pprof --web /tmp/profile.heap

pprof będzie utwórz nowe okno w istniejącej sesji przeglądarki za pomocą czegoś takiego jak pokazano poniżej:

Profilowanie pamięci PHP za pomocą memprof i gperftools

Xhprof + Xhgui (moim zdaniem najlepszy do profilowania zarówno procesora, jak i pamięci)]}

Z Xhprofi Xhgui możesz profilować użycie procesora lub tylko zużycie pamięci, jeśli to jest Twój problem w tej chwili. Jest to bardzo kompletne rozwiązanie, daje pełną kontrolę, a logi mogą być zapisywane zarówno na mongo, jak i w systemie plików.

Po Więcej Szczegółów zobacz moją odpowiedź tutaj .

Blackfire

Blackfire to PHP profiler stworzony przez SensioLabs, The Symfony2 guys https://blackfire.io/

Jeśli używasz puphpet aby skonfigurować swoją Maszynę wirtualną, będziesz zadowolony, że jest obsługiwana; -)

 72
Author: Francesco Casula,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Cóż, może to nie jest dokładnie to, czego szukasz, ale PHP ma kilka wbudowanych funkcji, które będą generować zużycie pamięci. Jeśli chcesz zobaczyć, ile pamięci używa funkcja, możesz użyć memory_get_peak_usage () przed i po wywołaniu i wziąć różnicę.

Używasz tej samej techniki wokół swoich danych za pomocą bardzo podobnego memory_get_usage () .

Dość nieskomplikowane podejście, ale to szybki sposób na sprawdzenie kawałek kodu. Zgadzam się, że Xdebug mem deltas może być zbyt gadatliwy, aby być użytecznym czasem, więc często używam go, aby zawęzić do sekcji kodu, a następnie ręcznie wyrzucić określone zużycie pamięci dla małych kawałków.

 18
Author: zombat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-19 00:46:09

Http://geek.michaelgrace.org/2012/04/tracing-php-memory-usage-using-xdebug-and-mamp-on-mac/

Jestem na Macu, więc jeśli jesteś na Windows będziesz musiał to przetestować, ale to działa dla mnie.

Zmodyfikowałem mój analizator tracefile.plik php i dodano ścieżkę do pliku binarnego PHP u góry, abyś mógł wywołać go w terminalu jako zwykły skrypt uniksowy.
#!/Applications/MAMP/bin/php5.3/bin/php
<?php
if ( $argc <= 1 || $argc > 4 )
{

Nie zapomnij chmod tego pliku do 755.

Można łatwo utworzyć skrypt ruby watchr do automatycznie wywołaj skrypt za każdym razem, gdy tworzy plik profilu pamięci (*.xt). W ten sposób możesz testować i widzieć swoje ulepszenia bez konieczności wykonywania polecenia w kółko.

 0
Author: 2upmedia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-18 19:27:52