1

CodeIgniterで構築されたアプリケーション用の比較的大きなPHPコードベース(数千行)があります。パフォーマンスの問題を追跡し、統計などを生成できるようにするために、開発サーバーはXhprofを実行します。スクリプトが実際にロギング部分に来る場合、これは正常に機能します。

しかし、私は今、スクリプトがちょうどタイムアウトする状況になりました。開発サーバーでは、タイムアウト(「サーバーが見つかりません」)エラーが発生するだけで、Apacheプロセスがクラッシュすることもあります。Xhprofファイルは生成されず、CodeIgniterロギングシステムは何も生成しません。エラー報告は有効です。

ライブ環境(ライブサーバーのミラー)では、アプリケーションは実際にエラーを生成します。

致命的なエラー:493行目の/home/www/application/system/database/drivers/mysql/mysql_driver.phpで許可された33554432バイトのメモリサイズが使い果たされました(261900バイトを割り当てようとしました)

これと、エラーを再現する方法の手がかりがあることで、解決策を探すための手がかりが得られます。しかし、それは時間のかかる仕事です。

実際の「メモリリーク」が発生している場所を追跡できる方法を探しています。行ごとに手動でデバッグする代わりに。どんな提案でも大歓迎です。

更新:サーバーのメモリが少ないことは問題ではありません。より多くのメモリを備えた開発サーバーでは、同じ問題が発生します。問題は無限ループで、サーバーが処理できるよりも多くのメモリを割り当てていました。問題は残っています:これらのエラーをどのように迅速に追跡することができますか?

4

2 に答える 2

2

統計を保持することを目的としたプログラムに共通する問題は、それらが触れるすべてのものへのポインタを保持することです。これにより、メモリ管理がそれらを再利用できなくなります。そうでない場合、これはおそらくリークではなく、おそらく暴走した割り当てです。あなたはおそらくそれをしているかもしれないいくつかの場所しか持っていません。良いスタートは、メモリのチャンクを独自の関数に割り当てるシステム関数への直接呼び出しを置き換えてから、それらの関数をインストルメント化して、予期しない大きな配列割り当てを探すことです。

引用された制限(32mb)は、現代の基準ではそれほど大きくありません。プロセスに不当に低い制限があることを除いて、何も問題がないことは簡単に言えます。

于 2012-08-13T23:31:55.447 に答える
2

xdebugを使用します。xhprofとは対照的に、xdebugを使用したプロファイリングでは、スクリプトの実行時に出力が生成されます。つまり、スクリプトがハングしたりタイムアウトしたりしても、その時点までに生成されたトレースを分析できます。

開始するには、xdebugを使用したプロファイリングも参照してください。

于 2012-08-13T23:46:36.540 に答える