一、問題描述
在對用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>
