solr高同時性の問題-メモリオーバーフロー
2600 ワード
一、問題の説明
solrで実現した全文検索システムの性能テストでは,同時量が400に達するとメモリがオーバーフローすることが分かった.200コンカレント量に問題はありません.
二、問題追跡
jconsoleを使用してメモリ消費量を表示すると、古い世代はほぼ満タンです.スレッド数は大量にblocked状態にあります.blocked条件を表示すると、ログlog 4 jスレッドが常にブロックされていることがわかります.solrのlog 4 jログ構成を変更します(警告情報のみを出力し、キャッシュを追加します).
問題は解決されず、ブロックスレッドスタック情報を再表示します.log 4 jを呼び出すスレッドはsolrバックエンドのスレッドではなくvelocityプロセスであることが分かった.問題が見つかりました.velocityプロファイル(velocity.properties)を変更し、エラー情報のみを出力します.次のようになります.
問題が解決する.しかし、ログ出力の問題を回避しただけです.
三、最終解決方案
1、ログ出力を減らす.
2、キャッシュ機能を追加する.
3、非同期ログIO機能を実現する.
PS:velocity.propertiesプロファイルの最初の2行はsolr/browseフロントエンドページの中国語文字化けしの問題を解決するために使用されます.velocity.propertiesプロファイルに符号化フォーマットを追加します.そしてsolr.コンフィギュレーションで使用すればOKです.solr.configの構成は次のとおりです.
solrで実現した全文検索システムの性能テストでは,同時量が400に達するとメモリがオーバーフローすることが分かった.200コンカレント量に問題はありません.
二、問題追跡
jconsoleを使用してメモリ消費量を表示すると、古い世代はほぼ満タンです.スレッド数は大量にblocked状態にあります.blocked条件を表示すると、ログlog 4 jスレッドが常にブロックされていることがわかります.solrのlog 4 jログ構成を変更します(警告情報のみを出力し、キャッシュを追加します).
#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
log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN
log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF
問題は解決されず、ブロックスレッドスタック情報を再表示します.log 4 jを呼び出すスレッドは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プロファイルの最初の2行はsolr/browseフロントエンドページの中国語文字化けしの問題を解決するために使用されます.velocity.propertiesプロファイルに符号化フォーマットを追加します.そしてsolr.コンフィギュレーションで使用すれば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>