2017-01-28 3 views
3

私はAzure SDLデータベースを操作するためにEF 6.xを使用するASP.NET MVCアプリケーションで作業しています。最近、負荷アプリの増加に伴い、SQLサーバーと通信できなくなった状態になり始めます。私はexec sp_whoを使用して、私のデータベースに100個のアクティブな接続があることがわかりますし、任意の新しい接続は次のエラーで作成することができません:時間のアプリのほとんど ADO.NETプールされた接続を再利用することができません

System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because of all pooled connections were in use and max pool size was reached.

は10から20までの平均アクティブ接続数で動作します。そして、どんな負荷でもこの数値は変わらない...負荷が高いときにはレベル10-20にとどまる。しかし、ある状況では、1分以内に100分までしか立ち上がることができず、時間が掛かりません。これは、すべてのリクエストが失敗したときにアプリ状態を引き起こします。これらの接続はすべて sleepingawaiting commandです。

クライアント側からの接続プールをクリアするのに役立つ回避策が見つかりました。私はSqlCoonection.ClearAllPools()を使用しています。それはすぐにすべての接続を閉じて、sp_whoはその後私に私の通常の10-20接続を示しています。

悪い部分は、私はまだ根本原因を知りません。ただ、アプリの負荷を明確にする

Owinを設定しながら、私がリークされた接続を見つけることができた単純なパターンとの接続リークを追跡するのに最適な提案を@DavidBrowneで分

あたり1000要求を生成について200-300同時ユーザーであり、エンジン

private void ConfigureOAuthTokenGeneration(IAppBuilder app) 
{ 
    // here in create method I'm creating also a connection leak tracker 
    app.CreatePerOwinContext(() => MyCoolDb.Create()); 
    ... 
} 

基本的Owinが接続を作成し、それを手放すとWebAPI負荷が増加したとき、私は悩みを持っていないすべてのリクエスト、と。

は怠惰に十分にスマート本当の原因と私Owinは、必要なときに(提供される機能を使用して)接続を作成し、それを使用した場合、それは行かせていませんか?

+0

正しくコンテキストを破棄してもよろしいですか? –

+0

はい、すべての接続はusing()スコープで作成されます。さらに、同じ負荷アプリで数週間、数週間働いてから突然障害状態に陥る可能性があります。 –

+0

あなたは、データベースの単純なボトルネックを排除し、エスカレーションとその他のものをロックしましたか?それは、長時間実行されているプロセスがホギングしているリソースを待っているリクエストの待ち行列ですか?表示されている接続の蓄積期間中に、インデックスの再構築やその他のメンテナンスが行われますか? –

答えて

1

非常にありそうもないこれは、アプリケーションコードの漏洩接続以外のものによって引き起こされたものです。

ここでは、接続がリークしたときを追跡し、最初に接続を開いたコールサイトを報告するために使用できるヘルパーライブラリを示します。

http://ssbwcf.codeplex.com/SourceControl/latest#SsbTransportChannel/SqlConnectionLifetimeTracker.cs

+0

この種類のヘルパーで接続リークを見つけることは素晴らしい提案です。私は間違いなくそれを試してみます。 –

+0

私は質問を更新しました。おそらく原因が1つの接続リークを検出しました。私の研究を続ける –

関連する問題