java - Log4J2 AsyncLogger 正在以高并发填满 LMAX disruptor 的环形缓冲区

标签 java logging playframework configuration log4j2

我在基于 Java Play Framework 的应用程序中使用 Log4J2 AsyncLogger。我看到在高并发性(每台服务器约 3000 个用户)下,环形缓冲区的剩余大小很快达到零,我的请求开始失败。我的环形缓冲区大小是 1048576 (512*2048)。应用程序线程数为 8(如 Play 官方文档中所述,每个内核 1 个线程。) 我的问题是:

1> 如何提高消费者写入日志文件的速度? 2> 我可以显式地使用多个消费者来写入我的日志文件吗?如果是这样,我应该在哪里指定这些消费者?

我已经包含了我的 log4j2.xml 文件。任何帮助将不胜感激:)

我尝试过的事情:

1> 增加了环形缓冲区大小(始终为 2 的幂)。但是最终还是出现了同样的问题,使用过多的内存似乎也不是很优雅。这个选项将在生产中被击落。我错过了什么吗?

2> 尝试了不同的等待策略。运气不好。

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

<Configuration>
<!--  status="trace" attribute for Configuration tag prints in logs [ Starting AsyncLoggerConfig disruptor for this configuration with ringbufferSize=262144] -->
<!-- default log file names in case it fails to read it from property file -->
<Properties>
    <Property name="FILE_NAME">/opt/lol/logs/meh.log</Property>
    <Property name="FILE_PATTERN">/opt/lol/logs/meh_%d{yyyy-MM-dd_HH}.log</Property>
</Properties>

<Appenders>
    <RollingRandomAccessFile name="ASYNCFILE" fileName="${sys:FILE_NAME}" filePattern="${sys:FILE_PATTERN}">
        <PatternLayout pattern="[meh:%d{yyyy-MM-dd HH:mm:ss},%d{SSS}] %-5level[%thread][%C{1}:%L] %msg%n"/>
        <Policies>
            <TimeBasedTriggeringPolicy />
        </Policies>
    </RollingRandomAccessFile>

    <Console name="CONSOLE" target="SYSTEM_OUT">
        <PatternLayout pattern="[meh:%d{yyyy-MM-dd HH:mm:ss},%d{SSS}] %-5level[%thread][%C{1}:%L] %msg%n"/>
    </Console>
</Appenders>

<Loggers>
    <logger name="akka" level="INFO" />
    <AsyncRoot level="INFO" includeLocation="true">
       <!-- <AppenderRef ref="CONSOLE"/>-->
        <AppenderRef ref="ASYNCFILE"/>
    </AsyncRoot>
</Loggers>
</Configuration>

我希望并发性至少达到每盒 4000 个(与没有记录器时相同)。但我卡在 2500 左右。

最佳答案

  1. 您可以通过不使用位置来提高速度:将 [%C{1}:%L] 替换为简单的 %c。 Log4j 2 performance documentation显示日志记录位置慢 100 倍。
  2. 多个消费者不会加速日志记录。硬盘仍然是单一的最终消费者,并且有多个线程试图同时写入(使用锁定来防止数据损坏)实际上更慢。这就是干扰器按原样设计的原因。

关于java - Log4J2 AsyncLogger 正在以高并发填满 LMAX disruptor 的环形缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54418801/

相关文章:

java - 字节码注入(inject)在哪里可能有用?

java - 将证书和私钥加载到 Java KeyStore 中

java - 如何添加更多球并使它们具有不同的起始位置?以我的方法来说这可能吗?

angularjs - AngularJS 的 Play2 重定向

scala - Play 2.0.1 - Scala 模板字符串连接 + 可重用代码块

JavaFX 参数化可编辑表格 View

java - 如何更改 jboss 日志记录级别以显示我正在调用哪个 java 类?

mongodb - 是否可以将 MongoDb 上限集合与 phalcon 集合模型一起使用

logging - Enterprise Library Logging Distributor 配置中的 TraceListenerData 类型无效

playframework - Play 框架中的 SQL 访问是否被阻止?