我在基于Java Play Framework的应用程序中使用Log4J2 AsyncLogger.我看到在高并发性(每个服务器约3000个用户)时,环形缓冲区的剩余大小很快达到零,我的请求开始失败.我的环缓冲区大小是1048576(512 * 2048).应用程序线程数为8(每个核心1个主题,如Play的官方文档中所述.)
我的问题是:
1 GT;如何提高使用者写入日志文件的速度?
2 – ;我可以显式使用多个使用者来写入我的日志文件吗?如果是这样,我在哪里指定这些消费者?
我已经包含了我的log4j2.xml文件.任何帮助将受到高度赞赏:)
我试过的事情:
1 GT;增加环形缓冲区大小(始终为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左右.
解决方法:
>您可以通过不使用位置来提高速度:用%c替换[%C {1}:%L]. Log4j 2 performance documentation显示记录位置慢了100倍.
>多个消费者不会加快记录速度.硬盘仍然是单个终端用户,并且有多个线程同时尝试写入(使用锁定来防止数据损坏)实际上更慢.这就是破坏者按照原样设计的原因.