Некоторая справочная информация:
- У нас есть несколько веб-сайтов, работающих на 64-битной машине с IIS6
- Все эти сайты имеют одинаковый код ядра, но разные скины и контент
- У нас есть база данных SQL 2005, которая довольно активно используется на сайте
- Исторически мы использовали хранимые процедуры SQL, но постепенно переходили на NHibernate. Большая часть нашего кода использует NHibernate сейчас, но не все.
- Эти сайты некоторое время нормально работали на нашем живом веб-сервере, хотя в день мы получаем несколько ошибок, связанных с подключением / взаимоблокировкой SQL.
В прошлый четверг мы заметили, что сайты работают очень медленно, а затем проверка диспетчера задач показала, что один из сайтов загружает более 1,6 ГБ памяти. С тех пор мы перезапускаем приложение и наблюдаем, как оно медленно увеличивается в размере в течение дня.
У нас явно есть утечка памяти (или, по крайней мере, таков эффект), но я теряю волосы, пытаясь понять, как ее отследить.
Похоже, что это происходит только на этом сайте, хотя, насколько я знаю, в коде ничего не изменилось до того, как это начало происходить. Тем не менее, это наш самый загруженный веб-сайт, поэтому может возникнуть проблема с трафиком.
Диагностика отладки не выявила никаких проблем.
Обновление некоторых страниц очень быстро приводит к быстрому подъему памяти, затем к ее небольшому падению, но все время постепенное продвижение вверх.
Я не могу повторить проблему на наших тестовых серверах или локально. Возможно, потому что трафик как-то связан с этим.
Я подозреваю, что проблема заключается в подключении / блокировке базы данных. Однако я не уверен, как это может вызвать указанную проблему.
Есть идеи?
Редактировать
Хорошо, не совсем уверен, что нашел проблему, но мы приближаемся. Это определенно связано с SQL. Журнал ошибок показывает много ошибок с прошлого четверга.
Все это произошло после того, как мы запустили обновления Windows на наших серверах. Сбой одного из обновлений на сервере SQL, поэтому не уверен, что это вызвало некоторые проблемы.
Предупреждения, которые мы получаем:
- SQL Server обнаружил XX случаев, когда запросы на ввод / вывод заняли более 15 секунд для файла .. tempdb.mdf
Где XX что-нибудь между 17 и 90! Это похоже на проблему взаимоблокировки?
Далее следуют следующие ошибки:
- Невозможно завершить процесс входа в систему из-за задержки открытия соединения с сервером
Они совпадают с нашим временем регистрации, когда веб-сайты «переворачивались».
Мы увеличили размер файла подкачки на сервере SQL до рекомендованного размера, так как он был установлен максимально до 4 ГБ, но рекомендуется 12 ГБ. Я думаю, нам может понадобиться откатить обновления Windows, которые мы сделали в четверг, если это не поможет.
К сожалению, я не могу войти в Монитор активности, так как он сообщает мне, что время ожидания истекло!
Редактировать
Хорошо, после перезагрузки я в Мониторе активности. Сколько процессов сна вы бы назвали нормальным? У нас примерно 127 спящих. Это обслуживает более 10 веб-сайтов.
Если возникнет проблема взаимоблокировки или тайм-аута, не сможет ли NHibernate правильно очистить свои соединения?