>

Java Play Framework 기반 응용 프로그램에서 Log4J2 AsyncLogger를 사용하고 있습니다. 높은 동시성 (서버 당 최대 3000 명의 사용자)에서 링 버퍼의 남은 크기가 빠르게 0에 도달하고 요청이 실패하기 시작합니다. 내 링 버퍼 크기는 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 성능 문서는 로깅 위치가 100 배 느리다는 것을 보여줍니다.

    여러 소비자가 로깅 속도를 높이 지 않습니다. 하드 디스크는 여전히 단일 엔드 소비자이며 여러 스레드가 동시에 쓰려고 시도하는 경우 (데이터 손상을 방지하기 위해 잠금 사용) 실제로 속도가 느립니다. 이것이 바로 파괴자가 원래의 방식으로 설계된 이유입니다.

  • 이전 json - v-for 루프에서 배열의 모든 객체를 표시 할 수 없으며 마지막 객체 만 표시
  • 다음 python 3.x - QGraphicsView에서 마우스 포인터 비활성화