2017-01-28 3 views
3

Я работаю над приложением ASP.NET MVC, использующим EF 6.x для работы с моей Azure SDL Database. В последнее время приложение с увеличенной нагрузкой начинает попадать в состояние, когда оно больше не может связываться с SQL-сервером. Я могу видеть, что есть 100 активные подключений к базе данных с помощью exec sp_who и любое новое соединение не может создать со следующей ошибкой: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. Но в некоторых ситуациях это может быть до 100 менее чем за минуту без какого-либо увеличения времени, и это вызывает состояние приложения, когда все мои запросы терпят неудачу. Все эти 100 соединений находятся в состоянии sleeping и awaiting command.

Хорошей частью я нашел обходное решение, которое помогло мне смягчить проблему - очистить пул соединений с клиентской стороны. Я использую SqlCoonection.ClearAllPools(), и он мгновенно закрывает все соединения, и sp_who показывает мне мое регулярное соединение 10-20 после этого.

Плохая часть, я до сих пор не знаю причину.

Просто для уточнения нагрузки приложения о 200-300 одновременно работающих пользователей, которые генерируют 1000 запросов в минуту

С большим внушения @DavidBrowne отслеживать просочились соединение с простым рисунком я был в состоянии найти просочились соединениями при настройке Owin двигатель

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

Да, все соединения создаются при использовании области(). Более того, с тем же загрузочным приложением может работать несколько дней, даже недель, а затем внезапно попасть в состояние отказа. –

+0

Вы исключили просто узкие места в своей базе данных, заблокировали эскалацию и многое другое. Может ли это быть очередь запросов, ожидающих ресурса (ов), который длительный процесс запутывает? Любая перестройка индекса или другое обслуживание происходит во время периодов наращивания соединения, которые вы видите? –

ответ

1

Это очень маловероятно что это вызвано чем-либо другим, кроме вашего кода приложения утечки соединений.

Вот вспомогательная библиотека, которую вы можете использовать для отслеживания утечки соединения, и сообщите об этом сайте вызова, который первоначально открыл соединение.

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

+0

Это отличное предложение найти утечку соединения с помощью такого помощника. Я обязательно попробую. –

+0

Я обновил свой вопрос, я обнаружил одну утечку соединения, которая может быть причиной. Продолжайте мое исследование, хотя –

Смежные вопросы