Log4J2 AsyncLogger正在以高并发度填充LMAX破坏者的环形缓冲区

时间:2019-01-29 10:22:35

标签: 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 个答案:

答案 0 :(得分:4)

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