背景: Ninject 2.2.0.0 IoC、リポジトリパターン、およびサービスレイヤーを使用したAsp.netプロジェクト(VB.Net)
NinjectバインディングはInRequestScope()を使用します
問題: プロジェクトが稼働しようとしていますが、ストレステストの結果、サイトでメモリが頻繁に使用されており、使用後に廃棄されていないことが判明しました。これについてのアイデアを与えるために:約2分でビジネスプロセスごとにユーザーインスタンスあたり約70〜100 MBのメモリ使用量、したがって16人のシミュレートされたユーザーが10分以内にメモリ(およびCPU)の過負荷とサイトクラッシュを引き起こすことができました。(サーバーには8GBのRAMがあり、他の重要なプロセスは実行されていません)。
次の解決策を試しました。BaseController(すべてのコントローラーによって継承される)、ベースリポジトリ、およびメインデータベースコンテキストで、Disposeを使用したUsingブロックの実装を試みました。
dbcontextがすぐに破棄されたため、サイトをロードできなかったため、disposeからサイトを削除する必要がありました。
ANTSメモリプロファイラーを使用しても実際にはそうではありませんでしたが、ANTSパフォーマンスプロファイラーは、NinjectがDispose機能に到達できないことを示しました。C:\ Projects \ Ninject \ Maintenance2.2 \ ninject \ src \ Ninject \ Infrastructure\DisposalフォルダーでDisposableObject.csを検索しようとしていました。そこにそれを見つけることができなかったのでクラッシュしました。ANTS Reflectorは、同じDisposableObjectコードをNinject.dllから逆コンパイルしたため、存在しないデフォルトディレクトリでそれを探していた理由がわかりません。
そこで、Ninjectを2.2.0.0からアップグレードしてみました。Nugetを使用してv3PM> Install-Package Ninject.MVC3
にいくつかの変更を加えた後、動作させましたが、バージョン2.2.0.0のActionFilterAttributeでスタックし、次のようにNinjectFactoryControllerを使用してカーネルバインディングを取得しています。
Private _mailService As IEmailService
_mailService = New StandardKernel(New NinjectControllerFactory.QuickQuoteServices()).Get(Of IEmailService)()
Ninject.MVC3の場合、NinjectFactoryControllerはコメント化され、すべてのバインディングはApp_StartフォルダーのNinjectWebCommon.vbのレジスタサービス部分にあります(https://gist.github.com/923618ページの2番目のコードブロックから取得したVBコード)。
そのため、ActionFilterAttributeコードを次のように変更する必要がありました。
<Inject()>
Private _mailService As IEmailService
(NinjectFactoryController行はコメント化されています)。
これにより、_mailServiceがNothingとして返されるため、実際にはバインディングが機能していません。
ただし、この新しいNinject.MVC3バージョンを使用したANTSメモリプロファイラーでは、メモリの改善は観察されていません。
ANTSパフォーマンスプロファイラーはクラッシュすることなく動作していますが、間違った場所にある他のファイル(KernelBase.cs、ExtensionsForIEnumerableOfT.cs、Binding.csなど)を探しているようです。 c:\ Projects \ Ninject \ ninject \ src \ Ninject ...フォルダーにあります)。
それでもメモリリーク/オーバーロードの起点に到達することはできませんが、これは、アプリケーションプールがビジネスロジックの一部を実行するたびに70〜100 MBのデータを蓄積しており、このメモリが解放されていないことを示しています。サイトが完全に非アクティブになるまで(ISS 7アイドルタイムアウトベース)20分まで。これは、その段階に達する前にサイトがクラッシュするため、まったく役に立ちません。
何かアドバイスをいただければ幸いです。
敬具、
- Abrar
編集:
なんとかNinject3.0をいくつかのガイダンスで動作させることができました。
また、ActionFilterAttributeでのNinject 3の使用に関する問題は、次のようなプロパティ宣言を使用して解決されました。
<Inject()>
Public Property _mailService() As IEmailService
Private Get
Return m_mailService
End Get
Set(value As IEmailService)
m_mailService = value
End Set
End Property
Private m_mailService As IEmailService
Ninject 3が機能するようになったため、メモリの問題はわずかに改善されました(つまり、メモリが以前よりも少し多く解放されています)が、新しい問題が発生しました。CPU使用率は非常に高いです。この問題は、Ninjectが2.2から3.0にアップグレードされる前でも発生していましたが、アップグレードによる影響はなかったようです。CPUはまだ2〜3人のユーザーで最大になっており、これによりサイトが応答しなくなり、使用してから約10分以内に最終的にクラッシュします。
どんな考えでもいただければ幸いです。
敬具、
- AbrarHF