NLog cpu性能问题

时间:2011-02-22 13:38:03

标签: c# .net nlog

我在NLog库中遇到此方法的问题:NLog.Targets.Wrappers.AsyncTargetWrapper.ProcessPendingEvents(object state)

它消耗了太多的CPU时间。我使用Nlog长期运行Windows服务,两天后我的服务消耗超过80%的CPU时间(一个核心几乎是80%,第二个30%)。它不是100%的cpu时间,但它正在改变,并且在cca 2小时后它恢复正常。所以我运行了探查器,这个metod可能会导致它:NLog.Targets.Wrappers.AsyncTargetWrapper.ProcessPendingEvents(对象状态)

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

你能帮助我,我应该减少我的应用程序中的日志记录吗?

3 个答案:

答案 0 :(得分:5)

根据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 - 批次之间休眠的时间(以毫秒为单位).Integer默认值:50

答案 1 :(得分:2)

我简要介绍了一下来源。我猜:

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

this.TimeToSleepBetweenBatches = 50;

不那么频繁的事情:

this.TimeToSleepBetweenBatches = 1000;

所以内部计时器不会每 50ms 一起开火!

答案 2 :(得分:0)

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

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