6

大規模な ASP.net 4.0 Web サイトを運営しています。一般的な .Net コンテンツ管理システムを使用し、何千ものコンテンツ アイテムと何百もの同時ユーザーを持ち、基本的に重い Web サイトです。

IIS7 ワーカー プロセスのメモリ使用量は、1 日で 8 ~ 10 GB に達する可能性があります。サーバーには 16GB がインストールされており、現在、アプリ プールを 1 日 1 回リサイクルするように設定されています。

メモリ使用量を減らすよう圧力をかけられています。メモリ使用量の多くは、大量のデータ文字列のキャッシュによるものですが、キャッシュ間隔は 5 ~ 10 分に設定されているため、これらの文字列は最終的にメモリから期限切れになるはずです。

ただし、RedGate Memory Profiler を実行した後、メモリ リークと思われるものを確認できます。「破棄されたオブジェクトによってのみメモリに保持される」オブジェクトでインスタンス リストの結果をフィルタリングしました (これがメモリ リークを見つける方法であると RedGate フォーラムで読みました)。これにより、メモリに保持されている文字列の長いリストが得られました。

各文字列について、Instance Retention Graph を使用して、何がメモリに保持されているかを確認します。System.string オブジェクトは、System.Web.Caching.CacheDependency によってある時点でキャッシュされたようです。グラフをずっと上にたどると、System.Collections.Specialized.ListDictionary を含むさまざまな他のクラスを通過し、System.Web.FileMonitor に到達します。文字列はファイルへのパス(画像/ PDFなど)であるため、これはある程度理にかなっています。

CMS がファイルへのパスをキャッシュしているように見えますが、これらのキャッシュされたオブジェクトは「リーク」されています。時間の経過とともに、これが蓄積され、RAM を使い果たします。

申し訳ありませんが、これは長く続きました...これらのメモリリークを止める方法はありますか? または、アプリ プールのリサイクルに頼らずにそれらをクリアするには? リークを修正できるかどうかを確認するために、キャッシュを実行しているクラス/コードを見つけることはできますか?

4

1 に答える 1

0

セッション状態の一部としてものがメモリに残されるという非常に一般的な問題のように思えます。その場合、唯一のオプションは、1.各ユーザーのセッションにあまり多くのものを置かない、2.セッションの有効期間を短く設定する(デフォルトは20分だと思います)、3.アプリケーションプールを定期的にリサイクルする.

1. の一部として、データ グリッド コントロールにデータを表示する「良い方法」と「悪い方法」があることを発見しました。必要なデータのみをコピーしており、誤ってデータグリッド全体への参照を維持していないことを確認したい場合があります。

于 2013-02-20T12:08:58.430 に答える