ASP.NET: большая утечка памяти .. Где это? DB? UpdatePanels? Нет одноразовых? - PullRequest
0 голосов
/ 11 января 2011

Я разрабатывал довольно большое приложение и загрузил его на свой сервер несколько дней назад. Теперь я обнаружил, что у него есть несколько утечек памяти. Мой сервер работает под управлением Windows Server 2008 на 1 ГБ оперативной памяти. Когда у меня 0 человек онлайн, используется только 550-600mb. Когда один человек подключается к сети, память начинает стремительно расти, а если 3-4 человека подключены к сети, используется 1 ГБ памяти.

Приложение сделано в ASP.NET с AJAX. Он имеет множество панелей обновления, которые запускаются каждую секунду, и довольно много JavaScript. Он использует 5-7 сеансов в любое время. Я использую LINQ to SQL в качестве связи с базой данных.

Я попробовал perfmon.exe на моем сервере и обнаружил:

  • Коллекция Gen 0 переходит с 0% до 100% в течение минут
  • Коллекция 1 поколения уходит от 0% до 50% в течение 5 минут
  • Генерал 2 очень близок к 0% вообще раз
  • Всего байтов кучи увеличивается до 100% очень быстро

Я также провел анализ моей программы в Visual Studio. 8% моего общего времени выполнения выполняется в методах .ToList (), что правильно вызывается LINQ to SQL.

Мои теории ....

(1) Linq to SQL dataContext

Это может быть сумасшедшей вещью, но: на моем уровне доступа к данным у меня есть множество методов:

  • AddSomethingToDatabase (); * * тысяча тридцать две
  • AddSomethingElseToDatabase ();
  • DeleteSomethingFromDatabase (); * 1 036 *

Каждый из них имеет следующую инициализацию:

GameDataContext db = new GameDataContext();

Это означает, что приведенное выше выражение выполняется почти каждую секунду или более.

(2) Нет объектов, реализующих IDisposable

Я должен быть честным: я никогда не работал с IDisposable. Насколько я прочитал, это может быть проблемой.

Кроме того, если это утечка, какие классы должны ее реализовать? У меня нет никаких операций ввода-вывода или других, только DataContext.

(3) Нагрузка UpdatePanels и jQuery

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


Итак, мой вопрос: есть идеи о том, что может быть утечка памяти? Есть идеи как найти утечку памяти? И есть идеи как это решить?

Я хотел бы услышать от кого-то, кто имеет опыт работы с ситуацией выше!

Спасибо, Lars

Ответы [ 5 ]

5 голосов
/ 11 января 2011

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

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

Кажется, у вас очень жесткие требования к памяти.1 ГБ ОЗУ для Windows 2008 Server просто дает достаточно ОЗУ для выполнения работы, связанной с ОС. Это намного ниже рекомендуемых требований к ОЗУ , что, если я не ошибаюсь, составляет минимум 2 ГБ ОЗУ.Издержки только от запуска w3wp.exe и IIS будут около 200-300 МБ.Тот факт, что поколение 2 всегда составляет около 0%, является лучшим доказательством того, что все выглядит хорошо, и ваш сервер, вероятно, испытывает нехватку памяти.

Мое предложение состоит в том, чтобы предоставить вашему серверу как минимум 2 ГБ ОЗУ (4 ГБ должно быть лучше), а затем отслеживать использование памяти и посмотреть, увеличивается ли она.Если это так, опубликуйте еще один вопрос со своими выводами, и мы сможем вам помочь.

4 голосов
/ 11 января 2011

Вы обязательно должны убедиться, что IDisposable объекты будут вызваны Dispose, когда вы закончите с ними. Самый простой способ сделать это - использовать , используя :

using (GameDataContext db = new GameDataContext())
{
    // code that uses 'db' goes in here
}

// Dispose called when 'using' scope ends

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

Ваши собственные объекты обычно должны реализовывать IDisposable, только если они инкапсулируют неуправляемые ресурсы, для которых вы хотите гарантировать детерминированный выпуск обратно в ОС, чтобы эти ресурсы - файловые дескрипторы, сокеты и т. Д. - не сидели без дела ожидание GC в течение интервала времени, на который вы не можете положиться.

У меня нет ответа на ваш вопрос 3), извините.

0 голосов
/ 11 января 2011

Scitech memory profiler обнаружил наши утечки и дал хороший совет.

0 голосов
/ 11 января 2011

Я не эксперт в этом.Но если вы попробуете ANTS Memory Profiler , это может помочь вам выяснить, в чем проблема.

0 голосов
/ 11 января 2011

Я бы порекомендовал вам использовать профилировщик памяти. Муравьи Редгейта довольно превосходны; это может дать вам представление о том, какие объекты находятся в памяти в данный момент времени.

...