私はAzure SDLデータベースを操作するためにEF 6.xを使用するASP.NET MVCアプリケーションで作業しています。最近、負荷アプリの増加に伴い、SQLサーバーと通信できなくなった状態になり始めます。私はexec sp_who
を使用して、私のデータベースに100個のアクティブな接続があることがわかりますし、任意の新しい接続は次のエラーで作成することができません:時間のアプリのほとんど ADO.NETプールされた接続を再利用することができません
は10から20までの平均アクティブ接続数で動作します。そして、どんな負荷でもこの数値は変わらない...負荷が高いときにはレベル10-20にとどまる。しかし、ある状況では、1分以内に100分までしか立ち上がることができず、時間が掛かりません。これは、すべてのリクエストが失敗したときにアプリ状態を引き起こします。これらの接続はすべて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.
sleeping
と
awaiting 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
は、必要なときに(提供される機能を使用して)接続を作成し、それを使用した場合、それは行かせていませんか?
正しくコンテキストを破棄してもよろしいですか? –
はい、すべての接続はusing()スコープで作成されます。さらに、同じ負荷アプリで数週間、数週間働いてから突然障害状態に陥る可能性があります。 –
あなたは、データベースの単純なボトルネックを排除し、エスカレーションとその他のものをロックしましたか?それは、長時間実行されているプロセスがホギングしているリソースを待っているリクエストの待ち行列ですか?表示されている接続の蓄積期間中に、インデックスの再構築やその他のメンテナンスが行われますか? –