log4j2性能分析+原理

这里写图片描述

官方解释:
Log4j 2包含基于LMAX Disruptor库的下一代异步记录器。在多线程场景中,异步记录器的吞吐量比Log4j 1.x和Logback高18倍,延迟低。有关详细信息,请参阅异步日志记录性能否则,Log4j 2明显优于Log4j 1.x,Logback和java.util.logging,尤其是在多线程应用程序中

LMAX Disruptor技术。异步记录器在内部使用Disruptor,一个无锁的线程间通信库,而不是队列,从而产生更高的吞吐量和更低的延迟。

原因在于log4j2使用了LMAX, 一个无锁的线程间通信库代替了, logback和log4j之前的队列. 并发性能大大提升, 下期文章将研究一下LMAX, 到底是什么

使所有记录器异步
Log4j-2.9及更高版本在类路径上需要disruptor-3.3.4.jar或更高版本。 在Log4j-2.9之前,需要disruptor-3.0.0.jar或更高版本。

这是最简单的配置,并提供最佳性能。 要使所有记录器异步,请将disruptor jar添加到类路径,并将系统属性log4j2.contextSelector设置为org.apache.logging.log4j.core.async.AsyncLoggerContextSelector。

默认情况下,异步记录器不会将位置传递给I / O线程。 如果您的某个布局或自定义过滤器需要位置信息,则需要在所有相关记录器的配置中设置“includeLocation = true”,包括根记录器。

不需要位置的配置可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<!-- Don't forget to set system property
-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
     to make all loggers asynchronous. -->

<Configuration status="WARN">
  <Appenders>
    <!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. -->
    <RandomAccessFile name="RandomAccessFile" fileName="async.log" immediateFlush="false" append="false">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern>
      </PatternLayout>
    </RandomAccessFile>
  </Appenders>
  <Loggers>
    <Root level="info" includeLocation="false">
      <AppenderRef ref="RandomAccessFile"/>
    </Root>
  </Loggers>
</Configuration>

混合同步和异步记录器
Log4j-2.9及更高版本在类路径上需要disruptor-3.3.4.jar或更高版本。在Log4j-2.9之前,需要disruptor-3.0.0.jar或更高版本。无需将系统属性“Log4jContextSelector”设置为任何值。

可以在配置中组合同步和异步记录器。这为您提供了更大的灵活性,但代价是性能略有下降(与使所有记录器异步相比)。使用或配置元素指定需要异步的记录器。配置只能包含一个根记录器(或元素),但是可以组合异步和非异步记录器。例如,包含元素的配置文件还可以包含同步记录器的和元素。

默认情况下,异步记录器不会将位置传递给I / O线程。如果您的某个布局或自定义过滤器需要位置信息,则需要在所有相关记录器的配置中设置“includeLocation = true”,包括根记录器。

混合异步记录器的配置可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<!-- No need to set system property "log4j2.contextSelector" to any value
     when using <asyncLogger> or <asyncRoot>. -->

<Configuration status="WARN">
  <Appenders>
    <!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. -->
    <RandomAccessFile name="RandomAccessFile" fileName="asyncWithLocation.log"
              immediateFlush="false" append="false">
      <PatternLayout>
        <Pattern>%d %p %class{1.} [%t] %location %m %ex%n</Pattern>
      </PatternLayout>
    </RandomAccessFile>
  </Appenders>
  <Loggers>
    <!-- pattern layout actually uses location, so we need to include it -->
    <AsyncLogger name="com.foo.Bar" level="trace" includeLocation="true">
      <AppenderRef ref="RandomAccessFile"/>
    </AsyncLogger>
    <Root level="info" includeLocation="true">
      <AppenderRef ref="RandomAccessFile"/>
    </Root>
  </Loggers>
</Configuration>

位置,位置,位置……
如果其中一个布局配置了与位置相关的属性,如HTML locationInfo,或其中一个模式%C或$ class,%F或%file,%l或%location,%L或%line,%M或%方法,Log4j将获取堆栈的快照,并遍历堆栈跟踪以查找位置信息。

这是一项昂贵的操作:同步记录器的速度要慢1.3到5倍。同步记录器在获取此堆栈快照之前会尽可能长时间等待。如果不需要位置,则永远不会拍摄快照。

但是,异步记录器需要在将日志消息传递给另一个线程之前做出此决定;在该点之后,位置信息将丢失。对于异步记录器,获取堆栈跟踪快照的性能影响甚至更高:使用位置记录比没有位置的记录慢30-100倍。因此,默认情况下,异步记录器和异步追加器不包含位置信息。

您可以通过指定includeLocation =“true”来覆盖记录器或异步appender配置中的默认行为。

记录峰值吞吐量

下图比较了同步记录器,异步appender和异步记录器的吞吐量。 这是所有线程的总吞吐量。 在使用64个线程的测试中,异步记录器比异步记录器快12倍,比同步记录器快68倍。

异步记录器的吞吐量随着线程数的增加而增加,而同步记录器和异步追加器都具有或多或少的常量吞吐量,而不管执行日志记录的线程数是多少。

这里写图片描述

我们还将异步记录器的峰值吞吐量与其他日志记录包中可用的同步记录器和异步appender进行了比较,特别是log4j-1.2.17和logback-1.0.10,结果类似。 对于异步appender,在添加更多线程时,所有线程的总日志吞吐量保持大致不变。 异步记录器可以在多线程方案中更有效地使用机器上可用的多个内核。

这里写图片描述

下图比较了Logback 1.1.7,Log4j 1.2.17中基于ArrayBlockingQueue的异步appender与Log4j 2.6提供的异步日志记录的各种选项的响应时间延迟。 在每秒128,000个消息的工作负载下,使用16个线程(每个以每秒8,000个消息的速率记录),我们看到Logback 1.1.7,Log4j 1.2.17遇到的延迟峰值比Log4j 2大几个数量级。

这里写图片描述

下图放大了同一测试的Log4j 2结果。 我们看到基于ArrayBlockingQueue的Async Appender的最坏情况响应时间最高。 无垃圾异步记录器具有最佳响应时间行为。

这里写图片描述

原文:https://blog.csdn.net/yjh1271845364/article/details/70888262

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值