如何将整个Solr索引加载到内存中以提高性能?

时间:2019-01-24 08:26:00

标签: caching indexing solr lucene solr4

我的网站每秒获得10-30次点击(包括漫游器抓取)。我在Solr中索引了600万条记录(从mysql表中)。当我使用q=somethingsort=random_检索30条记录时,Solr需要200到300毫秒来响应,有时是100毫秒。

我尝试使用solr.RAMDirectoryFactory设置来改进检索,但是出现了内存不足错误。我知道solr.RAMDirectoryFactory设置不是持久性的。因此,这是增加缓存并将整个索引加载到内存中的最佳选择。

我正在使用Digital Ocean 8GB服务器作为Solr。

Solr设置..

 <filterCache class="solr.FastLRUCache"
                 size="512"
                 initialSize="512"
                 autowarmCount="0"/>

 <queryResultCache class="solr.LRUCache"
                     size="512"
                     initialSize="512"
                     autowarmCount="0"/>

<documentCache class="solr.LRUCache"
                   size="512"
                   initialSize="512"
                   autowarmCount="0"/>

Solr版本:

solr-spec 7.2.1
solr-impl 7.2.1 b2b6438b37073bee1fca40374e85bf91aa457c0b - ubuntu - 2018-01-10 00:54:21
lucene-spec 7.2.1
lucene-impl 7.2.1 b2b6438b37073bee1fca40374e85bf91aa457c0b - ubuntu - 2018-01

参数:

-DSTOP.KEY=solrrocks-DSTOP.PORT=7983-Djetty.home=/opt/solr/server-Djetty.port=8983-Dlog4j.configuration=file:/var/solr/log4j.properties-Dsolr.data.home=-Dsolr.default.confdir=/opt/solr/server/solr/configsets/_default/conf-Dsolr.install.dir=/opt/solr-Dsolr.jetty.https.port=8983-Dsolr.log.dir=/var/solr/logs-Dsolr.log.muteconsole-Dsolr.solr.home=/var/solr/data-Duser.timezone=UTC-XX:+CMSParallelRemarkEnabled-XX:+CMSScavengeBeforeRemark-XX:+ParallelRefProcEnabled-XX:+PrintGCApplicationStoppedTime-XX:+PrintGCDateStamps-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC-XX:+PrintTenuringDistribution-XX:+UseCMSInitiatingOccupancyOnly-XX:+UseConcMarkSweepGC-XX:+UseGCLogFileRotation-XX:+UseParNewGC-XX:-OmitStackTraceInFastThrow-XX:CMSInitiatingOccupancyFraction=50-XX:CMSMaxAbortablePrecleanTime=6000-XX:ConcGCThreads=4-XX:GCLogFileSize=20M-XX:MaxTenuringThreshold=8-XX:NewRatio=3-XX:NumberOfGCLogFiles=9-XX:OnOutOfMemoryError=/opt/solr/bin/oom_solr.sh 8983 /var/solr/logs-XX:ParallelGCThreads=4-XX:PretenureSizeThreshold=64m-XX:SurvivorRatio=4-XX:TargetSurvivorRatio=90-Xloggc:/var/solr/logs/solr_gc.log-Xms512m-Xmx512m-Xss256k-verbose:gc

预先感谢

1 个答案:

答案 0 :(得分:0)

重要的是要记住,在8GB服务器和Solr Heap设置为512M的情况下,Lucene(不是Solr!)将使用计算机上的其余可用内存(减去操作系统需要的内存等)

例如,假设操作系统需要512M的RAM,而您的Solr Heap是512M的内存,那么Lucene还剩下7GB。如果您是Solr和Lucene的新手,那么this可以很好地了解Lucene的内存工作原理。

您的索引有多大?您可以使用/solr/data检查du -h文件夹。

要弄清 增加 ,Solr Heap将使情况变得更糟(对Lucene的内存将更少)。为了避免将RAM交换到磁盘,您还需要关闭交换(例如,参见this)。

Solr和Lucene中有很多旋钮和按钮,您的实例需要进行调整以帮助确保整个索引都在内存中。即使这样,也要记住,诸如Java GC,CPU速度,内存速度以及将索引预热到内存之类的东西将显着影响响应时间。

要了解更多信息,请参见