在记录框架中,异步的配置和性能



嗨,我目前正在研究日志记录框架。我遇到了异步的附加器,这些附加器使用阻止队列来记录消息,以使所有线程在阻止队列中的所有线程中的所有线程和Async Appender的工作线程负责将消息从排队记录到某些目标到某些目的地,如附录者所确定的文件,数据库,套接字等

我可以看到响应时间的性能增益,因为主线程不会执行I/O,它仅在Queue和Rackground Worker线程中以Async Appender检索这些消息并将其附加在日志文件中。p>我的理解对吗?我阅读了与异步appender相关的几个配置属性,例如队列大小,maxflushtime,noverblock,dustphingThreshold和includecallerdata。

我应该如何使用这些属性以提高记录的性能我当前对异步appender的配置如下。

<appender name="ASYNC500" class="ch.qos.logback.classic.AsyncAppender">
   <appender-ref ref="fileAppender"/>
   <queueSize>500</queueSize>
  <maxFlushTime>1000</maxFlushTime>
</appender>

有人可以建议我进行一些调整以获得性能。?哪个是更好的普通appender或异步appender?

首先回答第二个问题...

哪个更好的普通appender或异步appender?

这里的答案是:它取决于。为了澄清使用AsyncAppender的优缺点:

  • PROS:

    • 较低的日志事件延迟,即任何给定的Logger.debug|info|warn|error呼叫完成的时间对于异步记录器的完成时间比同步记录器要低。
    • 更高的吞吐量。这对于具有爆发日志的应用程序特别有用,即偶尔发生的大量日志事件。异步记录 - 尤其是如果配置的队列大小足够大以适应这些尖峰的情况 - 将防止在面对这些尖峰时可能出现的记录调用中的慢速度。
  • cons:

    • 如果您的应用程序已经绑定了CPU,则启动另一个线程来处理异步日志事件不会提供太多好处
    • 如果您的应用程序比在异步Appender内部的应用程序更快地发射日志事件可以处理它们,则异步Appender将开始呼叫日志事件,如果此过程继续进行,那么您的应用程序可能会面临慢速发射和丢弃事件之间的决定
    • 在日志中传播错误要比从同步记录器中传播回发射程序要比同步logger
  • 要棘手得多。

根据您的用例,您可能会发现其中一些利弊比其他利弊更重要。我建议在没有AsyncAppender的情况下开始,只有在您有可证明的需要的情况下才使用。

回到您的第一个问题...

有人可以建议我进行一些调整以提高性能吗?

这就是为什么我首先回答第二个问题的原因。不知道应用程序的细节及其运行时配置(在主机上的内存和CPU,AsyncAppender包裹的appender类型以及您对丢弃日志事件的容忍度),不可能说出如何shoud shoud配置它。但是,您将了解有关您自己的应用程序的所有这些事情,因此考虑到这些知识,我建议您在决定是否配置AsyncAppender时考虑以下内容:

  • queueSize:越大的是,应用程序线程上的阻塞越小。如果异步Appender的队列填充,则应用程序线程将被阻止记录新事件,直到工作线程有机会从队列中删除项目。因此,如果应用程序倾向于在附近的日志事件接近以填充队列,则增加queueSize将改善吞吐量。但是请记住,只有当应用程序能够淹没现有队列大小并且以堆积为代价时,吞吐量中的增益才有意义。
  • includeCallerData:阅读呼叫者提供的日志事件的数据可能很昂贵,通常会发现将其设置为false可以提高性能,除非您有一些定制呼叫者在日志事件中提供的数据,否则您实际上不会丢失任何数据
  • neverBlock:将其设置为true将阻止您的应用程序线程上的任何阻塞,但是如果异步Appender的内部缓冲区填充,则以丢失的日志事件为代价。

所以...

  • 如果最大化吞吐量对您至关重要,并且您不在乎失去某些事件,则使用neverBlock=true

  • 如果最大化吞吐量对您很重要,并且您的堆有足够的净空,并且您对丢失日志事件的容忍度不容忍,则使用:queueSize=_some_number_which exceeds_ the_maximum_queue_size_observed_in_testing_plus_25_percent_

这里有更多详细信息:

  • 记录文档
  • log4j性能统计(涵盖了logbacks async appender的穿孔)。

总而言之,如果您的旧应用程序仍在使用记录,请使用异步记录,并且不介意快速有损失的记录(异步用缓冲的刷新来订阅),即在最坏的情况下,在最坏的情况下,缓冲ArrayBlockingQueue已满,或者您的记录速度超过磁盘的速度更快,"可以放松数据可以",因为您可能过多地记录了或应用程序响应时间更重要。

否则,如果您想要一个无损的appender,即,将noverblock = false(默认)设置为dovertingthreshold = 0"上面没有讨论" - 记录器开始丢弃数据&lt; =当队列大小默认达到某个百分比时,您将开始看到它的行为与SynCappender相同。log4j2是您真的登录的方法,再次ymmv!

https://jira.qos.ch/browse/logback-1279

最新更新