我在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;问题在这里。
答案 0 :(得分:0)
尝试将-Xmx15380m设置为2-4 gb,即-Xmx2048m