PHPメモリプロファイリング


95

PHPページのメモリ使用量をプロファイルする良い方法は何ですか?たとえば、データが使用しているメモリの量、および/またはどの関数呼び出しが最も多くのメモリを割り当てているかを確認します。

  • xdebugは、プロファイリング機能でメモリ情報を提供していないようです。

  • xdebug 、トレース機能でそれを提供します。これは、すべての単一の関数呼び出しのメモリデルタを表示するため、膨大な量のデータが圧倒的であることを除いて、私が望んでいるものにかなり近いです。特定の深さより下の呼び出しを隠すことが可能である場合、おそらくいくつかのGUIツールを使用すると、問題が解決します。

他に何かありますか?


Rasmus Lerdorfの「Simple is Hard」という講演ご覧ください(スライドはtalks.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これまでのところ、うまく機能しているようです...
Luke H

回答:


10

Xdebug は2.6(2018-01-29)でメモリトレースを再実装し、Qcachegrindまたは同様のツールで使用できます。ちょうどメモリオプションを選択してください :)

ドキュメントから:

Xdebug 2.6以降、プロファイラーは、使用されているメモリの量と、Gndメソッドのどの関数がメモリ使用量を増やしたかについての情報も収集します。

私はファイルの形式に精通していませんが、Qcachegrindはいくつかのメモリの問題を追跡するのに非常に役立ちました。

qcachegrindサンプル


4
そして、彼らも私のチケットを使用しました。:)
JW。

Xdebugは、2.6リリースでPHP 5のサポートを終了しました。
powtac

それが誰かを助けるなら... php-fpmを使用しているとき、pidは異なるリクエスト間で変化しないかもしれません。デフォルトのprofiler_output_nameでは、xdebugが以前のデータを上書きします。xdebug.org/docs/all_settings#trace_output_name
アリゴット

私は今qcachegrindを使用しようとしていて、私が何を見ているのか理解していません。メモリ番号がどこにも表示されません。各変数はどのくらいのメモリを使用しますか?実行を追跡し、各ポイントでメモリを表示できるものと、そのメモリを使用している変数が必要です。これに関する詳細情報はどこで入手できますか?
john 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"));

最後にKCachegrindでcallgrind.outファイルを開きます

Google gperftoolsの使用(推奨!)

まず最初に、https//code.google.com/p/gperftools/から最新のパッケージをダウンロードして、Google 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は、既存のブラウザーセッションで、次のような新しいウィンドウを作成します。

memprofおよびgperftoolsを使用したPHPメモリプロファイリング

Xhprof + Xhgui(私の意見ではCPUとメモリの両方をプロファイリングするのに最適)

XhprofXhguiそれは現時点ではあなたの問題だ場合は、同様または単にメモリ使用量、CPU使用率をプロファイリングすることができます。これは非常に完全なソリューションであり、完全に制御でき、ログはmongoまたはファイルシステムの両方に書き込むことができます。

詳細については、こちらの私の回答を参照してください

ブラックファイア

Blackfireは、Symfony2の仲間であるSensioLabsによるPHPプロファイラーです。https: //blackfire.io/

puphpetを使用して仮想マシンをセットアップする場合、それがサポートされていることを喜んで知っています;-)


どのように機能させましたか?私は入れてみましたmemprof_enable、私のPHPコードに、私が得ますPHP Fatal error: Uncaught Error: Call to undefined function memprof_enable()。それらの現在のソースコードからgperftools make installを実行しました。
Andrey Pokhilko 2016

php -icliまたはaでa phpinfo()を実行して、拡張機能が適切に読み込まれているかどうかを確認します。そこにない場合は、*.iniファイルを確認する価値があります。
Francesco Casula 2016

5
注:最新バージョンはphp7のみをサポートしています。php5を使用している場合は、でインストールしsudo pecl install memprof-1.0.0ます。
Djizeus

18

まあ、これはあなたが探しているものとは正確には違うかもしれませんが、PHPにはメモリ使用量を出力する2つの関数が組み込まれています。関数呼び出しが使用しているメモリの量を確認したいだけの場合は、呼び出しの前後にmemory_get_peak_usage()を使用して、差をとることができます。

非常によく似たmemory_get_usage()を使用して、データに対して同じ手法を使用します。

かなり洗練されていないアプローチですが、コードの一部をチェックアウトする簡単な方法です。xdebug mem deltaは冗長すぎて役に立たない場合があるので、コードセクションに絞り込んで特定のメモリ使用量を手動でダンプすることに同意します。


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

このファイルを755にchmodすることを忘れないでください。

Rubyウォッチャースクリプトを簡単に作成して、メモリプロファイルファイル(* .xt)を作成するたびにスクリプトを自動的に呼び出すことができます。そうすれば、コマンドを何度も実行しなくても、テストを続けて改善を確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.