Как я могу отследить очевидную утечку памяти в приложении asp.net?

Немного справочной информации:

  • У нас есть несколько веб-сайтов, работающих на 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 правильно очищать свои соединения?


person Chris Haines    schedule 06.10.2010    source источник
comment
проверьте свой монитор активности sql-сервера, возможно, ваше приложение не пропускает память, а подключается к sql-серверу. если это так, вы должны увидеть много спящих процессов.   -  person marc.d    schedule 06.10.2010
comment
Как далеко вы продвинулись с DebugDiag?   -  person Kev    schedule 06.10.2010
comment
Привет, Кев, не очень далеко. Он вообще не сообщал о каких-либо проблемах. Я не думаю, что это была проблема IIS, но, как предположил marc.d, соединения sql-сервера задерживаются из-за проблем с SQL.   -  person Chris Haines    schedule 06.10.2010
comment
@Hainesy ваше редактирование читается так, как будто вы занимались обслуживанием сервера, включало ли это обновление или установку антивирусного программного обеспечения? если да, вы должны попытаться отключить защиту в реальном времени или, по крайней мере, исключить файлы mdf, ldf и ndf.   -  person marc.d    schedule 07.10.2010
comment
@ marc.d на самом деле все, что я сделал, это установил обновления Windows. Некоторые из них потерпели неудачу. Но у нас все равно установлен антивирус, я последую вашему совету и отключу эти типы файлов.   -  person Chris Haines    schedule 07.10.2010
comment
Можете ли вы без проблем получить доступ к серверу из вашей версии анализатора запросов или Enterprise Manager? Если вы можете, это может быть проблема с разрешениями на веб-сайтах. Вы пытались вручную исправить SQL-сервер с последним обновлением? Это со всеми сайтами или с конкретными?   -  person Stryder    schedule 07.10.2010
comment
@Varuuknahl - Да, я регулярно без проблем взаимодействую с сервером с менеджером предприятия. Сегодня мы попытались установить исправление до 2005 SP3, но обновление не удалось 3 раза подряд, поэтому мы сдались. Я не совсем уверен, какую часть вы описываете как проблему с разрешениями?   -  person Chris Haines    schedule 07.10.2010
comment
Если он не работает медленно в вашей корпоративной среде, проблема возникает только из-за веб-запросов. Когда я сталкивался с этой проблемой в прошлом, это всегда была проблема с разрешениями и временем ожидания, связанная только с моими веб-запросами, что означало, что моя установка прошла нормально, хотя похоже, что проблема с вашей. Я смог решить свою проблему, установив более длительный период ожидания, а затем систематически запуская свои сценарии и функции, пока не нашел тот, который не был настроен правильно. Либо это, либо какой-то парень из колледжа пытался получить доступ к моей базе данных.   -  person Stryder    schedule 07.10.2010
comment
@Varuuknahl - я почти уверен, что проблема связана с тем фактом, что большое количество запросов на нашем веб-сайте сосредоточено вокруг одной таблицы в SQL ... что в основном вызывает блокировки и тайм-ауты.   -  person Chris Haines    schedule 07.10.2010
comment
Это могло сделать это. Если это так, все, что вы можете сделать, это уточнить свои процедуры, чтобы они были более строгими. В анализаторе запросов есть хороший инструмент, чтобы увидеть, где находятся ваши самые тяжелые подмножества запросов, Execution Plan. Я предполагаю, что вы не можете уменьшить размер таблицы, архивируя записи. Вы также можете попробовать работать с представлениями для ваших более распространенных поисков/задач в этой таблице. Я не думаю, что могу предложить что-то еще, кроме просмотра ваших процедур или вашей базы данных. Удачи!   -  person Stryder    schedule 07.10.2010


Ответы (1)


Итак, в конце кажется, что это довольно сложно. Взаимоблокировки Sql и проблемы с данными, усугубляемые, по-видимому, антивирусным программным обеспечением, которое блокировало или блокировало файл.

Отключение антивируса уменьшило проблемы, но нам все еще нужно решить основные проблемы с данными.

person Chris Haines    schedule 11.10.2010