一、问题描述
在对用solr实现的全文检索系统做性能测试时,发现并发量达到400时,内存溢出。200并发量无任何问题。
二、问题追踪
使用jconsole查看内存消耗,老年代基本占满。线程数大量处于blocked状态。查看blocked条件,发现是记录日志log4j线程一直处于阻塞状态。修改solr中log4j日志配置(仅输出警告信息,并增加缓存),如下:
#Update ‘log4j.appender.file.layout.ConversionPattern‘ value #Wed Apr 01 14:53:18 CST 2015 solr.log=logs/ log4j.rootLogger=WARN,file, CONSOLE log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n log4j.appender.CONSOLE.BufferedIO=true log4j.appender.CONSOLE.BufferSize=8192 log4j.appender.CONSOLE.ImmediateFlush=false #- size rotation with log cleanup. log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.MaxFileSize=4MB log4j.appender.file.MaxBackupIndex=9 log4j.appender.file.BufferedIO=true log4j.appender.file.BufferSize=8192 log4j.appender.file.ImmediateFlush=false #- File to log to and log format log4j.appender.file.File=${solr.log}/solr.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n log4j.logger.org.apache.zookeeper=WARN log4j.logger.org.apache.hadoop=WARN log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF
问题依旧未得到解决,重新查看阻塞线程堆栈信息。发现调用log4j的线程不是solr后端的线程,而是velocity进程。问题找到。修改velocity配置文件(velocity.properties),仅输出错误信息。如下:
input.encoding=UTF-8 output.encoding=UTF-8 runtime.log.error.stacktrace = false runtime.log.warn.stacktrace = false runtime.log.info.stacktrace = false runtime.log.logsystem.class = org.apache.velocity.runtime.log.SimpleLog4JLogSystem runtime.log.logsystem.log4j.category = velocity_log log4j.logger.velocity_log=ERROR,CONSOLE
问题解决。但是只是回避了日志输出的问题。
三、最终解决方案
1、减少日志输出。
2、增加缓存功能。
3、实现异步日志IO功能。
PS:velocity.properties配置文件的前两行用于解决solr/browse前端页面中文乱码的问题。只需在velocity.properties配置文件添加编码格式。并在solr.config中配置使用就OK。solr.config配置如下:
<str name="wt">velocity</str> <str name="v.template">browse</str> <str name="v.layout">layout</str> <str name="v.properties">velocity.properties</str> <str name="v.contentType">text/html;charset=UTF-8</str>
时间: 2024-10-24 11:54:29