【问题标题】:Chronicle queue + log4j2 async logger编年史队列 + log4j2 异步记录器
【发布时间】:2017-12-25 18:59:25
【问题描述】:

我使用 log4j2 2.10.0 并且有以下代码:

   SingleChronicleQueue q = SingleChronicleQueueBuilder.binary(args[0]).blockSize(536870912).build();
    ExcerptAppender a = q.acquireAppender();

    char[] chars = "abcdefghijklmnopqrstuvwxyz".toCharArray();
    StringBuilder sb = new StringBuilder();
    Random random = new Random();
    for (int i = 0; i < 1000; i++) {
        char c = chars[random.nextInt(chars.length)];
        sb.append(c);
    }
    String t = sb.toString();

    for (int i = 0; i < 1000000; i ++ ) {
        m_logger.info(i + " " + t);
        a.writeText(t);
    }

cq4 和日志都写入同一个目录。

在日志中,它一直很好,直到我能看到

    12:40:00.853 - [main] INFO c.c.c.a.r.SandboxApp 601049 
    12:40:00.853 - [main] INFO c.c.c.a.r.SandboxApp 601050 
    12:40:00.853 - [main] INFO c.c.c.a.r.SandboxApp 601051 
    12:40:06.156 - [main] INFO c.c.c.a.r.SandboxApp 601052 

有某种 IO 操作使它延迟了 6 秒。

我对磁盘、挂载等了解不够。如果我注释掉 writeText,这会消失,但我不知道这是编年史问题还是 log4j2。

我的log4j2参数是

-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -DAsyncLogger.RingBufferSize=65536*65536 -DAsyncLogger.WaitStrategy=Sleep -Dlog4j2.AsyncQueueFullPolicy=Discard -Dlog4j2.DiscardThreshold=INFO

这是分析器显示的内容

谢谢!!

【问题讨论】:

    标签: log4j2 chronicle-queue


    【解决方案1】:

    一旦您开始使用内存映射文件,您就会离开 Java 领域并进入操作系统(和硬件)的世界。

    那么,问题 1:您使用的是什么操作系统(以及什么版本)?

    问题 2:您的机器上有多少物理内存?

    问题3:你用的是什么硬盘? SSD 还是旋转磁盘?

    2017 年,写入速度超过 200 MB/秒的消费级旋转磁盘非常快。相比之下,this 2017 comparison 中最快的 SSD 写入速度为 1900 MB/秒。

    您只是尝试将大约 2GB 写入内存映射文件。这需要在某个时候与物理磁盘同步。同步很容易需要 6 秒...

    内存映射文件的“乐趣”在于您几乎无法控制何时发生这种同步。人们最终会拆分成更小的文件,以确保这些停顿不会变得太大。在调整此类应用程序的性能方面存在一些黑魔法。在这个领域有很多东西要学。未来的欢乐时光!尽情享受吧!

    顺便说一下,你不能配置

    -DAsyncLogger.RingBufferSize=65536*65536 # not a number
    

    Log4j2 将尝试将 65536*65536 解析为数字,这将失败,它会回退到使用默认缓冲区大小。您需要指定所需的环形缓冲区大小以字节为单位

    【讨论】:

    • 好的,谢谢。我找到了一个更快的磁盘并且问题消失了..所以我怀疑以前的安装/驱动器太慢了。谢谢!我会研究调整性能!您有任何参考/网站/书籍来研究调整这些东西吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多