2017-09-25 1 views
1

안녕하세요 현재 로그백 로깅 프레임 워크를 연구하고 있습니다. 비동기 Appender는 모든 스레드가 대기열에서 메시지를 대기열에 넣고 비동기식 appender의 작업 스레드가 대기열에서 특정 대상으로 메시지를 로깅 할 수있는 appenders로 결정할 수있는 방식으로 메시지를 로깅하기 위해 차단 대기열을 사용합니다. 파일, 데이터베이스, 소켓 등등.구성 및 Logback 프레임 워크에서 AsyncAppender 성능

메인 스레드가 I/O를 수행하지 않아 응답 시간에 성능 향상을 볼 수 있습니다. 대기열의 메시지 만 푸시합니다. 백그라운드 작업자 스레드는 비동기 애플릿이 해당 메시지를 검색하고 로그 파일에 추가하십시오.

내 이해가 맞습니까? 대기열 크기, maxFlushTime, neverBlock, discardingThreshold 및 includeCallerData와 같은 비동기 애플릿과 관련된 몇 가지 구성 속성을 읽습니다.

로깅 성능을 향상시키기 위해 이러한 속성을 사용해야하는 방법 async appender에 대한 현재 구성은 다음과 같습니다.

<appender name="ASYNC500" class="ch.qos.logback.classic.AsyncAppender"> 
    <appender-ref ref="fileAppender"/> 
    <queueSize>500</queueSize> 
    <maxFlushTime>1000</maxFlushTime> 
</appender> 

성능 향상을 위해 누군가 나에게 약간의 조정을 제안 할 수 있습니까? ? 어느 것이 정상적인 appender인가 Async Appender인가?

답변

2

첫 번째 질문에 대답 ...

더 나은 정상 펜더 또는 비동기이 appender는

?

대답은 다음과 같습니다. 에 달려 있습니다.

  • 장점 : : 그것이 낮은 것 완료하기 위해 주어진 Logger.debug|info|warn|error 호출에 걸리는 시간 즉

    • 낮은 로그 이벤트 대기 시간이 여기에 AsyncAppender 사용의 장단점 것을 명확히하기 위해 동기 로거보다 비동기 로거가 중요합니다.
    • 높은 처리량. 이것은 bursty 로그 즉 비정기 적으로 대량의 로그 이벤트가 발생하는 어플리케이션에 특히 유용합니다. 비동기 로깅 - 특히 구성된 대기열 크기가 이러한 스파이크를 수용 할만큼 충분히 큰 경우 - 이러한 스파이크가 발생할 때 발생할 수있는 로깅 호출의 속도 저하를 방지합니다.
  • 단점 :

    • 응용 프로그램은 바인딩 응용 프로그램이보다 빠른 로그 이벤트를 방출되면 많은 혜택을
    • 를 제공하지 않습니다 비동기 로그 이벤트를 처리하는 다른 스레드를 시작 CPU가 이미있는 경우 비동기식 appender 내부 appender가 그들을 처리 할 수 ​​있습니다 다음 비동기 appender 로그 이벤트를 대기열에 시작됩니다 그리고이 계속되면 응용 프로그램은 느린 방출과 폐기 이벤트 사이의 결정에 직면하게 될 것입니다
    • 어르 게 전파하는 것이 훨씬 더 까다 롭습니다. 는 이러한 장점과 단점 중 일부는 다른 사람보다 더 많은 무게를 가지고 당신이 찾을 수있는 사용 사례에 따라 동기 로거

에서보다 로그 동안 ROR은 비동기 로거에서 다시 발광 프로그램 쓰기 . AsyncAppender없이 시작하고 시연 할 필요가있는 경우에만 사용하는 것이 좋습니다. 위로 첫 번째 질문에

...

누군가 성능을 얻기 위해 나에게 약간의 비틀기를 제안 할 수 있습니다?

내가 두 번째 질문에 먼저 답한 이유입니다. 응용 프로그램의 세부 사항과 런타임 구성 (호스트의 메모리와 CPU, AsyncAppender으로 감싸는 appender의 유형 및 로그 이벤트 삭제 허용치)을 모르는 채로 구성하는 방법을 말할 수는 없습니다.

  • queueSize : 결정할 때 AsyncAppender를 구성하는 경우 및-방법 그러나 나는 다음을 고려 좋을 것 염두에 지식을 자신의 응용 프로그램에 대한 모든 것을 그래서 알게 더 큰이있다 응용 프로그램 스레드에 블로킹이 적습니다. 비동기식 appender 대기열이 가득 차면 작업자 스레드가 대기열에서 항목을 제거 할 수있을 때까지 응용 프로그램 스레드가 새 이벤트를 로깅 할 수 없게됩니다. 따라서 응용 프로그램이 큐를 채우기에 충분한 동시 로그 이벤트를 생성하는 경향이있는 경우 queueSize을 늘리면 처리량이 향상됩니다. 하지만이 처리량의 증가는 응용 프로그램이 기존 대기열 크기를 줄일 수 있고 힙 사용 비용이 발생하는 경우에만 관련된다는 점에 유의하십시오.
  • includeCallerData : 발신자가 로그 이벤트에서 제공 한 데이터를 읽는 것이 비용이 많이 들지만 일반적으로 false으로 설정하면 성능이 향상되고 로그 이벤트에 맞춤식 발신자가 제공 한 데이터가 없으면 실제로 데이터가 손실되지 않습니다.
  • neverBlock :이 값을 true으로 설정하면 응용 프로그램 스레드가 차단되지 않지만 비동기 애플릿의 내부 버퍼가 가득 차면 로그 이벤트가 손실 될 수 있습니다.

너무 ...

  • 처리량을 극대화하는 당신에게 필수적이며 다음 처리량을 극대화하는 것은 당신에게 중요하다면 neverBlock=true

  • 사용하는 일부 이벤트를 잃어 버릴까 걱정하지 않는다 당신이 당신의 힙과 헤드 룸의 많음이있는 경우 로그 이벤트를 잃는에 대한 관용이 없다 후 사용 여기 queueSize=_some_number_which exceeds_ the_maximum_queue_size_observed_in_testing_plus_25_percent_

많음 자세한 내용 :

+0

은 log4j입니다. log4j 성능 통계에서이 이미지에 표시된 async appender와 async logger의 차이점은 무엇입니까? https://logging.apache.org/log4j/2.x/images/async -vs-sync-throughput.png – Prashank

+0

은 log4j2가 더 나은 Logback입니까? – Prashank

+0

그 질문에 대한 대답은 ** 귀하의 ** 사용 패턴에 달려 있다고 생각합니다. – glytching

관련 문제