【问题标题】:All .NET assemblies running extremely slow on Windows Server所有 .NET 程序集在 Windows Server 上运行速度极慢
【发布时间】:2015-10-01 22:05:39
【问题描述】:

我将非常简单的琐碎 C# 代码编译为 .NET exe assmebly:

using System;
class Program
{
    public static void Main()
    {
        Console.WriteLine("test");
    }
}

编译后的程序集在我的桌面Windows 8.1 机器上每次运行大约0.02 秒,但在生产Windows Server 2012 R2 上运行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\2
TMP                            C:\Users\ACADWE~1\AppData\Local\Temp\2
USERDOMAIN                     *********
USERDOMAIN_ROAMINGPROFILE      *********
USERNAME                       *********
USERPROFILE                    C:\Users\*********
windir                         C:\Windows

什么会导致这种 1 秒的缓慢?

JIT 编译器有问题吗?

是否有任何 CLR 相关的服务应该在服务器中运行?

是否有任何可以禁用的应用程序验证检查?

这个问题只发生在 .NET exe 文件上。用 C++ 编译的简单可执行文件运行时间为0.01

编辑:

我尝试按照 cmets 中的建议运行 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.

【问题讨论】:

  • 它没有意义,因为它是单次运行。循环运行几千次并忽略第一个运行值(在jitting期间),我相信这些值会非常相似。
  • @RonBeyer 请注意,最初的抖动实际上可能是问题的一部分——问题是关于从开始到停止的整个过程,而不仅仅是正在运行的实际 .net 代码。
  • @NikolayKostov 我确定您的问题与服务器上的 jitting 过程有关,并且与您所说的验证有关,但是如果您认为您将经常运行此程序,为什么不把它变成一个长期运行的服务?或者您可以生成程序集。
  • 听起来像 framework 没有生成。无需使用主要方法。这只是一种方法,JIT 需要 1 毫秒。运行ngen。 executequeueditem 或其他任何名称。

标签: c# .net performance time windows-server


【解决方案1】:

我找到了问题。

似乎服务器安装了dotMemory

还设置了以下环境变量:

COR_ENABLE_PROFILING           7
COR_PROFILER                   {8019fee9-9590-4bd4-b2c9-815628f80f0f}
CORECLR_ENABLE_PROFILING       0

卸载 dotMemory 并删除这些环境变量后,一切都按预期工作(0.02 每次 C# 应用程序运行秒数)

【讨论】:

  • 当然感谢大家对 cme​​ts 的帮助! :)
  • 设置这些变量是为了在分析下运行 IIS 或 windows 服务。 dotMemory 也在“配置任何 .net 进程”模式下使用它。您似乎在分析期间终止了 dotMemory 进程,当然,它并没有清理这些变量。有一个清理工具,随 dotMemory CleanUpProfiler.x64(x86).exe 提供。此外,如果您再次运行分析会话并允许 dotMemory 正常完成,它也会清除这些变量。
  • 我知道这是一个分析器 ;-)。我想知道如果分析器本身使事情变得如此之慢,你如何才能真正找到这些东西的错误。您发现分析器的问题了吗? ;-)
  • Ed.ward 更准确​​地解释了这个问题 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 2016-02-29
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
相关资源
最近更新 更多