秋季创作者更新性能问题

时间:2018-01-17 08:53:07

标签: c# performance windows-10 log4net

在最近的Windows 10更新(Fall Creators Update)之后,我们的.NET c#4.0应用程序的性能下降了很多。我认为存在各种问题,其中之一是log4net(或磁盘IO)。

我们的应用程序非常复杂(各种WCF应用程序和ASPNET MVC 3.0应用程序),并且在开发中有很多log4net跟踪。在启动时加载第一页持续4或5分钟,在更新持续一分钟之前,如果我停用log4net性能。

我已经完成了两个克隆虚拟机的测试,在正则表达式操作后进行记录,并且差异很大。

代码:

    static void Main(string[] args)
    {
        Log.Info("Log4net1");

        DateTime start = DateTime.Now;

        for (int i = 0; i < 50; i++)
        {
            DoTheThing();
        }


        TimeSpan elapsedTime = DateTime.Now - start;
        Log.DebugFormat("TOTAL Elapsed time: {0}", elapsedTime.TotalMilliseconds);
        Console.ReadKey();
    }

    private static void DoTheThing()
    {
        DateTime start = DateTime.Now;
        Regex.Replace(TEXT, " nec ", m =>
        {
            return " (word nec) ";
        });
        TimeSpan elapsedTime = DateTime.Now - start;
        Log.DebugFormat("Elapsed time: {0}", elapsedTime.TotalMilliseconds);
    }

我已经使用log4net 1.2.1和2.0.8进行了测试:

beforeUpdate之前的平均值 - &gt;总累计时间:600毫秒

afterUpdate后的平均值 - &gt;总累计时间:1000毫秒

这对我们来说是一个非常重要的问题,我没有在网上找到任何信息。

- 更新 -

我在stackoverflow上发现了另一个(未答复的)线程: log4net became very slow with caller location information after Windows 10 Fall Creators Update (1709)

我在两种环境下都运行了磁盘基准测试,读/写速率没有显着差异。 我已经测试了应用程序完全禁用log4net(log4net threshold =“OFF”),现在时间非常相似,所以,正如@DalmTo评论,有很多可能性,这将是由于log4net,我会尝试在那里提出了一个问题,尽管已经有一个相关的微软问题:https://connect.microsoft.com/VisualStudio/feedback/details/3143189/after-installing-windows-10-1709-update-creating-a-stacktrace-class-has-become-a-magnitude-slower

1 个答案:

答案 0 :(得分:5)

你可能会遇到这个问题:

  

从2017年10月开始,升级到Windows 10版本1709之后   或.NET Framework 4.7.1,您注意到显着减少   运行使用.NET Framework的.NET Framework应用程序时的性能   System.Diagnostics.StackFrame类。

     

应用程序在抛出.NET时通常依赖于StackFrame   例外。如果这种情况发生率很高(每次发生超过10起事件)   第二),应用程序可以显着减慢(十倍)并运行   明显比以前慢。

https://support.microsoft.com/en-us/help/4057154/performance-of-system-diagnostics-stackframe-degrades-in-windows-10-17

  

.NET Framework 4.7.1增加了对检测和解析的支持   便携式PDB文件格式,用于显示文件和行号信息   堆栈跟踪。作为此更改的一部分,堆栈跟踪中的每个函数   检查其定义模块以确定该模块是否使用   便携式PDB格式。

     

由于内部缓存存在一些差异   策略,运行时花费更多时间搜索便携式PDB   比以前的.NET Framework版本花在搜索经典上   Windows PDB。这会导致格式化的堆栈跟踪产生更多   比以前慢。

https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/517815-BCL%20Applications%20making%20heavy%20use%20of%20System.Diagnostics.StackTrace%20might%20run%20more%20slowly%20on%20.NET%204.7.1.md

安装最新的.NET 4.7.1可靠性更新(KB4054856)应解决此问题。

  

包含以下修复:   大量使用System.Diagnostics.StackTrace或Exception.StackTrace的应用程序在.NET Framework 4.7.1上的运行速度可能会更慢。

https://blogs.msdn.microsoft.com/dotnet/2018/01/09/net-framework-4-7-1-is-available-on-windows-update-wsus-and-mu-catalog/