3

背景: 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
4

1 に答える 1

2

サービスのインスタンスを取得するためだけに新しい StandardKernel を作成しているという事実は、あなたが Ninject を間違った方法で使用していることを信じさせます。

NinjectMVC3 クラスには New StandardKernel が 1 つだけ存在する必要があります

于 2012-08-10T08:11:47.987 に答える