PHP bellek profili oluşturma


96

Bir PHP sayfasının bellek kullanımını profillemenin iyi bir yolu nedir? Örneğin, verilerimin ne kadar bellek kullandığını ve / veya hangi işlev çağrılarının en fazla belleği ayırdığını görmek için.

  • xdebug profil oluşturma özelliğinde bellek bilgisi sağlamıyor gibi görünüyor.

  • xdebug , izleme özelliğinde bunu sağlar. Bu, her bir işlev çağrısı için bellek deltalarını gösterdiğinden, çok fazla miktarda veri olması dışında, istediğim şeye oldukça yakın. Çağrıları belirli bir derinliğin altına gizlemek mümkün olsaydı, belki bazı GUI araçlarıyla, bu benim sorunumu çözerdi.

Başka bir şey var mı?


Rasmus Lerdorf'un "Simple is Hard" adlı konuşmasına göz atın (slaytlar için talks.php.net/show/froscon08 , video için youtube.com/watch?v=RWRYX5eJbG0 ). "Inclued" ( pecl.php.net/package/inclued ), xdebug ve KCacheGrind gibi birçok yararlı aracın üzerinden geçer .
TML

Profillerde bellek bilgisi sağlayan xdebug için bir yama buldum . Şimdiye kadar çok iyi çalışıyor.
JW.

1
Sizin de söylediğiniz gibi, xdebug işlev izlerinde bilgi sağlar. Neyse ki, bunu yorumlamak için bir senaryo da sağlıyorlar. derickrethans.nl/xdebug-and-tracing-memory-usage.html Şimdiye kadar benim için çalışıyor gibi görünüyor ...
Luke H

Yanıtlar:


11

Xdebug , Qcachegrind veya benzeri bir araçta kullanılabilen bellek izlemeyi 2.6'da (2018-01-29) yeniden uyguladı. Sadece hafıza seçeneği seçtiğinizden emin olun :)

Dokümanlardan:

Xdebug 2.6'dan bu yana, profil oluşturucu ayrıca ne kadar bellek kullanıldığı ve hangi işlevlerin aGnd yöntemlerinin bellek kullanımını artırdığı hakkında bilgi toplar.

Dosyanın formatına aşina değilim, ancak Qcachegrind birkaç bellek sorununu izlemede benim için harika çalıştı.

qcachegrind örneği


4
Ve hatta biletimi kullandılar. :)
JW.

Xdebug, 2.6 sürümünde PHP 5 desteğini bıraktı.
powtac

Herhangi birine yardımcı oluyorsa ... php-fpm kullanırken, pid farklı istekler arasında değişmeyebilir. Varsayılan profiler_output_name ile bu, xdebug'un önceki verilerin üzerine yazmasına yol açar. Xdebug.org/docs/all_settings#trace_output_name
aligot

Şimdi qcachegrind kullanmaya çalışıyorum ve neye baktığımı anlamıyorum. Hafıza numaralarını hiçbir yerde göremiyorum. Her değişken ne kadar bellek kaplar? Yürütmenin izini sürebilecek ve her noktada hafızayı ve bu hafızayı hangi değişkenlerin kapladığını gösterebilecek bir şey istiyorum. Bununla ilgili daha fazla bilgiyi nereden alabilirim?
john ktejik

72

Muhtemelen bildiğiniz gibi, Xdebug 2. * sürümünden beri bellek profili oluşturma desteğini bıraktı. Lütfen burada "kaldırılan işlevler" dizesini arayın: http://www.xdebug.org/updates.php

Kaldırılan işlevler

Düzgün çalışmadığı için Bellek profili oluşturma desteği kaldırıldı.

Bu yüzden başka bir araç denedim ve benim için iyi çalıştı.

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

Bunu etkinleştirmek için Ubuntu sunucumda yaptığım şey:

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

Ve sonra kodumda:

<?php

memprof_enable();

// do your stuff

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

Sonunda callgrind.outdosyayı KCachegrind ile açın

Google gperftools'u kullanma (önerilir!)

Öncelikle en son paketi buradan indirerek Google gperftools'u yükleyin : https://code.google.com/p/gperftools/

Sonra her zamanki gibi:

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

Şimdi kodunuzda:

memprof_enable();

// do your magic

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

Ardından terminalinizi açın ve başlatın:

pprof --web /tmp/profile.heap

pprof , mevcut tarayıcı oturumunuzda aşağıda gösterildiği gibi yeni bir pencere oluşturacaktır:

Memprof ve gperftools ile PHP bellek profili oluşturma

Xhprof + Xhgui (bence hem cpu hem de bellek profili için en iyisi)

İle Xhprof ve Xhgui o Sorununuz şu anda ise siz de ya da sadece bellek kullanımı CPU kullanımını profil olabilir. Çok eksiksiz bir çözümdür, size tam kontrol sağlar ve günlükler hem mongo'da hem de dosya sisteminde yazılabilir.

Daha fazla ayrıntı için cevabıma buradan bakın .

Siyah ateş

Blackfire, SensioLabs, the Symfony2'nin adamları https://blackfire.io/ tarafından hazırlanan bir PHP profilleyicisidir.

Sanal makinenizi kurmak için kukla kullanıyorsanız , desteklendiğini bilmekten mutluluk duyacaksınız ;-)


Nasıl çalışmasını sağladınız? memprof_enablePHP kodumu koymaya çalıştım ve anladım PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable(). Gperftools'u güncel kaynak kodlarından kurdum.
Andrey Pokhilko

Uzantının düzgün şekilde yüklenip yüklenmediğini görmek php -iiçin bir cli veya a üzerinde çalıştırın phpinfo(). Orada yoksa, *.inidosyalarınıza bir göz atmaya değer .
Francesco Casula

5
Not: en son sürüm yalnızca php7'yi destekler. Php5 kullanıyorsanız sudo pecl install memprof-1.0.0,.
Djizeus

18

Pekala, bu tam olarak aradığınız şey olmayabilir, ancak PHP'nin bellek kullanımını çıkaracak yerleşik birkaç işlevi vardır. Bir işlev çağrısının ne kadar bellek kullandığını görmek istiyorsanız, bir çağrıdan önce ve sonra memory_get_peak_usage () kullanabilir ve farkı anlayabilirsiniz .

Çok benzer memory_get_usage () kullanarak verilerinizde aynı tekniği kullanırsınız .

Oldukça karmaşık olmayan bir yaklaşım, ancak bir kod parçasını kontrol etmenin hızlı bir yolu. Xdebug mem deltalarının bazen yararlı olamayacak kadar ayrıntılı olabileceğini kabul ediyorum, bu yüzden genellikle onu kodun bir bölümüne daraltmak için kullanıyorum, ardından küçük parçalar için belirli bellek kullanımını manuel olarak atıyorum.


0

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

Mac kullanıyorum, bu yüzden Windows kullanıyorsanız bunu test etmeniz gerekecek, ancak bu benim için çalışıyor.

Tracefile-analyzer.php dosyamı değiştirdim ve en üstteki PHP ikili dosyasının yolunu ekledim, böylece onu terminalde normal bir unix betiği olarak çağırabilirsiniz.

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

Bu dosyayı 755'e chmod yapmayı unutmayın.

Bir bellek profili dosyası (* .xt) oluşturduğu her seferde komut dosyasını otomatik olarak çağırmak için kolayca bir Ruby watchr komut dosyası oluşturabilirsiniz. Bu şekilde, komutu defalarca uygulamak zorunda kalmadan test etmeye ve iyileştirmelerinizi görmeye devam edebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.