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