Log4J2 AsyncLogger заполняет кольцевой буфер LMAX-прерывателя при высоком параллелизме - PullRequest
0 голосов
/ 29 января 2019

Я использую Log4J2 AsyncLogger в моем приложении на основе Java Play Framework.Я вижу, что при высоком параллелизме (~ 3000 пользователей на сервер) оставшийся размер кольцевого буфера быстро достигает нуля, и мои запросы начинают отказывать.Размер моего кольцевого буфера 1048576 (512 * 2048).Количество потоков приложений равно 8 (1 поток на ядро, как указано в официальной документации Play). Мои вопросы:

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 голосов
/ 30 января 2019
  1. Вы можете увеличить скорость, не используя местоположение: замените [%C{1}:%L] на %c.Документация по производительности Log4j 2 показывает, что расположение журнала в 100 раз медленнее.
  2. Несколько потребителей не будут ускорять регистрацию.Жесткий диск по-прежнему является единственным конечным потребителем, и наличие нескольких потоков, пытающихся выполнить запись одновременно (используя блокировку для предотвращения повреждения данных), на самом деле медленнее.Вот почему разрушитель спроектирован таким, какой он есть.
...