【问题标题】:Log4j2 AsyncAppender performance testLog4j2 AsyncAppender 性能测试
【发布时间】:2017-03-14 22:56:19
【问题描述】:

我正在编写一个 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() 到后台线程将数据写入磁盘/控制台/数据库等?

谢谢

【问题讨论】:

    标签: java logging performance-testing log4j2 jmh


    【解决方案1】:

    使用 JMH 对端到端异步日志记录进行基准测试(使用像 FileAppender 这样的真正附加程序)的问题是 JMH 非常快地产生了许多日志事件。 FileAppender 无法跟上,因此(固定大小)异步队列立即填满。

    一旦队列已满,日志记录性能就会下降到比普通同步文件日志记录更差的程度。

    我们发现我们需要非常清楚我们想要测量的内容,我们最终分别测量了在有空间的情况下事件可以多快排队,以及 FileAppender 可以多快将事件写入磁盘。

    使用 JMH,很难在端到端测试中同时测量两者,因为 JMH 不会让您控制触发多少事件(据我所知)。所以很难避免排满队列。我怀疑您对队列满后异步日志记录的速度并不感兴趣,因为这种情况极为罕见。

    我们为 Log4j2 performance tests 采用的方法是使用带有 no-op appender 的 JMH 进行异步日志记录测试,并为同步文件日志记录提供单独的 JMH 基准。

    对于最初的Async Logger performance tests,我们编写了一个自定义性能测试框架,在不超过队列大小的事件中进行测试。 (可以在 Log4j 2 单元测试源目录中找到 PerfTest、MTPerfTest 和 PerfTestDriver 类。)这也不容易做到:您需要确保测试正确预热,确保所有日志记录线程在同时,在与测试驱动程序不同的 JVM 中运行基准测试并以某种方式收集结果等。

    附言

    请注意,ConsoleAppender 比记录到文件慢大约 50 倍(!)。使用控制台日志来比较日志库的性能并不是一个好主意。

    【讨论】:

    • 嗨 Remko,感谢您的回复。我同意使用 JMH 测量异步记录器并不容易。也许是因为 JMH 是针对微观而不是端到端的基准测试。我还看到了您关于拆分测试用例的推理。我避免编写自己的测试工具,因为我知道我不知道如何纠正“协调遗漏”等问题。我现在正在研究 JLBH。它建立在 JMH 之上,但旨在根据上下文而不是孤立地衡量事物。仍在玩它,但看起来你可以用它控制迭代次数。一旦我有它的工作将分享我的测试用例。干杯!
    • 明白。一定要测试多线程场景。这比较困难,但经常被忽视。调整队列大小,使其可以容纳事件总数,而不仅仅是单个线程。
    • 还有一件事:协调遗漏会在延迟测试中抬头,但在吞吐量测试中,您无需担心。
    • 非常感谢 Remko!我还在 Mechanical Sympathy 谷歌论坛上找到了你与重量级人物的聊天。这个测量业务肯定不容易 :) 为 log4j2 的成功欢呼和祝贺。
    猜你喜欢
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多