3

私は Java の専門家ではありませんが、Solr を使用して検索していますが、この問題について検索した後、なぜそれが起こっているのかわかりませんでした。

並べ替えなしの 3000 万件のレコード インデックスと実行できる最も軽いセットアップがありますが、いくつかのクエリの後に次の例外があります。

SEVERE: java.lang.OutOfMemoryError: org.apache.lucene.index.SegmentReader.createFakeNorms(SegmentReader.java:1117) の Java ヒープ領域 org.apache.lucene.index.SegmentReader.fakeNorms(SegmentReader.java:1125) でorg.apache.lucene.index.SegmentReader.norms(SegmentReader.java:1140) org.apache.solr.search.SolrIndexReader.norms(SolrIndexReader.java:282) org.apache.lucene.search.TermQuery$TermWeight.スコアラー(TermQuery.java:72) org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:250) org.apache.lucene.search.Searcher.search(Searcher.java:171) org.apache org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:341) org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:182) で org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:195) で org.apache .solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:131) で org.apache.solr.core.SolrCore.execute(SolrCore.java:1317) で org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java) :338) org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:241) で org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) で org.apache.catalina.core. org.apache.catalina.core の ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)。org.apache の StandardWrapperValve.invoke(StandardWrapperValve.java:233)。org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 102) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) で org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) で org.apache.coyote.http11.Http11Processor .process(Http11Processor.java:859) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) at org.apache.tomcat.util.net.JioEndpoint$Worker.run(JioEndpoint.java) :489) java.lang.Thread.run(Thread.java:679) でorg.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) の invoke(StandardHostValve.java:127) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) の org.apache org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) の .catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol .java:602) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) で java.lang.Thread.run(Thread.java:679) でorg.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) の invoke(StandardHostValve.java:127) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) の org.apache org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) の .catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol .java:602) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) で java.lang.Thread.run(Thread.java:679) でorg.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) の connector.CoyoteAdapter.service(CoyoteAdapter.java:293) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java: 602) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) で java.lang.Thread.run(Thread.java:679) でorg.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) の connector.CoyoteAdapter.service(CoyoteAdapter.java:293) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java: 602) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) で java.lang.Thread.run(Thread.java:679) で

次に、Tomcat を再起動すると、いくつかの要求が再び落ちるまで動作に戻ります。

私は並べ替えを行っておらず (望んでいますが)、検索はほとんどの場合、特定のインデックス付きフィールド (すべてではありません) によって行われます。

私たちを手伝ってくれますか?前もって感謝します :)

4

2 に答える 2

6

数百万のレコードを持つSolrデプロイメントの場合、128MBは低いようです。実際、を使用してJVMの最大サイズを増やすことができます-Xmx。ヒープの-XX:MinHeapFreeRatioサイズが変更されるポイントを変更するだけですが、最大サイズを直接割り当ててサイズ変更を回避する-Xmsのと同じ値で使用することもできます。-Xmx

ただし、ガベージコレクション中の一時停止が長くなるため、メモリが多すぎるとレイテンシが逆効果になる可能性があるため、単に多くのメモリをブラインドでスローするのではなく、ヒープのより正確な値を決定することをお勧めします。JVisualVM(VisualGCプラグインを使用)またはjstatコマンドラインを使用すると、Solrが起動後に使用するメモリの量、要求後に使用する量、および通常の使用中にヒープがどのように変化するかを確認できます。

たとえば、を使用するjstat -gcutil <PID>と、JVMの若い世代(E、Edenのように)と古い(O)世代がどれだけいっぱいであるかを確認できます(最初は古い世代を見る必要があります)。またはjstat -gc <PID>、を使用して、パーセンテージの代わりに値を取得します(C列は容量、つまり最大値であり、U列は実際の使用量です)。Solrのワーキングセットに加えて、リクエストを処理するために必要なもののために十分なメモリが必要です。その情報を使用して、必要なものをもう少し細かく調整できます。

于 2012-09-17T16:08:10.923 に答える
0

コードでメモリリークが発生しているようです。メモリを消費しているオブジェクトを確認するには、ヒープ ダンプが必要になる場合があります。

(また)

ブライアンが言ったように、より少ないメモリ構成で tomcat を起動している可能性があります。-Xms および -Xmx コマンドを使用して、Tomcat に割り当てたメモリ量を確認します。

于 2012-09-17T14:12:59.683 に答える