2013-08-16 9 views
5

Я расследую эту ошибку из приложения MVC3, который падает под нагрузкой:.Использование Performance Monitor для мониторинга объединенных соединений

«Время ожидания истекло до получения соединения из пула Это может произойти, потому что все объединенные соединения были использованы и максимальный размер пула был достигнут ».

Приложение использует шаблон хранилища и платформу Entity Framework, и моя догадка заключается в том, что он не закрывает соединения должным образом. Я хочу иметь возможность контролировать количество объединенных подключений на SQL Server. Поиск вокруг заставляет меня верить, что я могу использовать эти счетчики в Perfmon:

  • .NET CLR данные
  • Поставщика
  • данных .NET для SQLServer

Однако оба они показывают, будучи инвалидами/неактивно вне.

Я запускаю Perfmon непосредственно на сервере, и на сервере работают как ISS, так и SQL Server. Любые идеи, почему эти счетчики не будут доступны?

Я также попытался использовать SQL Profiler для мониторинга объединенных соединений, но столбец EventSubClass недоступен для AuditLogin.

+0

Второй счетчик я считаю правильным. Что вы имеете в виду, когда вы его затушевывали? Как вы не можете добавить эти мониторы? У вас есть доступ администратора к машине? – DavidN

+0

Да, если я попытаюсь добавить эти мониторы, ничего не произойдет. И я администратор на машине – VincentH

ответ

6

Вы можете запустить это из окон SQL-запросов, чтобы получить счет и подробную информацию о текущих подключениях и сеансах, выполняемых на вашем SQL-сервере.

select * FROM sys.dm_exec_sessions AS es 
INNER JOIN sys.dm_exec_connections AS ec 
ON es.session_id = ec.session_id 

У меня были проблемы с объединенными соединениями. Их трудно контролировать. Явное закрытие их никогда не работало, поскольку они находятся под контролем .NET. Самая большая причина, по которой у нас закончились соединения, - это незафиксированные транзакции. Если по какой-либо причине транзакция остается незафиксированной или откатанной, соединение, а не повторное использование, задерживается в неопределенности, заставляя .NET открывать еще одно соединение для продолжения обработки.

+0

Это выглядит полезным - но это говорит мне, связано ли объединение или нет? – VincentH

+0

Кажется, что нет динамичного, надежного способа найти, если соединение в реальном времени объединено. Все примеры, которые я видел, основывались на: a) создании таблицы и триггера для хранения данных соединения; б) использовании данных событий входа (которые содержат IsPooled) для заполнения таблицы. Вот пример: http: //www.sqlservercentral.com/Forums/Topic798425-146-1.aspx#bm798660 – Brian

1

С точки зрения SQL, единственный способ проверить это - настроить трассировку событий входа. Столбец «Подкласс события» скажет вам, произошло ли событие с использованием объединенного соединения или нет. При этом вы можете сопоставить имена хостов, логинов и приложений и продолжить копание.

Audit Login Event Class

На стороне приложения вы можете использовать счетчики производительности "ПОСТАВЩИК ДАННЫХ .NET для SQL Server" на PerfMon.

Performance Counters in ADO.NET