Profilowanie pamięci PHP

96

Jaki jest dobry sposób na profilowanie wykorzystania pamięci przez stronę PHP? Na przykład, aby zobaczyć, ile pamięci używają moje dane i / lub które wywołania funkcji zajmują najwięcej pamięci.

  • Wydaje się, że xdebug nie udostępnia informacji o pamięci w swojej funkcji profilowania.

  • xdebug ma dostarczyć go w funkcję śledzenia. Jest to bardzo zbliżone do tego, czego chcę, z wyjątkiem tego, że sama ilość danych jest przytłaczająca, ponieważ pokazuje delty pamięci dla każdego wywołania funkcji. Gdyby można było ukryć połączenia poniżej pewnej głębokości, może za pomocą jakiegoś narzędzia GUI, rozwiązałoby to mój problem.

Czy jest coś jeszcze?

JW.
źródło
Sprawdź wykład Rasmusa Lerdorfa zatytułowany „Simple is Hard” ( slajdy talks.php.net/show/froscon08 , wideo youtube.com/watch?v=RWRYX5eJbG0 ). Omawia wiele przydatnych narzędzi, takich jak „inclued” ( pecl.php.net/package/inclued ), xdebug i KCacheGrind.
TML
Znalazłem łatkę do xdebug , która dostarcza informacji o pamięci w profilach. Jak dotąd działa bardzo dobrze.
JW.
1
Jak mówisz, xdebug dostarcza informacji w śladach funkcji. Na szczęście dostarczają również scenariusz do interpretacji tego. derickrethans.nl/xdebug-and-tracing-memory-usage.html Wydaje się, że jak dotąd działa to dla mnie ...
Luke H

Odpowiedzi:

11

Xdebug ponownie zaimplementował śledzenie pamięci w 2.6 (2018-01-29), które może być używane w Qcachegrind lub podobnym narzędziu. Tylko pamiętaj, aby wybrać opcję pamięci :)

Z dokumentów:

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

Nie znam formatu pliku, ale to Qcachegrind sprawdził się świetnie przy śledzeniu kilku problemów z pamięcią.

qcachegrind sample

SeanDowney
źródło
4
I nawet wykorzystali mój bilet. :)
JW.
Xdebug porzucił obsługę PHP 5 w wersji 2.6.
powtac
Jeśli komuś to pomoże ... podczas korzystania z php-fpm, pid może nie zmieniać się między różnymi żądaniami. Przy domyślnej nazwie profiler_output_name prowadzi to xdebug do nadpisania poprzednich danych. Zmień tę wartość, używając czegoś innego z xdebug.org/docs/all_settings#trace_output_name
aligot
Próbuję teraz użyć qcachegrind i nie rozumiem, na co patrzę. Nigdzie nie widzę numerów pamięci. Ile pamięci zajmuje każda zmienna? Chcę czegoś, co może prześledzić wykonanie i pokazać pamięć w każdym punkcie oraz jakie zmienne zajmują tę pamięć. Gdzie mogę uzyskać więcej informacji na ten temat?
john ktejik
72

Jak zapewne wiesz, Xdebug porzucił obsługę profilowania pamięci od wersji 2. *. Wyszukaj ciąg „usunięte funkcje” tutaj: http://www.xdebug.org/updates.php

Usunięte funkcje

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

Więc wypróbowałem inne narzędzie i działało dobrze.

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

Oto, co zrobiłem na moim serwerze Ubuntu, aby to włączyć:

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 callgrind.outplik za pomocą KCachegrind

Korzystanie z Google gperftools (zalecane!)

Przede wszystkim zainstaluj gperftools Google , 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 utworzy nowe okno w istniejącej sesji przeglądarki, jak pokazano poniżej:

Profilowanie pamięci PHP za pomocą memprof i gperftools

Xhprof + Xhgui (moim zdaniem najlepiej profilować zarówno procesor jak i pamięć)

Dzięki Xhprof i Xhgui możesz również profilować użycie procesora lub tylko użycie pamięci, jeśli jest to obecnie Twój problem. To bardzo kompletne rozwiązanie, daje pełną kontrolę, a logi można zapisywać zarówno w mongo, jak iw systemie plików.

Aby uzyskać więcej informacji, zobacz moją odpowiedź tutaj .

Czarny ogień

Blackfire to profiler PHP stworzony przez SensioLabs, gości z Symfony2 https://blackfire.io/

Jeśli używasz Puphpet do konfiguracji maszyny wirtualnej, z przyjemnością dowiesz się, że jest obsługiwana ;-)

Francesco Casula
źródło
Jak sprawiłeś, że to zadziałało? Próbowałem umieścić memprof_enablew swoim kodzie PHP i otrzymałem PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable(). Zrobiłem instalację gperftools z ich aktualnego kodu źródłowego.
Andrey Pokhilko
Uruchom a php -ina cli lub a, phpinfo()aby sprawdzić, czy poprawnie ładujesz rozszerzenie. Jeśli go tam nie masz, prawdopodobnie warto przyjrzeć się swoim *.iniplikom.
Francesco Casula
5
Uwaga: najnowsza wersja obsługuje tylko php7. Jeśli używasz php5, zainstaluj z sudo pecl install memprof-1.0.0.
Djizeus
18

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

Używasz tej samej techniki do swoich danych, używając bardzo podobnej metody memory_get_usage () .

Całkiem nieskomplikowane podejście, ale jest to szybki sposób na sprawdzenie fragmentu kodu. Zgadzam się, że delty memów xdebug mogą być czasami zbyt rozwlekłe, aby były przydatne, więc często używam go po prostu do zawężenia do sekcji kodu, a następnie ręcznie zrzucam określone użycie pamięci dla małych fragmentów.

zombat
źródło
0

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

Jestem na komputerze Mac, więc jeśli korzystasz z systemu Windows, musisz to przetestować, ale to działa dla mnie.

Zmodyfikowałem plik tracefile-analyser.php i dodałem ścieżkę do pliku binarnego PHP u góry, aby można było go wywołać w terminalu jako zwykły skrypt unixowy.

#!/Applications/MAMP/bin/php5.3/bin/php
<?php
if ( $argc <= 1 || $argc > 4 )
{

Nie zapomnij chmodować tego pliku na 755.

Możesz łatwo utworzyć skrypt ruby ​​watchr, który będzie automatycznie wywoływał skrypt za każdym razem, gdy tworzy plik profilu pamięci (* .xt). W ten sposób możesz dalej testować i obserwować swoje ulepszenia bez konieczności ciągłego wykonywania polecenia.

2upmedia
źródło