プロダクション グレードのサーバー (デュアル クアッド コア、4g) で負荷テストを行うと、ガベージ コレクションに 40% 以上の時間を費やす ASP.NET 2.0 アプリケーションがあります。私は問題を切り分けようとしていますが、コードベースが大きく複雑であるため、処理が遅くなります。GC.Collect() 呼び出しはありません。この種の問題を特定する際に役立つツールや手法はどれですか?
5 に答える
Tess Ferrandez のブログにあるデバッグ ラボは、この種の問題を調べるときに非常に役立ちます。
.Net CLR Profilerを使用してアプリのプロファイルを作成することから始めます(収集したデータを表示するための気の利いた GUI があり、無料です!)。ASP.Net アプリをプロファイリングする具体的な手順については、こちらを参照してください。この記事では、メモリ/パフォーマンスの問題、プロファイリング、および .Net CLR プロファイラーに関する GC の概要を説明しています。
Dispose()
あなたのチームの誰かがメソッドを実際にオーバーライドして頻繁に を呼び出しているかどうかを確認してみてくださいGC.Collect()
。これは私のチームで発生し、Dispose()
メソッドの 1 つを実行するのに 1 秒もかかったほどひどいものでした。
これは、サーバーがその時間の 40% をガベージ コレクションに費やしていると想像できる唯一の方法です。
アプリ全体がクラッシュする直前に、GC が 100% の CPU 時間を使い果たしていることがわかりました。問題は、一度に 20 MB をリークする「オブジェクト リーク」でした。最終的に GC は試行を断念し、メモリを使い果たしました。
perfmon を使用してこれを実行している時間を確認できます。かなりの数のカウンターを持つ GC オブジェクトがあります。
まず最初に、私のトリック ニーが機能していません。それが起こった場合は、雪が降ろうとしているか、誰かが StringBuilder を使用する代わりに文字列連結に多くの「+」演算子を使用していることを意味します。 .
ANTS プロファイラーはどうですか?少し前に使っていて気に入っていました。独自のデータを取得するために使用できるプロファイリング APIもあります。