我们正在将基于.Net4的asp.net apis部署到大量的windows服务器上,并且为了保持较低的成本,我们尽可能小地运行它们。
我们看到的问题是,在配置虚拟机和部署代码之后,我们会看到cpu使用率在几分钟内很高。大部分cpu使用量来自进程"ngentask.exe“。这与应用程序启动无关,我们通常会在部署继续后的几分钟内看到这种情况发生,其他占用大量cpu的进程也会平静下来。
值得一提的是,作为部署过程的一部分,我们通过调用对应用程序中预定义的"health“端点的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分钟内运行。
所以我的问题是:禁用这个任务安全吗?这些都是Windows2016核心服务器,只运行一个asp.net web应用程序,所以不会安装任何“随机”的gui应用程序或任何东西。
发布于 2018-11-15 03:24:59
您可以在部署的最后一步手动执行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/en-us/dotnet/framework/tools/ngen-exe-native-image-generator
https://stackoverflow.com/questions/53288184
复制相似问题