Мониторинг времени открытия соединения ADO.NET

У нас есть трехуровневое приложение с клиентом C #, уровнем веб-службы C # WCF и базой данных SQL Server. Веб-служба подключается к базе данных с помощью ADO.NET. Весь наш код C # использует .NET Framework 2.0.

Недавно клиент провел стресс-тест нашего приложения. Во время теста веб-сервер выдал множество ошибок, например следующих:

Не удалось подключиться к базе данных для строки подключения "...". Истекло время ожидания. Время ожидания истекло до завершения операции или сервер не отвечает.

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

Мы пытаемся выяснить, почему у веб-сервера истекло время ожидания подключения к базе данных. Я настроил веб-сервер, чтобы включить все Счетчики производительности ADO.NET. Однако я не вижу ничего, связанного со временем, необходимым для подключения, тайм-аутом подключения и т.п. В идеале мы могли бы построить график времени соединения в perfmon рядом с другими счетчиками ADO.NET.

Есть ли способ контролировать производительность ADO.NET при получении подключений?

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


person Paul Williams    schedule 22.02.2013    source источник
comment
Поможет ли в этом отношении SQL Profiler?   -  person Mr Moose    schedule 22.02.2013
comment
@MrMoose: Профилировщик очень помог в поиске проблемных запросов. Но мне нужно что-то конкретное, чтобы контролировать время соединения, чтобы увидеть, когда оно увеличивается, а когда начинается тайм-аут.   -  person Paul Williams    schedule 22.02.2013
comment
Здесь нужен ответ, в частности, о мониторинге времени ОТКРЫТИЯ соединения. Например ... сколько времени занимает вызов SqlConnection.Open - сколько времени он ожидает, когда соединение пула станет доступным конкретно - для диагностики того, почему соединения пула становятся доступными так долго. Такие вещи, как утечки соединений и т. Д. Фреймворки, такие как EF, не открывают такие события, как открытие соединения, и закрывают чертовы классы для фабрик соединений и DbConnections, поэтому их сложно инструментировать. Нам понадобится что-то на уровне ADO.NET, но у него нет таких счетчиков производительности.   -  person Triynko    schedule 19.04.2021


Ответы (1)


Вы можете использовать perfmon для получения этой информации. Вам нужно будет подключиться к User Connections монитору под SQL Server: General Statistics. Вот сообщение в блоге, откуда я его взял. Это позволит вам узнать, в какой момент времени соединения остаются открытыми.

Затем вам нужно будет соотнести это с задачами приложения (то есть с тем, что вы делаете в приложении, когда видите, что они постоянно растут).

Как только вы это сделаете, вы захотите получить эти соединения внутри оператора using, если вы еще этого не сделали:

using (SqlConnection cn = new SqlConnection("some connection string"))
{
    cn.Open();
    ...
}

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

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

person Mike Perrenoud    schedule 25.02.2013
comment
Спасибо, но меня не беспокоит дипосал подключения приложения. Я почти уверен, что наш объект данных делает это правильно. Мне интересно, почему иногда подключение к базе данных занимает много времени. В частности, я хотел бы отслеживать время установления соединения через perfmon, чтобы я мог сопоставить всплески времени установления соединения с некоторыми номерами базы данных, такими как ожидающие операции ввода-вывода или использование ЦП или тому подобное. Я не вижу другого способа сделать это, кроме как создать свой собственный счетчик. - person Paul Williams; 04.03.2013