web-dev-qa-db-ja.com

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

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

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

  • xdebug doesトレース機能で提供します。これは、個々の関数呼び出しごとにメモリデルタを表示するため、膨大な量のデータが圧倒的であることを除いて、私が望むものにかなり近いです。 GUIツールを使用して、特定の深さ以下で呼び出しを非表示にできる場合、問題は解決します。

他に何かありますか?

90
JW.

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

ドキュメントから:

Xdebug 2.6以降、プロファイラーは、使用されているメモリ量、およびaGndメソッドがメモリ使用量を増加させた機能に関する情報も収集します。

私はファイルのフォーマットに詳しくはありませんが、Qcachegrindはいくつかのメモリの問題をトレースするのにとても役立ちました。

qcachegrind sample

9
SeanDowney

おそらくご存知のとおり、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"));

最後に、callgrind.outKCachegrind のファイル

Google gperftoolsの使用(推奨!)

まず最初にGoogle gperftoolsをインストールします。最新のパッケージをダウンロードします: https://code.google.com/p/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は、以下に示すようなものを使用して、既存のブラウザセッションに新しいウィンドウを作成します。

PHP memory profiling with memprof and gperftools

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

XhprofおよびXhguiを使用すると、CPUの使用状況をプロファイルできます現時点で問題になっている場合のメモリ使用量。これは非常に完全なソリューションであり、完全に制御でき、mongoまたはファイルシステムの両方にログを書き込むことができます。

詳細については、 こちらの回答をご覧ください

ブラックファイア

Blackfireは、PHP SymsonyLabs、Symfony2のプロファイラーです https://blackfire.io/

puphpet を使用して仮想マシンをセットアップすると、サポートされていることがわかります;-)

65

まあ、これはあなたが探しているものとはまったく異なるかもしれませんが、PHPにはメモリ使用量を出力するいくつかの関数が組み込まれています。関数呼び出しが使用されている場合は、呼び出しの前後に memory_get_peak_usage() を使用して、違いを取ることができます。

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

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

17
zombat

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

私はMacを使用しているので、Windowsを使用している場合は、これをテストする必要がありますが、これは私には有効です。

Tracefile-analyzer.phpファイルを修正し、通常のUNIXスクリプトとしてターミナルで呼び出すことができるように、先頭にPHPバイナリへのパスを追加しました。

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

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

Ruby watchrスクリプトを簡単に作成して、メモリプロファイルファイル(* .xt)を作成するたびにスクリプトを自動的に呼び出すことができます。コマンドを何度も繰り返します。

0
2upmedia