Unity не утилизируется, вызывая блокировку сервера? - PullRequest
0 голосов
/ 08 июля 2011

У нас есть серверная ферма, состоящая из около 40 серверов, на которые мы обновляем код каждые пару недель.Одна вещь, которую мы заметили, когда мы запускаем код в реальном времени, - это после развертывания сборок и выполнения сброса IIS и помещения его обратно в BigIp (F5), и он получает трафик, сервер блокируется в течение примерно 10 минут, а клиенты просто вращаются до возможногоtimeout.

Глядя на perfmon, мы видим резкий всплеск количества объектов finally и количества закрепленных объектов, что приводит меня к исследованию проблем с памятью.

Итак, одна вещь, которую я начал изучатьнаша конфигурация Unity IoC.В global.asax.cs мы регистрируем около 15 интерфейсов, большинство из которых используют ContainerControlledLifetimeManager для управления временем жизни.Обычно с кодом никогда не возникает проблем, кроме как в этом десятиминутном окне, поэтому моей первой мыслью была проблема с управлением памятью или ресурсами.

Кто-нибудь знает, нужно ли вам явно использовать Dispose () вашего контейнера Unity илиэто как-то обрабатывается Unity автоматически?Сегодня я заметил, что для Application_End не было проводки Dispose на месте, поэтому я подумал, может быть, когда серверы снова включаются после сброса IIS, возникает проблема Unity или ресурса объекта, пока GC не появится и не освободит память (десять минутнужно подойти).

Любая помощь приветствуется!

1 Ответ

1 голос
/ 08 июля 2011

Выполнение iisreset убьет текущий запущенный процесс w3wp.exe, поэтому маловероятно, что неправильная утилизация объектов Unity в Application_End вызовет проблемы с производительностью при запуске. Возможно, старый веб-процесс неправильно высвобождает файловую систему или другие ресурсы, от которых зависит новый веб-процесс, но я думаю, что в этом случае вы увидите доступ к файлу или другие ошибки.

Поскольку вы выполняете iisreset, я бы внимательно посмотрел на код, который запускается при первом запуске приложения. Возможно, есть некоторые компоненты, которые требуют много времени для запуска (например, есть класс синглтонного типа, который загружает и кэширует кучу вещей из базы данных), которые вызывают замедление, возможно, только в сочетании с нагрузкой обработка всех ожидающих HTTP-запросов. Кроме того, имейте в виду, что ASP.NET будет нести большие издержки при компиляции приложения, которое будет использоваться в первый раз. Поскольку кажется, что ваше веб-приложение находится за балансировщиком нагрузки, вы можете предложить способ «заливки» приложения на каждом отдельном веб-сервере, прежде чем добавить этот веб-сервер обратно в балансировщик нагрузки, что может быть достигнуто просто загрузить страницу локально на этом веб-сервере. Заправка приложения позволит веб-приложению инициализироваться без необходимости обработки внешних запросов, что должно сократить время запуска.

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

...