Использование системного монитора для мониторинга соединений в пуле

Я исследую эту ошибку из приложения MVC3, которое не работает под нагрузкой:

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

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

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

Однако оба они отображаются и отключены / выделены серым цветом.

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

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


person VincentH    schedule 16.08.2013    source источник
comment
Второй счетчик я считаю правильным. Что вы имеете в виду, когда у вас это неактивно? Как вы не можете добавить эти мониторы? У вас есть доступ администратора к машине?   -  person DavidN    schedule 16.08.2013
comment
Да, если я попытаюсь добавить эти мониторы, ничего не произойдет. А я админ на машине   -  person VincentH    schedule 16.08.2013


Ответы (2)


Вы можете запустить это из окон 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 открывать еще одно соединение для продолжения обработки.

person Brian    schedule 16.08.2013
comment
Это выглядит полезно, но говорит ли мне, объединено ли соединение в пул или нет? - person VincentH; 16.08.2013
comment
Кажется, не существует динамического, запрашиваемого способа узнать, объединено ли живое соединение. Все примеры, которые я видел, основаны на а) создании таблицы и триггера для хранения данных о соединении и б) использовании данных о входе в систему (которые содержат IsPooled) для заполнения таблицы. Вот пример: sqlservercentral.com/Forums/Topic798425-146-1 .aspx#bm798660 - person Brian; 16.08.2013

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

Аудит класса событий входа

На стороне приложения вы можете использовать счетчики производительности ".NET DATA PROVIDER FOR SQL SERVER" на perfmon.

Счетчики производительности в ADO.NET

person Salvador L    schedule 10.10.2015