Как обнаружить утечки соединения SqlServer в приложениях ASP.net? - PullRequest
31 голосов
/ 17 октября 2008

В настоящее время я тестирую GUI в приложении ASP.net 2.0. СУБД - это SQL Server 2005. Хост - это Win Server 2003 / IIS 6.0.

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

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

Полагаю, сборщик мусора .Net в конечном итоге закроет их, но ... это может занять некоторое время, нет?

У меня есть SQL Server Management Studio, и я замечаю на мониторе активности, что в базе данных открыто довольно много соединений.

Из всего сказанного выше, несколько вопросов, связанных с основным вопросом:

  1. Есть ли способ узнать в SQL Server 2005, если соединения открыть, потому что они ждут, чтобы быть используется в пуле соединений или если они открыты, потому что они используются применение

  2. Знает ли кто-нибудь о добре онлайн / бумажные ресурсы, где я мог научиться использовать производительность счетчики или другие инструменты чтобы помочь отследить такого рода вопросы?

  3. Если счетчики производительности являются лучшими Решение, какие переменные, которые я надо смотреть?

Ответы [ 6 ]

59 голосов
/ 14 сентября 2012

Найдена эта тема, исследующая похожую проблему. Я придумал следующий sql как хороший способ отладки неплотных соединений в SQL Server:

SELECT S.spid, login_time, last_batch, status, hostname, program_name, cmd,
(
      select text from sys.dm_exec_sql_text(S.sql_handle)
) as last_sql
FROM sys.sysprocesses S
where dbid > 0
and DB_NAME(dbid) = '<my_database_name>'
and loginname = '<my_application_login>'
order by last_batch asc

Это дает вам все открытые соединения в конкретной базе данных и имени входа, вместе с последним sql, выполненным для этого соединения , отсортированным по времени, когда этот sql был выполнен.

Из-за пула соединений вы не можете просто полагаться на тот факт, что вокруг висит много соединений, чтобы сказать вам, что у вас есть утечка соединений, потому что пул соединений будет держать соединения вокруг, даже если они закрыты правильно от код. Однако, если у вас есть утечка соединения, вы увидите, что некоторые соединения «зависли» - они отобразятся в приведенном выше запросе, а отметка времени «last_batch» никогда не изменится. Другие соединения также будут зависать, но каждый раз, когда на них запускается новый sql, отметка времени «last_batch» обновляется. Таким образом, эффект заключается в том, что замороженные соединения будут всплывать в верхней части этого запроса.

Если у вас есть исходный код рассматриваемого приложения, тот факт, что он дает вам последний sql, выполненный для потерянного соединения, очень важен для отладки.

7 голосов
/ 28 октября 2010

Я столкнулся с этой проблемой и обнаружил, что SQL Server Profiler является отличным инструментом. Я за короткое время проверил сайт и обнаружил множество создаваемых соединений (sp_who), которые не были повторно использованы Connection Pool, поэтому я просто открыл SQL Server Profiler, а затем проверьте, все ли вызовы SP, сделанные из кода, сопровождались вызовом sp_reset_connection. Если до начала новой партии вызова нет, вам просто не хватает первого соединения.

2 голосов
/ 17 октября 2008

Справочник MSDN о ( счетчиках производительности ADO.NET ) довольно ясно говорит о том, что вы можете искать при профилировании приложения. Вы можете отслеживать счетчики с помощью встроенного в Windows приложения perfmon .

Кроме этого, я бы посоветовал узнать о пуле соединений ADO.NET. Если вы действительно подозреваете ошибку в их коде, вы можете посмотреть на нее, используя Red Gate's Reflector (пока бесплатно), который разбирает MSIL на C #.

2 голосов
/ 17 октября 2008

Вы всегда можете проверить строки подключения из web.config (в основном, если у них активирован пул подключений, если у них включены какие-либо ограничения подключения).

Кроме того, если вы используете IIS 6, вы можете настроить свое веб-приложение на использование отдельного пула приложений и установить другой параметр для повторного использования памяти и процессов.

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

Если у вас есть доступ к серверу sql, вы можете отслеживать соединения, сделанные из вашего приложения (для каждого установленного экземпляра SQL Server определены счетчики производительности).

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

И, если у вас нет исходного кода, попробуйте использовать Reflector , чтобы получить исходники приложения (они были бы очень полезны для отладки)

@ Позднее редактирование: Вы можете проверить этот вопрос и здесь, на stackoverflow.com

1 голос
/ 17 сентября 2011

Тодд Денлингер написал фантастический класс http://www.codeproject.com/KB/database/connectionmonitor.aspx, который следит за соединениями с Sql Server и сообщает о тех, которые не были должным образом уничтожены в течение определенного периода времени. Подключите его к своему сайту, и он сообщит вам, когда возникнет утечка.

1 голос
/ 17 октября 2008

Я бы начал с просмотра соединений и просмотра времени активности, а также выяснил, сможете ли вы найти элементы, которые поддерживают соединения открытыми.

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

Если бы открытые соединения были проблемой, в мониторе активности вы увидите ОЧЕНЬ большое количество соединений без активности.

Для счетчиков производительности вы можете начать смотреть на объект производительности «SQL Server: General Stats».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...