Когда мой большой сайт ASP.NET обновляется, IIS приходится его перекомпилировать. Есть ли способ значительно сократить время компиляции? - PullRequest
5 голосов
/ 07 октября 2010

DotNetNuke - это большая ASP.NET CMS, которая в основном предварительно скомпилирована, как и большинство модулей, содержащихся в ней.

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

  1. Перекомпиляция на уровне приложения, которая происходит при замене DLL в папке bin
  2. Каждый раз, когда к отдельному модулю обращаются в первый раз, на этом конкретном модуле происходит некоторая перекомпиляция.

Есть ли способ выделить больше ресурсов ЦП для компиляции сайтов asp.net в IIS 7?

  • Я бы хотелиспользуйте более одного ядра или, по крайней мере, сделайте что-нибудь, чтобы сократить время перекомпиляции.

Q & A

Вы должны использовать предварительно скомпилированный ASP.NET.Почему нет?

  • Мы используем предварительно скомпилированный ASP.NET.Тот факт, что приложение ASP.NET скомпилировано в DLL, не означает, что среда выполнения ASP.NET не будет выполнять дополнительную перекомпиляцию для предоставления посетителям.

Откуда вы знаете, что он перекомпилирует и не заполняет кеш или что-то еще?

  • Просмотр диспетчера задач на сервере показывает 50% загрузки ЦП исполняемым файлом компилятора во времявышеупомянутые хиты страницы.Почему 50%?2-х ядерный сервер.

Ответы [ 5 ]

8 голосов
/ 08 июля 2011

Set <compilation optimizeCompilations="true" />

Указывает, будет ли динамическая компиляция перекомпилировать весь сайт в случае изменения файла верхнего уровня.Файлы верхнего уровня включают файл Global.asax и все файлы в папках Bin и App_Code.При значении True только измененные файлы перекомпилируются.

Источник: Элемент компиляции (схема настроек ASP.NET)

Дополнительная информация о плюсах и минусах может бытьнаходится по адресу Общие сведения о динамической компиляции ASP.NET , в разделе Оптимизация динамической компиляции.Основной причиной ошибок является удаление или изменения в существующих сигнатурах методов, в результате чего уже скомпилированные страницы генерируют исключение MissingMethodException до тех пор, пока они не будут перекомпилированы.

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

2 голосов
/ 12 июля 2011

У меня был точно такой же опыт работы с DotNetNuke в прошлом. Наша проблема заключалась в том, что у нас было установлено около 125-150 модулей, все со своими сборками. Огромное их количество приведет к тому, что задержка первого запроса будет близка к минуте или более. Во время развертывания было хуже, так как мы намеренно переустанавливали наши собственные модули. Позже мы изменили сценарии развертывания, чтобы избежать установки уже установленных модулей, и это помогло. Тем не менее, первый запрос все еще был медленным, потому что он выполнял оба компилятора VB.NET и C # (наши модули были C #, в то время как DNN был VB.NET в то время).

Несмотря на то, что мы немного помогли использовать атрибут optimizeCompiliations, вам также необходимо учесть, что сканер вирусов в режиме реального времени не контролирует каталог, в котором находится код, и папку временных файлов ASP.NET. Это замедлит компиляцию до сканирования.

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

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

DotNetNuke.com имеет несколько советов по настройке производительности в своей вики. Больше всего с производительностью больше всего помогло усечение таблиц EventLog и SiteLog, так как они могут стать очень большими, если вы не обращаете на них внимания. Также есть одна или две таблицы, участвующие в индексации сайта, которые в некоторых версиях вышли из-под контроля. Честно говоря, это не твоя проблема. У вас типичная проблема холодного запуска ASP.NET.

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

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

50% загрузки ЦП в двухъядерной системе ЦП означает, что компилятор ASP.NET является однопоточным.Вы бы видели 25% загрузки ЦП в четырехъядерной системе.
Насколько я знаю, нет волшебного способа превратить его в многопоточный компилятор.

Одна вещь, которую вы могли быОднако следует использовать средство компиляции ASP.NET для предварительной компиляции всего сайта перед его развертыванием.Сделайте это в окне разработки / развертывания и разверните в prod, и ваше развертывание не должно страдать от этих задержек.

Должен укусить мой язык, но я должен спросить;Вы действительно часто используете prod, что это проблема?

1 голос
/ 09 марта 2011

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

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

1 голос
/ 09 марта 2011

Является ли возможность предварительной компиляции вместо динамической компиляции?

...