Огромная задержка при первом запросе браузера к веб-приложению, размещенному на Mono XSP.

Мы используем веб-сервер Mono (2.10) XSP4 для размещения веб-приложения ASP.Net MVC3, работающего на открытом встроенном Linux (ARM). При запуске XSP4 требуется несколько секунд, пока он не будет готов и не примет запросы. С этим проблем пока нет.

Но когда делается первый запрос от браузера/посетителя веб-сайта, XSP4 использует весь ЦП, который он может получить, в течение примерно 55 секунд, пока веб-страница не будет (успешно) показана в веб-браузере. Это происходит после каждого запуска/перезапуска XSP.

Моей первой мыслью было, что это своевременная компиляция всего веб-приложения. Поэтому я создал пакет развертывания, который содержит только двоичные файлы, .css, .js и представления (.cshtml). Это сработало, но все еще была эта огромная задержка.

Затем я попытался предварительно скомпилировать это веб-приложение с помощью Visual Studio (как указано в некоторых примечаниях к выпуску Mono). Веб-сайт снова работал хорошо, но огромная задержка все еще присутствовала.

Некоторые вопросы, которые на самом деле у меня в голове:

  1. Кто-нибудь знает, что делает веб-сервер XSP, когда приходит первый запрос браузера? Является ли это своевременной компиляцией, даже если это предварительно скомпилированное веб-приложение?
  2. Почему он делает это после каждого запуска снова?
  3. Можно ли вообще как-то уменьшить огромную задержку?
  4. Можно ли уменьшить огромную задержку, чтобы она выполнялась только при первом запросе браузера после обновления веб-приложения (кэшируется между последующими запусками XSP)?

Любая помощь/идеи были бы замечательными.

Обновление: Тем временем я обнаружил, что задержка вызвана сборкой dcms компилятором Mono/ASP.Net и компиляцией бритвенных представлений MVC3 в /tmp/root-aspnet.../, который сопоставляется с памяти и, следовательно, не является постоянным. Сейчас я ищу способ контролировать, где XSP4/Mono.WebServer/Mono-Asp.Net хранит эти скомпилированные файлы. Если кто-то знаком с этим, дайте мне знать ;-)


person Marc    schedule 16.11.2011    source источник


Ответы (2)


Это могут быть собственные накладные расходы на компиляцию (которые отличаются от того, что делает предварительная компиляция). Вы можете проверить, дает ли AOT системных библиотек ускорение:

mono --aot /usr/lib/mono/1.0/mscorlib.dll
for i in /usr/lib/mono/gac/*/*/*.dll; do mono --aot $i; done
person skolima    schedule 16.11.2011
comment
Большое спасибо за этот хороший намек. Системные библиотеки все еще компилируются (AOTing) ;-) Чего я пока не понимаю, так это почему JIT-компиляция выполняется при каждом запуске XSP? Не мог ли монокэшировать ранее JIT-сборки постоянно на диске/флэш-памяти и повторно использовать их? - person Marc; 16.11.2011
comment
Просто появилась еще одна идея: может быть, это сам код запуска веб-приложений, который занимает целую вечность на встроенном устройстве ARM. Таким образом, это не будет проблемой JIT/компилятора. - person Marc; 16.11.2011
comment
Это вызвано созданием и компиляцией представлений бритвы, которые еще не могут быть предварительно скомпилированы. Эти файлы компилируются в /tmp/..., который сопоставляется с памятью на встроенных устройствах и поэтому теряется после перезагрузки. Еще хуже то, что после каждого перезапуска веб-сервера XSP файлы будут скомпилированы в новый подкаталог /tmp. Таким образом, повторная компиляция представлений Razor происходит каждый раз при запуске XSP. - person Marc; 17.11.2011

Чтобы малина не компилировала ваш веб-сайт каждый раз при запуске XSP4, вы должны предварительно скомпилировать свой веб-сайт, используя aspnet_compiler.exe и расположенный в папке %WINDIR%\Microsoft.NET\Framework\v4.0.30319.

Вот пример:

aspnet_compiler.exe -p "d:\original website" -v / -c "d:\compiled website"

Как только ваш веб-сайт будет скомпилирован, загрузите его на свою малину, и XSP/mono будет использовать скомпилированную версию вашего сайта. Ваш первый запрос будет намного быстрее.

Вот несколько справочных ссылок:

Предварительная компиляция вашего веб-сайта (C#)

Средство компиляции ASP.NET (Aspnet_compiler.exe)

person Francois Charland    schedule 11.04.2018