DefaultTraceListener的性能影响

时间:2013-02-27 18:43:02

标签: c# performance trace system.diagnostics

使用System.Diagnostics跟踪时,发布< 生成 ASP.NET应用程序上的“默认”跟踪侦听器是否存在重大(可衡量的)性能影响? / strong> mode,在编译时定义TRACE常量,但在运行时没有附加调试器?

为了澄清,问题是“默认”跟踪侦听器对使用其他跟踪侦听器的应用程序的影响,而不是System.Diagnostics跟踪的替代方案。

在没有附加调试器的情况下,是否有任何衡量默认跟踪侦听器的影响?是否已经对生产中的影响做了任何基准测试,从而忽略了代码中的“remove”元素:

<configuration>
<system.diagnostics>
  <trace autoflush="false" indentsize="4">
    <listeners>
      <remove name="Default" />
      <add name="myListener"  type="System.Diagnostics.TextWriterTraceListener"    initializeData="c:\myListener.log" />
    </listeners>
  </trace>
</system.diagnostics>
</configuration>

这个问题与.NET Tracing: What is the “Default” listener?的不同之处在于,在Visual Studio下运行并更新调试用户界面时,其他问题主要集中在默认侦听器的影响上,而这个问题主要关注于生产环境。

2 个答案:

答案 0 :(得分:14)

如果使用默认跟踪侦听器继续跟踪,则可能会对性能产生重大影响。

如果您想要生产就绪性能跟踪,我强烈建议使用.NET 4.5中的EventSource类而不是跟踪方法。这可以通过创建ETW事件源与PerfView一起使用,即使在生产中输出跟踪信息,也几乎不会影响运行时。


保留默认侦听器会导致框架通过OutputDebugString记录调用。即使在没有调试器的发布版本中,这也可以have a significant impact

答案 1 :(得分:0)

DefaultTraceListener本身是#34;非常快&#34; - 因为除了最肆意的使用之外,它通常不会引起注意。但是,与Trace.UseGlobalLock一起使用会对负载很重的系统产生重大影响。

今天我们的系统正在经历过多的CPU负载和上下文切换(这是另一个问题)..并且发生了一些意想不到的事情,这使问题更加复杂到工作有效停止的程度:

严重的线程代码在Trace.WriteLine上开始阻塞超过12秒(!!),因为它必须获得锁定&#34;平凡的&#34;在DefaultTraceListener中工作。

即使没有跟踪侦听器也会应用UseGlobalLock,但它实际上是一个内部没有任何内容的锁 - 而内部有一点内容的锁可以在已经加载的具有许多线程的系统上滚雪球。

立即修复是禁用UseGlobalLock(这有other side-effects [免责声明:我的另一篇文章])并删除DefaultTraceListener。

当然,如果连接了另一个Trace Listener,它可能会很好地影响在DefaultTraceListener中花费的所有时间。