none
IIS 7.0: как при копировании новых файлов избежать создания нескольких доменов в apppool ASP.NET 2.0? RRS feed

Все ответы

  • Второй параметр повлиял на ситуацию не так, как ожидалось: он создаёт на 1 домен меньше (с параметрами по умолчанию создаётся 3-4 домена), но при этом почти каждый раз цепляет лишь половину обновляемых библиотек. А именно они основную часть и составляют — сайт прекомпилирован.

    В итоге в лог начинают сыпаться ошибки "не могу найти страницу такую-то" или всё работает, но внесённых изменений на сайте нет.

    30 октября 2009 г. 16:27
  • Изменив ключи реестра вы отключили сброс кэша и получили разрушенную систему.

    Суть проблемы как я ее понимаю - загрузка приложения в кэш и его инициализация. К сожалению это требует времени: первоначальная инициализация приложения ASP.NET занимает иногда значительное время.

    Честно говоря, не знаю как разработчики решают эту проблему. Могу посоветовать только оптимизировать приложение, возможно разбить его на части для ускорения инициализации.

    Возможно вам помогу на сайте разработчиков http://www.gotdotnet.ru/


    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    2 ноября 2009 г. 5:34
    Модератор
  • Ключ в реестре стоит по умолчанию 5 секунд. Для 6-го IIS =) Для 7-го никаких данных на эту тему не нашёл, возможно он там ведёт себя как-то иначе.

    Сколько времени занимает первоначальная инициализация, неважно, хоть полчаса.
    Важно то, что с параметрами по умолчанию этих инициализаций запускается параллельно 2-5 штук вместо одной.

    За предложенное ускорение инициализации придётся заплатить межпроцесными вызовами через remoting или wcf, дублированием одних и тех же данных несколько раз и так далее — вряд ли овчинка будет стоить выделки.

    Должна быть крутилка таймера — ведь не запускается 1000 инициализаций на каждый новый файл. Значит, есть крутилка, которую надо покрутить до уровня, когда на каждое копирование запускаться будет только один домен.
    2 ноября 2009 г. 12:21
  • Сколько времени занимает первоначальная инициализация, неважно, хоть полчаса.
    .....
    Должна быть крутилка таймера — ведь не запускается 1000 инициализаций на каждый новый файл. Значит, есть крутилка, которую надо покрутить до уровня, когда на каждое копирование запускаться будет только один домен.

    Нет, вы не поняли сути. IIS забывает старый сайт и грузит новый. А что такое загрузка нового сайта? Это его инициализация. А что такое инициализация сайта? Это выполнение кучи управляемого кода. А где этот код выполняется? AppDomain это процесс-контейнер для выполнения управляемого кода! Т.е. ваша проблема в том, что IIS выполняет инициализацию сайта и при этом грузит сильно процессор - и как видите это неизбежно. Либо загрузка сайта выполняется 10 секунд при загрузке CPU 100% и в это время сайт недоступен, либо загрузка выполняется 10 минут при загрузке CPU в 1% и сайт недоступен 10 минут - что вас больше устроит? Единственный способ ускорить загрузку сайта это оптимизировать код. Либо загружать сайт на новый сервер и переключать пользователей на него, например, заменой Ip-адреса и сбросом arp таблицы на коммутаторе.
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    2 ноября 2009 г. 13:23
    Модератор
  • Я знаю, как работает ASP.NET на IIS 7.0 =)
    При запуске application IIS через shadow copy изолирует файлы приложения, копирует туда же части хостовых конфигов (потому что прав не хватит читать хостовые конфиги); в ассоциированном app pool создаётся домен для этого приложения, в который и загружаются/используются эти изолированные файлы. IIS подписывается на изменения каталогов и некоторых файлов (например, добавление web.config вызовет перезапуск приложения, а появление файла 123.config нет). В список типов, которые мониторит IIS, входят файлы с расширением .dll, которые составляют 97% копируемых файлов. Вот о них IIS и спотыкается, создавая на одно копирование пять новых доменов.

    Я не знаю, где надо изменить ключ в реестре или строку в конфиге, чтобы увеличить время жизни сайта в кэше после получения уведомления об изменениях в файлах.
    Есть ключ HKLM\System\CurrentControlSet\Services\ASP\Parameters\FileMonitoringEnabled, который использовать не рекомендуется =)

    This setting determines whether files are registered for change notification. This setting is no longer used as the functionality has been encompassed in system logic and the FileMonitoringEnabled setting. Do not use this setting.

    У этого ключа есть ещё один недостаток (кроме прямого указания не использовать) — он для ASP, а не ASP.NET и его добавление в ASP.NET, возможно, вообще никак не влияет =)

    Напомню, что проблема не в 100% cpu, а в появлении ПЯТИ новых доменов вместо одного. Я копирую новый сайт ОДИН раз, а новых доменов появляется ПЯТЬ. Они довольно быстро дохнут, потому что IIS обычно направляет запросы на последний домен, но это не отменяет проблемы обновления сайта — после обновления инициализируется ПЯТЬ доменов, а не ОДИН. Поэтому инициализация занимает в пять раз больше времени, чем должна занимать.

    2 ноября 2009 г. 14:58
  • Не исследовал так глубоко проблему как автор, но могу заметить следующее. Есть сайт, работает приличной нагрузкой, его нынешний размер 26 Мб. Если его обновить , то начинают сыпаться дедлоки из Бд. Вообщем остаются соединения к БД, которые не могут завершиться. Сайт не перезапускается!
    Думаю проблемы примерно одинаковые.

    и второй вопрос который меня очень сильно интересует, как перезапустить ASP.NET. Проблема в том, что иногда переименовываются уч.запись пользователя. IIS на это реагирует нормально (пускает на сайт с новым логином), а вот .NET возвращет старое имя пользователя, не помогает перезапуск сайта, пула, IIS. Помог только перезапуск сервера, буду раз если кто-то подскажет какие-либо соображения по данному вопросу.
    2 ноября 2009 г. 20:44
  • У нас раньше заканчивались соединения к серверу, а не дедлоки происходили. Решилось банальным увеличением максимального количества соединений на сервере БД =)

    Проблема да, одна — вместо одного нового домена запускается пять.

    Про учётную запись не понял вопроса, но попробуйте не restart делать, а stop/start — в некоторых ситуациях это помогает.

    3 ноября 2009 г. 11:47
  • Пробовал, проблема не в IIS. IIS же пускает на сайт, а вот ASP.NET где-то кэширует данные, но как очистить этот кэш я не знаю.
    3 ноября 2009 г. 18:11
  • Напомню, что проблема не в 100% cpu, а в появлении ПЯТИ новых доменов вместо одного. Я копирую новый сайт ОДИН раз, а новых доменов появляется ПЯТЬ. Они довольно быстро дохнут, потому что IIS обычно направляет запросы на последний домен, но это не отменяет проблемы обновления сайта — после обновления инициализируется ПЯТЬ доменов, а не ОДИН. Поэтому инициализация занимает в пять раз больше времени, чем должна занимать.

    Ну если проблема не в 100% CPU, то уже легче :-)  А как копируете файлы? или чем? в одной транзакции?

    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    5 ноября 2009 г. 6:00
    Модератор
  •  а вот .NET возвращет старое имя пользователя, не помогает перезапуск сайта, пула, IIS. Помог только перезапуск сервера, буду раз если кто-то подскажет какие-либо соображения по данному вопросу.

    Если речь о подключении к DB, то надо прибить текущее подключение.
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    5 ноября 2009 г. 6:02
    Модератор
  • xcopy /S /C /Q /Y E:\publish\site.ru h:\site.ru

    Если это имеет значение, сайт уже прекомпилирован, все .aspx пустые, их контент в ~/bin.
    5 ноября 2009 г. 19:29
  • Кстати, на IIS 7.5 и ASP.NET 4.0 ничего не изменилось — на каждый паблиш запускается несколько доменов вместо одного. Прекомпилированный сайт или нет, значения не имеет -- пока прекомпиляция для .NET 4.0 не работала, паблиш без прекомпиляции вёл себя так же неправильно, только в придачу к инициализации в несколько "лиц" он ещё и компилировал одно и то же по несколько раз.

    23 сентября 2010 г. 9:52