Profil memori PHP

95

Apa cara yang baik untuk membuat profil penggunaan memori halaman PHP? Misalnya, untuk melihat berapa banyak memori yang digunakan data saya, dan / atau panggilan fungsi mana yang mengalokasikan memori paling banyak.

  • xdebug tampaknya tidak memberikan informasi memori dalam fitur profilnya.

  • xdebug tidak menyediakannya dalam fitur pelacakan. Ini cukup dekat dengan yang saya inginkan, kecuali jumlah data yang sangat banyak, karena ini menunjukkan delta memori untuk setiap panggilan fungsi. Jika dimungkinkan untuk menyembunyikan panggilan di bawah kedalaman tertentu, mungkin dengan beberapa alat GUI, itu akan menyelesaikan masalah saya.

Apa ada yang lain?

JW.
sumber
Lihat pembicaraan Rasmus Lerdorf yang berjudul "Sederhana Itu Sulit" ( talks.php.net/show/froscon08 untuk slide, youtube.com/watch?v=RWRYX5eJbG0 untuk video). Dia membahas banyak alat yang berguna seperti "inclued" ( pecl.php.net/package/inclued ), xdebug, dan KCacheGrind.
TML
Saya menemukan patch ke xdebug , yang menyediakan informasi memori di profil. Sejauh ini itu bekerja dengan sangat baik.
JW.
1
Seperti yang Anda katakan, xdebug menyediakan info dalam jejak fungsi. Untungnya, mereka juga menyediakan skrip untuk menafsirkannya. derickrethans.nl/xdebug-and-tracing-memory-usage.html Sepertinya sejauh ini berhasil bagi saya ...
Luke H

Jawaban:

10

Xdebug menerapkan kembali pelacakan memori di 2.6 (2018-01-29) yang dapat digunakan di Qcachegrind atau alat serupa. Hanya pastikan untuk memilih opsi memori :)

Dari dokumen:

Sejak Xdebug 2.6, profiler juga mengumpulkan informasi tentang berapa banyak memori yang digunakan, dan yang berfungsi dan metode apa yang meningkatkan penggunaan memori.

Saya tidak terbiasa dengan format filenya, tapi Qcachegrind telah bekerja dengan baik untuk saya dalam melacak beberapa masalah memori.

sampel qcachegrind

SeanDowney
sumber
4
Dan mereka bahkan menggunakan tiket saya. :)
JW.
Xdebug menjatuhkan dukungan untuk PHP 5 pada rilis 2.6.
powtac
Jika itu membantu siapa pun ... saat menggunakan php-fpm, pid mungkin tidak berubah di antara permintaan yang berbeda. Dengan profiler_output_name default, ini mengarahkan xdebug untuk menimpa data sebelumnya. Ubah nilai ini menggunakan sesuatu yang lain dari xdebug.org/docs/all_settings#trace_output_name
aligot
Saya mencoba menggunakan qcachegrind sekarang dan tidak mengerti apa yang saya lihat. Saya tidak melihat nomor memori di mana pun. Berapa banyak memori yang digunakan setiap variabel? Saya ingin sesuatu yang dapat melacak eksekusi dan menunjukkan memori di setiap titik, dan variabel apa yang menggunakan memori itu. Di mana saya bisa mendapatkan informasi lebih lanjut tentang ini?
john ktejik
72

Seperti yang mungkin Anda ketahui, Xdebug menghentikan dukungan profil memori sejak versi 2. *. Silakan cari string "fungsi yang dihapus" di sini: http://www.xdebug.org/updates.php

Fungsi yang dihapus

Menghapus dukungan untuk Profil memori karena tidak berfungsi dengan benar.

Jadi saya sudah mencoba alat lain dan itu bekerja dengan baik untuk saya.

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

Inilah yang saya lakukan di server Ubuntu saya untuk mengaktifkannya:

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

Dan kemudian di kode saya:

<?php

memprof_enable();

// do your stuff

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

Terakhir buka callgrind.outfile dengan KCachegrind

Menggunakan Google gperftools (disarankan!)

Pertama-tama instal Google gperftools dengan mengunduh paket terbaru di sini: https://code.google.com/p/gperftools/

Kemudian seperti biasa:

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

Sekarang dalam kode Anda:

memprof_enable();

// do your magic

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

Kemudian buka terminal Anda dan luncurkan:

pprof --web /tmp/profile.heap

pprof akan membuat jendela baru di sesi browser Anda yang sudah ada dengan sesuatu seperti yang ditunjukkan di bawah ini:

Profil memori PHP dengan memprof dan gperftools

Xhprof + Xhgui (menurut saya yang terbaik untuk profil cpu dan memori)

Dengan Xhprof dan Xhgui Anda dapat membuat profil penggunaan cpu juga atau hanya penggunaan memori jika itu masalah Anda saat ini. Ini adalah solusi yang sangat lengkap, ini memberi Anda kendali penuh dan log dapat ditulis baik di mongo atau di sistem file.

Untuk lebih jelasnya lihat jawaban saya di sini .

Api hitam

Blackfire adalah profiler PHP oleh SensioLabs, orang-orang Symfony2 https://blackfire.io/

Jika Anda menggunakan boneka untuk mengatur mesin virtual Anda, Anda akan senang mengetahui bahwa itu didukung ;-)

Francesco Casula
sumber
Bagaimana Anda membuatnya berhasil? Saya mencoba memasukkan memprof_enablekode PHP saya dan saya mendapatkannya PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable(). Saya melakukan gperftools membuat instal dari kode sumber mereka saat ini.
Andrey Pokhilko
Jalankan a php -idi cli atau a phpinfo()untuk melihat apakah Anda mendapatkan ekstensi yang dimuat dengan benar. Jika Anda tidak memilikinya di sana, mungkin ada baiknya untuk melihat *.inifile Anda .
Francesco Casula
5
Catatan: versi terbaru hanya mendukung php7. Jika Anda menggunakan php5, instal dengan sudo pecl install memprof-1.0.0.
Djizeus
18

Nah, ini mungkin bukan yang Anda cari, tetapi PHP memang memiliki beberapa fungsi bawaan yang akan menampilkan penggunaan memori. Jika Anda hanya ingin melihat berapa banyak memori yang digunakan oleh sebuah panggilan fungsi, Anda dapat menggunakan memory_get_peak_usage () sebelum dan sesudah panggilan, dan mengambil perbedaannya.

Anda menggunakan teknik yang sama di sekitar data Anda menggunakan memory_get_usage () yang sangat mirip .

Pendekatan yang cukup tidak canggih, tetapi ini adalah cara cepat untuk memeriksa sepotong kode. Saya setuju bahwa delta mem xdebug terkadang terlalu bertele-tele sehingga tidak berguna, jadi saya sering menggunakannya untuk mempersempit bagian kode, lalu membuang penggunaan memori tertentu untuk bagian kecil secara manual.

zombat
sumber
0

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

Saya menggunakan Mac, jadi jika Anda menggunakan Windows, Anda harus mengujinya, tetapi ini berfungsi untuk saya.

Saya memodifikasi file tracefile-analyzer.php saya dan menambahkan path ke biner PHP di bagian atas sehingga Anda dapat menyebutnya di terminal sebagai skrip unix normal.

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

Jangan lupa untuk mengubah file ini menjadi 755.

Anda dapat dengan mudah membuat skrip ruby ​​watchr untuk secara otomatis memanggil skrip setiap kali membuat file profil memori (* .xt). Dengan begitu Anda dapat terus menguji dan melihat peningkatan Anda tanpa harus menjalankan perintah berulang kali.

2upmedia
sumber