在为常规搜索请求提供索引时索引云崩溃

时间:2015-01-26 07:33:20

标签: tomcat solrj solrcloud jvm-crash lucene-nrt

我在tomcat7上安装了4.6 solr云,设置了4个分片(每个两个副本)和3个服务器的ZooKeeper集合。

每个solr服务器有8个核心,30Gb的ram,我为solr / tomcat分配15Gb,其余的由操作系统处理

我们有一个约25M文档的集合,索引大小约为15Gb。 虽然solr可以应对每分钟的许多请求,但在大索引之后我得到了

  

线程中的异常" http-bio-8080-Acceptor-0"   java.lang.OutOfMemoryError:无法创建新的本机线程

由tomcat抛出。

使用SolrJ' s CloudSolrServer完成索引,使用多个索引线程(共享CloudSolrServer实例),一次执行5000个文档的批量索引。 该过程包括添加&删除文件。 我们在整个索引结束时只执行一次提交。

此异常从一台服务器开始,但很快就会出现所有其他服务器,并且云无法提供任何请求(在日志中我可以看到它们试图相互查询而没有成功)

请注意,tomcat不会挂起,只会挂起solr进程。 为了让solr云恢复 - 我必须重新启动所有8台服务器(killall ...... service start ..)

以下是我使用的一些配置:

solrconfig.xml中:

<autoCommit>
   <maxDocs>50000</maxDocs>
   <maxTime>${solr.autoCommit.maxTime:100000}</maxTime>
   <openSearcher>false</openSearcher> 
</autoCommit>
   <autoSoftCommit> 
   <maxTime>${solr.autoSoftCommit.maxTime:10000}</maxTime> -->
</autoSoftCommit>

<useColdSearcher>true</useColdSearcher>
<maxWarmingSearchers>4</maxWarmingSearchers>

JVM:

JAVA_OPTS="$JAVA_OPTS -Xmx15380m -Xms15380m -DzkHost=... -XX:NewRatio=1 -XX:SurvivorRatio=4 -XX:TargetSurvivorRatio=80 -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+CMSScavengeBeforeRemark -XX:PretenureSizeThreshold=64m -XX:CMSFullGCsBeforeCompaction=1 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -XX:CMSTriggerPermRatio=80 -XX:CMSMaxAbortablePrecleanTime=6000 -XX:+CMSParallelRemarkEnabled -XX:+ParallelRefProcEnabled -XX:+AggressiveOpts -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:MaxPermSize=512M -XX:PermSize=128M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat7/heapDump.hprof"

我没有看到GC大量使用CPU,大部分是由ParNew完成的,所以没有&#34;停止世界&#34;问题在这里。

  1. 可能是索引过程中的文档会阻塞本机内存吗?
  2. 我应该寻找什么具体的东西来理解错误的原因? (打开连接数/文件数,tomcat参数等)?
  3. 在此处输入图像说明我可以提前识别此类情况,也许可以添加更多服务器(假设这样可以解决问题)?

1 个答案:

答案 0 :(得分:0)

尝试将-Xmx15380m设置为2-4 gb,即-Xmx2048m