SOLR 4.1 Out of Memory错误提交了几千个Solr Docs

时间:2013-01-25 11:00:50

标签: tomcat7 java-7 solr4

我们正在使用以下选项测试在tomcat 7和java 7中运行的solr 4.1

JAVA_OPTS =“ - Xms256m -Xmx2048m -XX:MaxPermSize = 1024m -XX:+ UseConcMarkSweepGC -XX:+ CMSIncrementalMode -XX:+ ParallelRefProcEnabled -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath = / home / ubuntu / OOM_HeapDump”

我们的源代码如下所示:

/**** START *****/
int noOfSolrDocumentsInBatch = 0;
for(int i=0 ; i<5000 ; i++) {
    SolrInputDocument solrInputDocument = getNextSolrInputDocument();
    server.add(solrInputDocument);
    noOfSolrDocumentsInBatch += 1;
    if(noOfSolrDocumentsInBatch == 10) {
        server.commit();
        noOfSolrDocumentsInBatch = 0;
    }
}
/**** END *****/

方法“getNextSolrInputDocument()”生成一个包含100个字段(平均值)的solr文档。大约50个字段是“text_general”类型。     一些“test_general”字段由大约1000个单词组成,其余由几个单词组成。总字段数大约为35-40个多值字段(不是“text_general”类型)。

我们正在索引所有字段,但只存储8个字段。在这8个字段中,两个是字符串类型,五个是长的,一个是布尔值。所以我们的索引大小只有394 MB。但OOM时占用的RAM约为2.5 GB。为什么即使索引大小很小,内存也是如此之高?     什么存储在内存中?我们的理解是,每次提交文档都刷新到磁盘后。提交后,RAM中不应该保留任何内容。

我们使用以下设置:

server.commit() set waitForSearcher=true and waitForFlush=true
solrConfig.xml has following properties set:
directoryFactory = solr.MMapDirectoryFactory
maxWarmingSearchers = 1
text_general data type is being used as supplied in the schema.xml with the solr setup.
maxIndexingThreads = 8(default)
<autoCommit>
    <maxTime>15000</maxTime>
    <openSearcher>false</openSearcher>
</autoCommit>

我们在提交3990个solr文件后得到Java堆Out of Memory Error。来自profiler的内存转储的一些快照上传到以下链接。
http://s9.postimage.org/w7589t9e7/memorydump1.png
http://s7.postimage.org/p3abs6nuj/memorydump2.png

有人可以建议我们应该做些什么来减少/优化我们的情况下的内存消耗?还建议了什么应该是solrConfig.xml的参数的最佳值和原因

         - useColdSearcher - 是/否?
         - maxwarmingsearchers-数量      - 拼写检查开/关?
         - omitNorms = true / false?
         - omitTermFreqAndPositions?
         - mergefactor?我们使用默认值10
         - java垃圾收集调整参数?

0 个答案:

没有答案