繁体   English   中英

在轻量级Windows服务器上禁用按需ngen.exe(“。NET Framework NGEN v4.0.30319 64”)

[英]Disable the on-demand ngen.exe on lightweight windows servers (“.NET Framework NGEN v4.0.30319 64”)

我们正在将基于.Net4的asp.net api部署到大量Windows服务器,并且为了保持AWS成本较低,我们将它们运行得尽可能小。

我们看到的问题是,在配置了虚拟机并部署了代码之后,我们看到几分钟的CPU使用率很高。 此cpu用法的大部分来自进程“ ngentask.exe”。 这与应用启动无关,我们通常会在部署继续进行几分钟后看到这种情况,并且其他占用大量CPU的进程也会平静下来。

还值得一提的是,在部署过程中,我们通过将Web请求调用到应用程序中预定义的“运行状况”端点来“触摸”该应用程序,该端点在我们大多数应用程序中只是一个空的MVC控制器-我们这样做既可以验证该应用程序实际正在运行,又可以确保已“预热”并准备提供流量。

查看ngen.log,时间戳与cpu用法完全匹配:

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 Core服务器,仅运行一个asp.net Web应用程序,因此没有安装任何“随机” GUI应用程序。

您可以尝试执行ngen而不是尝试禁用ngen,这是部署的最后一步。 Ngen通常在后台运行,旨在优化应用程序的启动-但具有讽刺意味的是,它似乎会在此过程中破坏性能几分钟。 据推测,Ngen仅在服务器空闲时才自动启动-但是一旦启动,它似乎会占用CPU几分钟,并且我发现这会导致小型服务器(特别是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/zh-cn/dotnet/framework/tools/ngen-exe-native-image-generator

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM