23

PHP アプリケーションによるメモリ使用量の分析を容易にするフリーウェアまたは商用のものはありますか? xdebug が関数呼び出しによるメモリ使用量を示すトレース ファイルを生成できることは知っていますが、グラフィカル ツールがないとデータを解釈するのは困難です。

理想的には、総メモリ使用量だけでなく、ヒープ上にあるオブジェクトと、Jprofilerのように誰がそれらを参照しているかを表示できるようにしたいと考えています。

4

8 に答える 8

13

ご存じのとおり、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"));

最後にKCachegrindcallgrind.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 とメモリの両方をプロファイリングするのに最適です)

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

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

ブラックファイア

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

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

于 2014-05-23T12:55:26.277 に答える
8

最近同じ問題に遭遇しましたが、残念ながら特定のツールが見つかりませんでした。

しかし、助けになったのは、memデルタを有効にしてxdebugトレースを人間が読める形式で出力することでした(INI設定、xdebug.show_mem_deltasまたは何か?)。次に、出力に対して sort (*nix を使用している場合) を実行します。

sort -bgrk 3 -o sorted.txt mytracefile.xt 

これは、3 列目のメモリ デルタでソートされます。2 番目の列で並べ替えることもできます。この場合、アプリが合計で最も多くのメモリを使用している行を見つけることができます。

もちろん、オブジェクトのメモリ使用量が少しずつ増加し、最終的に大量のメモリを使用することになる場合は、これでは検出できません。オブジェクトの反復とシリアル化の組み合わせを使用してこれを実行しようとする、かなりばかげた方法があります。おそらくメモリ使用量と正確に一致するわけではありませんが、どこから調べればよいかのアイデアが得られることを願っています。それはメモリ自体を使い果たし、また広範囲にテストされていないことを心に留めておいてください。

function analyzeMem($obj, $deep=false)
{
    if (!is_scalar($obj))
    {
        $usage = array('Total'=>strlen(serialize($obj)));
        while (list($prop, $propVal) = each($obj)) 
        {
            if ($deep && (is_object($propVal) || is_array($propVal)))
            {
                $usage['Children'][$prop] = analyzeMem($propVal);
            }
            else
            {
                $usage['Children'][$prop] = strlen(serialize($propVal));
            }
        }
        return $usage;
    }
    else
    {
        return strlen(serialize($obj));
    }
}

print_r(analyzeMem(get_defined_vars()));

また、同僚からこの方法が提案されました (Dennis に乾杯 ;-) これにより、2 レベルのインデントより下のステップが非表示になります。全体的なメモリ使用量が急増するポイントを簡単に確認できます。インデント:

egrep '[0-9]+ (  ){1,2}-> ' mytracefile.xt
于 2008-12-01T01:50:50.110 に答える
6

Xdebug 2.0.4のhttp://www.xdebug.org/updates.phpで、「削除された関数」のセクションに次のように記述しています。「...正しく機能しなかったため、メモリプロファイリングのサポートを削除しました...」。したがって、xdebugはオプションにはなりません

于 2009-02-26T11:38:25.413 に答える
0

webgrindを試してください。読みやすいブラウザベースの形式で CacheGrinder のプロファイリングを提供します。私は Mac を使用していますが、プロファイリングが簡単になりました。

于 2008-11-02T00:09:23.763 に答える
0

xdebug 出力のグラフィカル ツールは KCacheGrindです

于 2008-11-01T19:11:12.210 に答える
0

phpDesigner 2008 は、xdebug と KCacheGrind を使用して Web サイトのデバッグとベンチマークを行うことができます。モニターも内蔵しています。

于 2008-11-02T16:10:25.600 に答える