log4net性能问题:消息之间的固定延迟

时间:2014-03-22 10:38:38

标签: c# performance logging log4net

我的应用程序非常复杂,包括2个网站和3个Windows服务。所有使用相同的log4net配置,只需写入不同的文件:

<log4net>
  <logger name="Default">
    <appender-ref ref="VerboseLogFileAppendder" />
  </logger>
  <appender name="VerboseLogFileAppendder" type="log4net.Appender.RollingFileAppender">
    <threshold value="DEBUG" />
    <file value="Logs\MyProductName" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <maximumFileSize value="100MB" />
    <datePattern value="'.'yyyy-MM-dd'.log'" />
    <staticLogFileName value="false" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%-3thread] %-5level - %message%newline" />
    </layout>
  </appender>
</log4net>

一个网站在撰写日志方面存在巨大的性能问题 - 每两个相邻的消息之间存在或多或少的固定延迟。例如,以下是我的日志文件的一部分:

2014-03-21 21:48:19,163 [24 ] INFO  -       Begin SiteColourTheme
2014-03-21 21:48:19,489 [24 ] INFO  -         IsChanged = False
2014-03-21 21:48:19,808 [24 ] INFO  -         GridHeaderColour.BackgroundColour = #373F71
2014-03-21 21:48:20,133 [24 ] INFO  -         GridHeaderColour.IsBackgroundColourChanged = False
2014-03-21 21:48:20,464 [24 ] INFO  -         GridHeaderColour.FontColour = #E0E0E0
2014-03-21 21:48:20,800 [24 ] INFO  -         GridHeaderColour.IsFontColourChanged = False
2014-03-21 21:48:21,134 [24 ] INFO  -         GridHeaderColour.IsColourThemeChanged = False
2014-03-21 21:48:21,475 [24 ] INFO  -         DialogHeaderColour.BackgroundColour = #373F71
2014-03-21 21:48:21,810 [24 ] INFO  -         DialogHeaderColour.IsBackgroundColourChanged = False
2014-03-21 21:48:22,139 [24 ] INFO  -         DialogHeaderColour.FontColour = #FFFFFF
2014-03-21 21:48:22,462 [24 ] INFO  -         DialogHeaderColour.IsFontColourChanged = False
2014-03-21 21:48:22,781 [24 ] INFO  -         DialogHeaderColour.IsColourThemeChanged = False
2014-03-21 21:48:23,122 [24 ] INFO  -         AccordionPaneColour.BackgroundColour = #F8F8F8
2014-03-21 21:48:23,481 [24 ] INFO  -         AccordionPaneColour.IsBackgroundColourChanged = False
2014-03-21 21:48:23,862 [24 ] INFO  -         AccordionPaneColour.FontColour = #2B2B2B
2014-03-21 21:48:24,202 [24 ] INFO  -         AccordionPaneColour.IsFontColourChanged = False
2014-03-21 21:48:24,522 [24 ] INFO  -         AccordionPaneColour.IsColourThemeChanged = False
2014-03-21 21:48:24,862 [24 ] INFO  -         PageTabColour.BackgroundColour = #DCDBDB
2014-03-21 21:48:25,208 [24 ] INFO  -         PageTabColour.IsBackgroundColourChanged = False
2014-03-21 21:48:25,527 [24 ] INFO  -         PageTabColour.FontColour = #000000
2014-03-21 21:48:25,855 [24 ] INFO  -         PageTabColour.IsFontColourChanged = False

正如您所看到的,即使只是记录对象的属性,延迟也超过300毫秒(没有复杂的逻辑来检索它们)。我发现这个延迟与日志大小成正比:如果它是1 MB,延迟大约是100毫秒,2 MB - 200毫秒,3 MB - 300毫秒。我想知道什么可能导致这样的问题。任何想法都会被高度赞成。

调查详情:

由于我们没有直接使用log4net,而是创建了一个包装器,我首先想到包装器中有一个错误,但它很简单,我不知道它是如何只在一个站点引起如此奇怪的问题。

VS 2013性能分析器令人惊讶地没有说记录器方法占用了大部分样本(我使用了采样分析)。我认为这证明问题不在于逻辑,而在于访问外部资源,而应用程序线程被暂停。

没有发现两个网站之间的任何差异应该导致此问题,并在其他网站中查找。当然,这些站点非常不同,但没有可疑环境或IIS配置差异。

我有一个的想法,即每次写入都会打开和关闭日志文件,但我不知道如何检查它。我可以在记事本中打开日志,在应用程序运行时编辑并保存。可能这可能是一个证据。但在这种情况下,延迟几乎不应该与文件大小固定(不成比例)吗?所有系统需要的是寻找由文件大小定义的文件的末尾(如果文件被分区,可能很少寻找,但这并不重要)。如果这是问题,我该如何解决?我尝试使用缓冲日志appender,但结果相同。

其他想法是防病毒检查每次写入文件,但禁用它并没有解决问题。

更新

将日志文件夹从本地相对路径更改为其他目录&#34; D:\ Logs ...&#34;解决了我的开发环境中的问题,但没有在测试机器上工作。

更新2

这个问题不是稳定的再现。有一天,我可能有所描述的性能问题,既没有重新启动,也没有更改日志配置帮助;但是有一天问题消失了,我以为我找到了解决方案。但现在它再次复制,我不知道为什么会这样。

1 个答案:

答案 0 :(得分:1)

确定这类问题真的很难,因为可能有许多因素可以解释这些差异。但是你提到你有很多记录演员。它们都在同一台机器上吗?您是否为具有问题的站点发布了配置文件?

这不是您问题的直接答案,但您也可以调查BufferingForwardAppenderexample),它会累积消息,直到达到配置的限制。这不会直接解决问题,但会使日志文件中的“写税”变得复杂,并且它有一些有趣的属性(例如有缺陷的日志记录,但这不是主题:))