所有 .NET 程序集 运行 在 Windows 服务器上都非常慢
All .NET assemblies running extremely slow on Windows Server
我将非常简单的 C# 代码编译为 .NET exe
assmebly:
using System;
class Program
{
public static void Main()
{
Console.WriteLine("test");
}
}
在我的桌面 Windows 8.1
机器上编译的程序集 运行s 每次大约 0.02
秒,但在生产 Windows Server 2012 R2
上 运行s 1.05
秒。
这是我正在测试的 PowerShell:
$sw = [Diagnostics.Stopwatch]::StartNew()
for ($i=1; $i -le 10; $i++)
{
.\cs.exe
}
$sw.Stop()
$sw.Elapsed
我的本地机器上的输出:
TotalMinutes : 0.00391715666666667
TotalSeconds : 0.2350294
TotalMilliseconds : 235.0294
.NET 版本在我的本地机器上:
PSChildName Version
----------- -------
v2.0.50727 2.0.50727.4927
v3.0 3.0.30729.4926
Windows Communication Foundation 3.0.4506.4926
Windows Presentation Foundation 3.0.6920.4902
v3.5 3.5.30729.4926
Client 4.5.51641
Full 4.5.51641
Client 4.0.0.0
服务器上的输出:
TotalMinutes : 0.172228565
TotalSeconds : 10.3337139
TotalMilliseconds : 10333.7139
. 服务器上的 NET 版本:
PSChildName Version
----------- -------
Client 4.5.51650
Full 4.5.51650
Client 4.0.0.0
服务器上的环境变量:
Name Value
---- -----
ALLUSERSPROFILE C:\ProgramData
APPDATA C:\Users\*********\AppData\Roaming
CLIENTNAME *********
CommonProgramFiles C:\Program Files\Common Files
CommonProgramFiles(x86) C:\Program Files (x86)\Common Files
CommonProgramW6432 C:\Program Files\Common Files
COMPUTERNAME *********
ComSpec C:\Windows\system32\cmd.exe
COR_ENABLE_PROFILING 7
COR_PROFILER {8019fee9-9590-4bd4-b2c9-815628f80f0f}
CORECLR_ENABLE_PROFILING 0
FP_NO_HOST_CHECK NO
HOMEDRIVE C:
HOMEPATH \Users\*********
JAVA_HOME C:\Progra~1\Java\jdk1.8.0_45
LOCALAPPDATA C:\Users\*********\AppData\Local
LOGONSERVER \*********
NUMBER_OF_PROCESSORS 12
OS Windows_NT
Path C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System3...
PATHEXT .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL
PROCESSOR_ARCHITECTURE AMD64
PROCESSOR_IDENTIFIER Intel64 Family 6 Model 63 Stepping 2, GenuineIntel
PROCESSOR_LEVEL 6
PROCESSOR_REVISION 3f02
ProgramData C:\ProgramData
ProgramFiles C:\Program Files
ProgramFiles(x86) C:\Program Files (x86)
ProgramW6432 C:\Program Files
PSModulePath C:\Users\*********\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPow...
PUBLIC C:\Users\Public
SESSIONNAME RDP-Tcp#126
SystemDrive C:
SystemRoot C:\Windows
TEMP C:\Users\ACADWE~1\AppData\Local\Temp
TMP C:\Users\ACADWE~1\AppData\Local\Temp
USERDOMAIN *********
USERDOMAIN_ROAMINGPROFILE *********
USERNAME *********
USERPROFILE C:\Users\*********
windir C:\Windows
什么会导致这 1 秒的慢?
是 JIT 编译器的问题吗?
服务器中有没有应该运行的CLR相关服务?
是否有任何可以禁用的应用程序验证检查?
此问题仅发生在 .NET exe 文件中。用 C++ 运行 编译的简单可执行文件 0.01
秒
编辑:
我已尝试按照评论中的建议 运行 ngen.exe ExecuteQueuedItems
但没有任何改变。这是命令的结果:
PS C:\Windows\system32> C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe ExecuteQueuedItems
Microsoft (R) CLR Native Image Generator - Version 4.0.30319.33440
Copyright (c) Microsoft Corporation. All rights reserved.
All compilation targets are up to date.
我找到问题了。
似乎服务器已经dotMemory安装。
还设置了以下环境变量:
COR_ENABLE_PROFILING 7
COR_PROFILER {8019fee9-9590-4bd4-b2c9-815628f80f0f}
CORECLR_ENABLE_PROFILING 0
卸载 dotMemory 并删除这些环境变量后,一切正常(每个 C# 应用程序 0.02
秒 运行)
我将非常简单的 C# 代码编译为 .NET exe
assmebly:
using System;
class Program
{
public static void Main()
{
Console.WriteLine("test");
}
}
在我的桌面 Windows 8.1
机器上编译的程序集 运行s 每次大约 0.02
秒,但在生产 Windows Server 2012 R2
上 运行s 1.05
秒。
这是我正在测试的 PowerShell:
$sw = [Diagnostics.Stopwatch]::StartNew()
for ($i=1; $i -le 10; $i++)
{
.\cs.exe
}
$sw.Stop()
$sw.Elapsed
我的本地机器上的输出:
TotalMinutes : 0.00391715666666667
TotalSeconds : 0.2350294
TotalMilliseconds : 235.0294
.NET 版本在我的本地机器上:
PSChildName Version
----------- -------
v2.0.50727 2.0.50727.4927
v3.0 3.0.30729.4926
Windows Communication Foundation 3.0.4506.4926
Windows Presentation Foundation 3.0.6920.4902
v3.5 3.5.30729.4926
Client 4.5.51641
Full 4.5.51641
Client 4.0.0.0
服务器上的输出:
TotalMinutes : 0.172228565
TotalSeconds : 10.3337139
TotalMilliseconds : 10333.7139
. 服务器上的 NET 版本:
PSChildName Version
----------- -------
Client 4.5.51650
Full 4.5.51650
Client 4.0.0.0
服务器上的环境变量:
Name Value
---- -----
ALLUSERSPROFILE C:\ProgramData
APPDATA C:\Users\*********\AppData\Roaming
CLIENTNAME *********
CommonProgramFiles C:\Program Files\Common Files
CommonProgramFiles(x86) C:\Program Files (x86)\Common Files
CommonProgramW6432 C:\Program Files\Common Files
COMPUTERNAME *********
ComSpec C:\Windows\system32\cmd.exe
COR_ENABLE_PROFILING 7
COR_PROFILER {8019fee9-9590-4bd4-b2c9-815628f80f0f}
CORECLR_ENABLE_PROFILING 0
FP_NO_HOST_CHECK NO
HOMEDRIVE C:
HOMEPATH \Users\*********
JAVA_HOME C:\Progra~1\Java\jdk1.8.0_45
LOCALAPPDATA C:\Users\*********\AppData\Local
LOGONSERVER \*********
NUMBER_OF_PROCESSORS 12
OS Windows_NT
Path C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System3...
PATHEXT .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL
PROCESSOR_ARCHITECTURE AMD64
PROCESSOR_IDENTIFIER Intel64 Family 6 Model 63 Stepping 2, GenuineIntel
PROCESSOR_LEVEL 6
PROCESSOR_REVISION 3f02
ProgramData C:\ProgramData
ProgramFiles C:\Program Files
ProgramFiles(x86) C:\Program Files (x86)
ProgramW6432 C:\Program Files
PSModulePath C:\Users\*********\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPow...
PUBLIC C:\Users\Public
SESSIONNAME RDP-Tcp#126
SystemDrive C:
SystemRoot C:\Windows
TEMP C:\Users\ACADWE~1\AppData\Local\Temp
TMP C:\Users\ACADWE~1\AppData\Local\Temp
USERDOMAIN *********
USERDOMAIN_ROAMINGPROFILE *********
USERNAME *********
USERPROFILE C:\Users\*********
windir C:\Windows
什么会导致这 1 秒的慢?
是 JIT 编译器的问题吗?
服务器中有没有应该运行的CLR相关服务?
是否有任何可以禁用的应用程序验证检查?
此问题仅发生在 .NET exe 文件中。用 C++ 运行 编译的简单可执行文件 0.01
秒
编辑:
我已尝试按照评论中的建议 运行 ngen.exe ExecuteQueuedItems
但没有任何改变。这是命令的结果:
PS C:\Windows\system32> C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe ExecuteQueuedItems
Microsoft (R) CLR Native Image Generator - Version 4.0.30319.33440
Copyright (c) Microsoft Corporation. All rights reserved.
All compilation targets are up to date.
我找到问题了。
似乎服务器已经dotMemory安装。
还设置了以下环境变量:
COR_ENABLE_PROFILING 7
COR_PROFILER {8019fee9-9590-4bd4-b2c9-815628f80f0f}
CORECLR_ENABLE_PROFILING 0
卸载 dotMemory 并删除这些环境变量后,一切正常(每个 C# 应用程序 0.02
秒 运行)