解决.Net Runtime Optimization Service占用CPU的问题

    今天接到云主机的告警,说CPU占用率长期在100%,服务器是windows2012的系统,登录后看有个.Net Runtime Optimization Service的进程把CPU全占了,之前没见过这个进程,经查询了解这是触发了.NET的最佳化服务,这个最佳化服务在安装完.NET之后还会继续预编译那些高优先级的assemblies,然后等到系统空闲的时候再去处理那些低优先级的assemblies,处理完了会自动结束,但是这程序什么时候开始处理什么时候处理结束就不可知了,后查询了解到有几种方法解决这个问题。

1、用脚本加快优化服务。

新建个文本文件将下面的脚本复制进去,将文件重命名为netruntime.ps1。文件名随便取,扩展名要改为.ps1。保存之后在文件上点击鼠标右键,选择 【使用 PowerShell 运行】,等程序执行完成后.Net Runtime Optimization Service就没有了,CPU占和率也恢复到了正常水平。脚本执行时间会有点长,我2C4G的云主机运行大概跑了2个小时。

# Script to force the .NET Framework optimizATIon service to run at maximum speed.
$iswin8Plus = [Environment]::OSVersion.Version -ge (new-object 'Version' 6,2)
$dotnetDir = [environment]::GetEnvironmentVariable("windir","Machine") + "\Microsoft.NET\Framework"
$dotnet2 = "v2.0.50727"
$dotnet4 = "v4.0.30319"
$dotnetVersion = if (Test-Path ($dotnetDir + "\" + $dotnet4 + "\ngen.exe")) {$dotnet4} else {$dotnet2}
$ngen32 = $dotnetDir + "\" + $dotnetVersion +"\ngen.exe"
$ngen64 = $dotnetDir + "64\" + $dotnetVersion +"\ngen.exe"
$ngenArgs = " executeQueuedItems"
$is64Bit = Test-Path $ngen64
#32-bit NGEN -- appropriate for 32-bit and 64-bit machines
Write-Host("Requesting 32-bit NGEN") 
Start-Process -wait $ngen32 -ArgumentList $ngenArgs
#64-bit NGEN -- appropriate for 64-bit machines
if ($is64Bit) {
    Write-Host("Requesting 64-bit NGEN") 
    Start-Process -wait $ngen64 -ArgumentList $ngenArgs
}
#AutoNGEN for Windows 8+ machines
if ($iswin8Plus) {
    Write-Host("Requesting 32-bit AutoNGEN -- Windows 8+") 
    schTasks /run /Tn "\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319"
}
#64-bit AutoNGEN for Windows 8+ machines
if ($isWin8Plus -and $is64Bit) {
    Write-Host("Requesting 64-bit AutoNGEN -- Windows 8+") 
    schTasks /run /Tn "\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64"
}

 

2、通过命令行关闭mscorsvw.exe

打开cmd窗口(管理员身份运行),在命令提示符中键入:ngen.exe executequeueditems

 

3、禁用 Microsoft .NET Framework NGEN 服务

1、用快捷键win+R打开运行框,在运行框中输入services.msc 后回车打开服务窗口,找到Microsoft .NET Framework NGEN服务项,双击进入属性窗口,在打开的属性窗口中,单击“停止”按钮,并将启动类型设置为“禁用”,单击确定即可。

 

我是用第一种方法把问题解决的,2、3种方法在此一并记录下,也许以后用的上。

 

posted @ 2023-01-06 14:15  小政哥01  阅读(15536)  评论(0编辑  收藏  举报