Отключите ngen.exe по требованию на облегченных серверах Windows («.NET Framework NGEN v4.0.30319 64») - PullRequest
0 голосов
/ 13 ноября 2018

Мы внедряем apis asp.net на основе .Net4 на большое количество серверов Windows, и для того, чтобы снизить затраты на АМС, мы используем их как можно меньше.

Проблема, с которой мы сталкиваемся, заключается в том, что после инициализации vm и развертывания кода мы наблюдаем высокую загрузку ЦП в течение нескольких минут. Большая часть этого использования процессора происходит от процесса "ngentask.exe". Это не связано с запуском приложения, мы обычно видим, что это происходит через несколько минут после того, как развертывание продолжается, и другие процессы, нагруженные процессором, успокаиваются.

Стоит также упомянуть, что в рамках нашего процесса развертывания мы «касаемся» приложения, вызывая веб-запрос к предопределенной конечной точке «работоспособность» в приложении, которая просто является пустым контроллером MVC в большинстве наших приложений - мы делаем это как для проверки того, что приложение действительно запущено, так и для того, чтобы убедиться, что оно «прогрето» и готово обслуживать трафик.

Глядя на файл ngen.log, временные метки отлично совпадают с использованием процессора:

11/13/2018 14:20:13.275 [732]: Task scheduler requested starting 32-bit task 11/13/2018 14:20:13.371 [732]: Task scheduler requested starting 64-bit task 11/13/2018 14:20:13.371 [732]: Launching NGen Task, command line: "C:\Windows\Microsoft.NET\Framework\v4.0.30319\NGenTask.exe" /RuntimeWide /StopEvent:380 11/13/2018 14:20:13.371 [732]: Launching NGen Task, command line: "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\NGenTask.exe" /RuntimeWide /StopEvent:860 11/13/2018 14:20:13.512 [3104]: NGen Task starting, command line: "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\NGenTask.exe" /RuntimeWide /StopEvent:860 11/13/2018 14:20:13.560 [3104]: Attempting to acquire task lock.

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

Итак, мой вопрос: могу ли я отключить эту задачу? Это базовые серверы Windows 2016, на которых запущено только одно веб-приложение asp.net, поэтому не нужно устанавливать «случайные» приложения графического интерфейса или что-либо подобное.

1 Ответ

0 голосов
/ 14 ноября 2018

Вместо того, чтобы пытаться отключить ngen, вы можете вручную выполнить его как последний шаг в вашем развертывании. Ngen обычно работает в фоновом режиме и предназначен для оптимизации запуска приложений, но, как ни странно, кажется, что он снижает производительность на несколько минут. Предполагается, что Ngen автоматически запускается только тогда, когда сервер простаивает, но, как только он запускается, кажется, что он загружает процессор в течение нескольких минут, и я видел, что это вызывает проблемы на небольших серверах (в частности, на экземплярах AWS Micro).

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

& ([String] $ngenExe = ((Get-ChildItem -Path C:\Windows\Microsoft.NET\Framework64\v*\ngen.exe) | sort -Descending | Select -First 1)) update /force

См .: https://docs.microsoft.com/en-us/dotnet/framework/tools/ngen-exe-native-image-generator

...