【问题标题】:NLog cpu performance issueNLog CPU 性能问题
【发布时间】:2011-07-02 00:28:12
【问题描述】:

我对 NLog 库中的这种方法有疑问:NLog.Targets.Wrappers.AsyncTargetWrapper.ProcessPendingEvents(object state)

它消耗过多的 cpu 时间。我使用 Nlog 长期运行 Windows 服务,两天后我的服务消耗了超过 80% 的 cpu 时间(一个核心几乎是 80%,第二个是 30%)。它不是 100% cpu 时间,但它正在发生变化,并且在 cca 2 小时后恢复正常。所以我运行了分析器,这个方法可能导致它:NLog.Targets.Wrappers.AsyncTargetWrapper.ProcessPendingEvents(object state)

我有 10 个文件目标都设置为异步。事实上,我的应用程序有很多日志记录,但仅在 Trace 级别,如果我切换到 Info 级别,它没有帮助。

你能帮我吗,我应该减少我的应用程序的登录吗?

【问题讨论】:

  • 您登录的频率如何?每秒1000条线? 1分钟? ProcessPendingEvents 只是在 AsyncTargetWrapper 类内的计时器上定期调用。您能否详细说明您正在执行多少日志记录?
  • “我已经运行了分析器,而这个方法也许会导致它”。强调也许
  • @MattC:很难说。我在整个应用程序中都进行了日志记录,并且频率取决于日志记录级别。我不知道 NLog 是如何工作的。即使级别很高,它也可能会处理所有日志(假设我有很多跟踪日志,但日志级别在 Info 上,因此文件中的信息日志只会更高)。我不知道如何找到这个频率。有什么想法吗?
  • Svensson:这种方法在 CPU 时间分析中排名第一。如果采用这种方法,我 99% 肯定是这个问题。

标签: c# .net nlog


【解决方案1】:

根据this 线程,我还猜想为timeToSleepBetweenBatches 设置更高的数字应该会减少高cpu 时间。似乎 NLog 的 2.0 测试版应该通过一次只运行一个惰性编写器线程来解决这种行为。

同时您无需更改源代码即可更改timeToSleepBetweenBatches。可以在configuration file中设置:

<targets>
  <target xsi:type="AsyncWrapper"
          name="String"
          queueLimit="Integer"
          timeToSleepBetweenBatches="Integer"
          batchSize="Integer"
          overflowAction="Enum">
    <target xsi:type="wrappedTargetType" ...target properties... />
  </target>
</targets>

缓冲选项
timeToSleepBetweenBatches - 批次之间的睡眠时间(以毫秒为单位)。整数默认值:50

【讨论】:

  • 好的,这可能是那个问题,但我使用的是 NLog 2.0 beta。我会试试上面的代码。
【解决方案2】:

我简要查看了来源。我的猜测:

尝试改变ctor AsyncTargetWrapper(wrappedTarget, queueLimit, overflowAction) ...

this.TimeToSleepBetweenBatches = 50;

到不那么频繁的事情:

this.TimeToSleepBetweenBatches = 1000;

所以内部计时器不会每50ms触发一次!

【讨论】:

  • 我无法更改源代码(不想),但也许我可以通过配置 xml 更改它。有默认的 asyncTargetWrapper 设置: queueLimit - 延迟写入线程请求队列中的请求数限制。Integer 默认值:10000 timeToSleepBetweenBatches - 批次之间休眠的时间(以毫秒为单位)。Integer 默认值:50 batchSize - 应处理的日志事件数由惰性写入器线程在批处理中。整数默认值:100 overflowAction - 当惰性写入器线程请求队列计数超过设置限制时要采取的行动。默认值:丢弃
  • 我还没试过。会让你知道的。
【解决方案3】:

我建议使用BufferingWrapper,它仅在记录某些内容时启动一个计时器,而不是每 50 毫秒。即使没有记录任何内容。

更新 NLog 版本。 4.6 现在使用 timeToSleepBetweenBatches=1,它只在写入内容时触发计时器事件。

【讨论】:

    猜你喜欢
    • 2011-03-07
    • 2017-05-16
    • 2012-09-14
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多