C# NLog cpu性能问题
我对NLog库中的此方法有问题: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.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>