Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NLog cpu性能问题_C#_.net_Nlog - Fatal编程技术网

C# NLog cpu性能问题

C# NLog cpu性能问题,c#,.net,nlog,C#,.net,Nlog,我对NLog库中的此方法有问题:NLog.Targets.Wrappers.AsyncTargetTrapper.ProcessPendingEvents(对象状态) 它消耗了太多的cpu时间。我使用Nlog长期运行windows服务,两天后,我的服务消耗了80%以上的cpu时间(一个内核几乎占80%,第二个占30%)。这不是100%的cpu时间,但它正在改变,在cca 2小时后恢复正常。所以我运行了探查器,这个方法可能会导致它:NLog.Targets.Wrappers.AsyncTarget

我对NLog库中的此方法有问题:
NLog.Targets.Wrappers.AsyncTargetTrapper.ProcessPendingEvents(对象状态)


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

我有10个文件目标,所有目标都设置为异步。这是一个事实,我有很多在我的应用程序登录,但只有在级别跟踪,如果我切换到信息级别,它没有帮助


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

我简单地查看了源代码。我猜:

尝试更改ctor AsyncTargetTrapper(wrappedTarget、queueLimit、overflowAction)

对于不那么频繁的事情:

this.TimeToSleepBetweenBatches = 1000;
因此,内部定时器不会每隔50ms触发一次

根据thread,我还认为为设置一个更高的数字应该可以减少高cpu时间。NLog的2.0 beta版似乎应该通过一次只运行一个惰性编写器线程来修复此问题

同时,您不必更改源代码来进行更改。您可以在以下位置进行设置:


缓冲选项
TimeToSleepBetweenBatchs—批次之间的休眠时间(毫秒)。整数默认值:50


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


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

您记录日志的频率如何?每秒1000行?1分钟?ProcessPendingEvents只是在AsyncTargetTrapper类内的计时器上定期调用。你能详细说明一下你正在做多少日志记录吗?“我已经运行了探查器,这个方法可能会导致它”。“强调可能。”马特:很难说。我的应用程序上都有日志记录,频率取决于日志记录级别。我不知道NLog是如何工作的。也许它会处理所有日志,即使级别很高(假设我有很多跟踪日志,但登录级别是在Info上的,所以文件中只会有更高的Info日志)。我不知道如何找到这个频率。有什么想法吗?斯文森:这种方法在CPU时间分析中是第一位的。如果使用这种方法,我99%确定这就是问题所在。我无法更改源代码(不想更改),但可能可以通过配置xml进行更改。存在默认的AsyncTargetTrapper设置:queueLimit-惰性写入程序线程请求队列中的请求数限制。整数默认值:10000 TimeToSleepBetweenBatchs-批次之间的休眠时间(毫秒)。整数默认值:50 batchSize-惰性写入程序应在批次中处理的日志事件数Integer默认值:100 overflowAction-当惰性编写器线程请求队列计数超过设置的限制时要采取的操作。默认值:我还没有尝试过。我会让你知道的。好吧,这可能就是问题所在,但我使用的是NLOG2.0测试版。我将尝试上面的代码。
this.TimeToSleepBetweenBatches = 1000;
<targets>
  <target xsi:type="AsyncWrapper"
          name="String"
          queueLimit="Integer"
          timeToSleepBetweenBatches="Integer"
          batchSize="Integer"
          overflowAction="Enum">
    <target xsi:type="wrappedTargetType" ...target properties... />
  </target>
</targets>