MVC3 управление памятью - PullRequest
       5

MVC3 управление памятью

1 голос
/ 23 февраля 2012

Каков наилучший способ проверить использование памяти в приложении ASP.NET MVC3?

Мой провайдер хостинга велел мне периодически переопределять пул приложений IIS для повышения скорости работы сайта. Это то, что является «рекомендуемой практикой»? Конечно, мне не нужно перезапускать приложение так часто? Я бы предпочел выяснить, если это проблема с использованием памяти в моем приложении, и исправить это. Поэтому любые советы и рекомендации, которые вы используете, также будут весьма полезны.

Приложение основано на ASP.NET MVC3, C # и EF Code First. Любое руководство, ссылки приветствуются.

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

Первое использование памяти ASP.NET MVC и EF Code

Спасибо

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

У меня есть сайт, который никогда не перезагружается (пока машина не перезагружается еженедельно)

Ваше приложение, как правило, должно продолжать работать нормально. Если это не так, есть некоторая утечка. Это может произойти, потому что

  1. Срок хранения кэша не истекает
  2. Срок хранения кэша не истекает
  3. Сеанс хранилища продолжает расти и никогда не истекает
  4. ObjectContexts никогда не удаляются и не сохраняются в сеансе и т. Д.
  5. Объекты, которые следует утилизировать, не являются

  6. Объекты, созданные с помощью контейнера внедрения зависимостей, не настроены на выпуск после каждого запроса, и, следовательно, потенциально могут иметь внутренние коллекции, которые продолжают расти.

Есть еще несколько причин, но это несколько основных.

Таким образом, вопрос на самом деле таков: «Лучшей практики нет - это зависит от вашего приложения»

Если вы беспокоитесь о текущих сеансах во время перезапуска, имейте в виду, что перезапуск может быть быстрым, и текущим запросам разрешается (иногда), и токены проверки подлинности форм переживают перезапуск, однако сеансы не будут выполняться, если вы не настроите out сервера состояний процесса.

Если использование памяти продолжает расти, настройте расписание перезапуска, в противном случае делайте это раз в неделю или никогда - или настройте, как только память перейдет в XYZ, а затем выполните сброс. ASP.NET будет перезапущен автоматически, как только будет достигнут определенный порог, а также в зависимости от того, что хостер настроил на memoryLimit: http://msdn.microsoft.com/en-us/library/7w2sway1.aspx

0 голосов
/ 23 февраля 2012

По умолчанию IIS автоматически перезагружает пул приложений с интервалом (я думаю, что это около 29 часов или около того), но это, безусловно, устанавливается хостом, независимо от того, насколько мало или сколько памяти вы используете для процесса. Триггер перезапуска может быть временным интервалом или когда процесс достигает определенного предела использования памяти. Я уверен, что на любом общем хосте установлены оба.

Что касается использования памяти, вы можете использовать метод GC.GetTotalMemory, который даст вам приблизительное использование. Даже при использовании Perfmon показания не очень точны, но дают представление.

//global.asax.cs
 void Application_EndRequest(object o,EventArgs a)
 {
   var ctype=Context.Response.Headers["Content-Type"];
   if (ctype == null || !ctype.Contains("text/html")) return;  
   Context.Response.Write(string.format("<p>Memory usage: {0}</p>",GC.GetTotalMemory(false)));
 }

Имейте в виду, что вы увидите, что использование будет увеличиваться до тех пор, пока не начнет работать GC, и использование снизится до более «реалистичного» значения.

Если у вас есть деньги, я рекомендую специализированный инструмент, такой как Профилировщик памяти

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

  • Правильное наложение приложений означает, что вы можете реорганизовать более неэффективные части, не затрагивая другие.
  • Шаблон репозитория будет очень полезен, потому что вы можете начать использовать EF, выяснить, что EF использует много памяти (как в ссылке, которую вы нашли), но затем вы можете переключить реализацию репозитория на использование PetaPoco или Dapper. .net.
  • В общем случае OR \ M - это более тяжелая библиотека, если приложению не нужны функции ORM, а просто быстрый способ работы с БД, используйте с самого начала микроорму, подобную упомянутой выше.
  • Всегда располагайте объекты, реализующие IDisposable.
  • При работе с большими записями БД используйте нумерацию страниц. Это хорошо как для использования ресурсов сервера, так и для взаимодействия с пользователем
  • Примените принцип YAGNI (вы не нуждаетесь в этом) насколько это возможно, это как-то подразумевает немного TDD:)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...