クエリ/アプリケーションのパフォーマンスを向上させるためにビューを事前に生成する、比較的大きな Entity Framework モデル (約 300 テーブル) があります。
アプリケーションの負荷が最小の場合、アプリケーション内のメモリ消費量が 6 ~ 7 時間かけて徐々に増加します。約に達すると。4GB の場合、アプリケーション プールがリセットされ、プロセスが繰り返されます。
図 1: 8 ~ 9 時間にわたるアプリケーションのメモリ消費量を示す
このアプリケーションはリポジトリ パターンのバリエーションを使用し、ObjectContext のインスタンスがトランザクションごとに実現可能な最短時間で再インスタンス化および破棄されるようにします。また、リソースをクリーンアップするために、すべてのリポジトリ/インターフェイスに IDisposable を実装しています。
Red Gate の ANTS プロファイル、WinDbg などのメモリ プロファイラーを使用してアプリケーションで広範なテストを実行しましたが、これまでメモリの問題の正確な原因を特定できませんでしたが、次の点に注意しました。
Red Gate ANTS プロファイラー テストは、作成されている Entity Framework MetadataWorkspace が多すぎることを示しており、多くの余分なオブジェクト マッピングと関連する SQL コマンド テキストが保持されています。また、MetadataWorkspace を含む特定のリポジトリに myEntities の単一のインスタンスがあり、InitializerMetadata キャッシュには、ストレス テストの最後に 351 のエントリが含まれています。これらの 351 のエントリにはそれぞれ myEntities の別のコピーがあり、それぞれに MetadataWorkspace があり、それぞれに何百ものオブジェクト マッピングがあります。
私のコアソリューションは次のように構成されています。
- プレゼンテーション - ASP.NET MVC 3
- ビジネス - オブジェクト、ViewModel、インターフェイス
- インフラストラクチャ - エンティティ フレームワーク モデル
- データ アクセス - ADO.NET ダイレクト データ アクセス
誰かが何か指針を提供できるなら、私はとても感謝しています。