2016-12-08 6 views
0

Я пытаюсь использовать JMSAppender log4j2 для отправки журналов в ActivMQ.Отправка 2000 сообщений в секунду с помощью JMSAppender log4j2

Я сделал следующее конф

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration monitorInterval="5"> 
    <Appenders> 
     <Console name="STDOUT" target="SYSTEM_OUT"> 
      <PatternLayout 
       pattern="%d{HH:mm:ss.SSS} %highlight{[%-5p] %c{1.} - %m} %style{(%t)}{Cyan}%n" /> 
     </Console> 
     <RollingFile name="fish" fileName="E:/fish/log/fish.server/fish.log" 
      filePattern="/log/fish.server/fish-%-d{yyyy-MM-dd-HH}.log"> 
      <PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n" /> 
      <Policies> 
       <TimeBasedTriggeringPolicy /> 
      </Policies> 
     </RollingFile> 

     <JMS name="jmsQueue" destinationBindingName="logQueue" 
      factoryName="org.apache.activemq.jndi.ActiveMQInitialContextFactory" 
      factoryBindingName="ConnectionFactory" providerURL="tcp://xxxxxx:61616"> 
      <PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n" /> 
     </JMS> 

    </Appenders> 
    <Loggers> 

     <Logger name="jmsLogger" level="warn"> 
      <AppenderRef ref="jmsQueue" /> 
     </Logger> 

     <Root level="warn"> 
      <!-- <AppenderRef ref="STDOUT" /> --> 
      <AppenderRef ref="fish" /> 
     </Root> 
    </Loggers> 
</Configuration> 

После этого, у меня есть 32-нить streamExecutor, которые делают некоторые сотрудники, а затем использовать jmsLogger.warn (XXXX).

Я сделал нить дамп для моего приложения, и я заметил, следующий блокирующий персонал:

"Log4j2-AsyncLogger[[email protected]]1" - Thread [email protected] 
    java.lang.Thread.State: WAITING 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <324492ea> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
    at java.util.concurrent.ArrayBlockingQueue.take(ArrayBlockingQueue.java:403) 
    at org.apache.activemq.transport.FutureResponse.getResult(FutureResponse.java:40) 
    at org.apache.activemq.transport.ResponseCorrelator.request(ResponseCorrelator.java:87) 
    at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1366) 
    at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1305) 
    at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1795) 
    - locked <1af6596a> (a java.lang.Object) 
    at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:277) 
    at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:212) 
    at org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:241) 
    at org.apache.logging.log4j.core.appender.mom.JmsAppender.append(JmsAppender.java:65) 
    at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:155) 
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:128) 
    at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:119) 
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84) 
    at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:390) 
    at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:375) 
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:359) 
    at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:79) 
    at org.apache.logging.log4j.core.async.AsyncLogger.actualAsyncLog(AsyncLogger.java:310) 
    at org.apache.logging.log4j.core.async.RingBufferLogEvent.execute(RingBufferLogEvent.java:149) 
    at org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:45) 
    at org.apache.logging.log4j.core.async.RingBufferLogEventHandler.onEvent(RingBufferLogEventHandler.java:29) 
    at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:129) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

Таким образом, вопрос, почему режим отправки является Synchrone org.apache.activemq.ActiveMQConnection.syncSendPacket , Это вызывает некоторую проблему блокировки и замедляет мою производительность.

Thnks много :)

ответ

1

По Log4j 2.7, я не в курсе каких-либо тестов производительности для протоколирования с использованием Appender JMS. Большинство опубликованных тестов относятся к регистрации файлов. Log4j2 может записывать 800K msg/sec в файл, поддерживаемый, синхронно, даже в многопоточных приложениях. Асинхронное ведение журнала может быть в несколько раз быстрее для обработки всплесков.

Для сравнения, 2000 msg/sec не похоже на очень большое количество. Я предполагаю, что это будет зависеть от пропускной способности библиотеки реализации JMS.

+0

Да, я попытался реализовать JMSAppender, используя log4j 2.6. Производительность кажется очень хорошей, так как lo4j 2.6 использует самую новую библиотеку дистрибьютора. Я могу отправить 25 тыс. Сообщений в 0.125мс. Так что это отвечает на мой вопрос. Я только что пропустил какую-то конфигурацию. Цель этого воплощения заключается в том, чтобы избежать затрат на запись в файл и делегирование этой части другому процессу (logstash elasticsearch kibana) в моем случае. Thnks для ответа – user3021914