Log4j2 AsyncAppender 性能测试
Log4j2 AsyncAppender performance test
我正在编写一个 JMH 基准测试来测试 logback 的 AsyncAppender 的性能。
作为起点,我查看了 log4j2 的性能测试,但看起来它们不是端到端的测量。例如,这里的测试Log4j2 Async Appender Benchmark只是测试将可记录的数据包装在一个对象中并将其入队到中断器(后备队列)中的吞吐量。
@Benchmark
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
public void throughput2Params() {
logger.info("p1={}, p2={}", one, two);
}
这是全部还是我错过了一个测试,其中整个测量是从调用 logger.info() 到后台线程将数据写入 disk/console/db 等?
谢谢
使用 JMH 对端到端异步日志记录进行基准测试(使用像 FileAppender 这样的真正的附加程序)的问题是 JMH 生成许多日志事件的速度非常快。 FileAppender 无法跟上,因此(固定大小)异步队列会立即填满。
一旦队列已满,日志记录性能就会下降到比普通同步文件日志记录更糟糕的程度。
我们发现我们需要非常清楚我们想要测量的内容,因此我们最终分别测量了 space 时事件入队的速度以及 FileAppender 将事件写入磁盘的速度.
使用 JMH 很难在端到端测试中同时测量两者,因为 JMH 不允许您控制触发的事件数量(据我所知)。所以很难避免排队。我怀疑您对队列已满后异步日志记录的速度有多快不感兴趣,因为这种情况极为罕见。
我们为 Log4j2 performance tests 采取的方法是将 JMH 与无操作附加程序一起用于异步日志记录测试,并使用单独的 JMH 基准进行同步文件日志记录。
对于最初的 Async Logger performance tests,我们编写了一个自定义性能测试框架,该框架在不超过队列大小的突发事件中进行测试。 (可以在 Log4j 2 单元测试源目录中找到 PerfTest、MTPerfTest 和 PerfTestDriver 类。)这也不容易做到:您需要确保测试正确预热,确保所有日志记录线程同时启动,运行 在独立于测试驱动程序的 JVM 中进行基准测试,并以某种方式收集结果,等等。
P.S.
请注意,ConsoleAppender 比记录到文件大约慢 50 倍(!)。使用控制台日志记录来比较日志记录库的性能并不是一个好主意。
我正在编写一个 JMH 基准测试来测试 logback 的 AsyncAppender 的性能。
作为起点,我查看了 log4j2 的性能测试,但看起来它们不是端到端的测量。例如,这里的测试Log4j2 Async Appender Benchmark只是测试将可记录的数据包装在一个对象中并将其入队到中断器(后备队列)中的吞吐量。
@Benchmark
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
public void throughput2Params() {
logger.info("p1={}, p2={}", one, two);
}
这是全部还是我错过了一个测试,其中整个测量是从调用 logger.info() 到后台线程将数据写入 disk/console/db 等?
谢谢
使用 JMH 对端到端异步日志记录进行基准测试(使用像 FileAppender 这样的真正的附加程序)的问题是 JMH 生成许多日志事件的速度非常快。 FileAppender 无法跟上,因此(固定大小)异步队列会立即填满。
一旦队列已满,日志记录性能就会下降到比普通同步文件日志记录更糟糕的程度。
我们发现我们需要非常清楚我们想要测量的内容,因此我们最终分别测量了 space 时事件入队的速度以及 FileAppender 将事件写入磁盘的速度.
使用 JMH 很难在端到端测试中同时测量两者,因为 JMH 不允许您控制触发的事件数量(据我所知)。所以很难避免排队。我怀疑您对队列已满后异步日志记录的速度有多快不感兴趣,因为这种情况极为罕见。
我们为 Log4j2 performance tests 采取的方法是将 JMH 与无操作附加程序一起用于异步日志记录测试,并使用单独的 JMH 基准进行同步文件日志记录。
对于最初的 Async Logger performance tests,我们编写了一个自定义性能测试框架,该框架在不超过队列大小的突发事件中进行测试。 (可以在 Log4j 2 单元测试源目录中找到 PerfTest、MTPerfTest 和 PerfTestDriver 类。)这也不容易做到:您需要确保测试正确预热,确保所有日志记录线程同时启动,运行 在独立于测试驱动程序的 JVM 中进行基准测试,并以某种方式收集结果,等等。
P.S.
请注意,ConsoleAppender 比记录到文件大约慢 50 倍(!)。使用控制台日志记录来比较日志记录库的性能并不是一个好主意。