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