【问题标题】:How to load entire Solr index into memory to increase performance?如何将整个 Solr 索引加载到内存中以提高性能?
【发布时间】:2019-06-17 22:15:50
【问题描述】:

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

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

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

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

提前致谢

【问题讨论】:

  • 如果索引不能保存在 RAM 中(..来自您的内存不足消息),您希望它如何工作?
  • 我现在将内存从 Xms512m-Xmx512m 增加到 Xms3g-Xmx3g。我正在寻找更好的缓存选项而不是 solr.RAMDirectoryFactory 设置
  • 首先查看 Solr 管理页面下的缓存利用率 - 如果命中率非常低,您可能需要增加缓存大小。查询的格式和过滤器也会影响缓存的使用方式。

标签: caching indexing solr lucene solr4


【解决方案1】:

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

假设操作系统需要 512M 的 RAM,而您的 Solr Heap 是 512M - 那么 Lucene 还剩下 7GB。如果您是 Solr 和 Lucene 的新手,this 是关于 Lucene 内存工作原理的精彩读物。

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

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

Solr 和 Lucene 以及您的实例中有很多旋钮和按钮需要调整以帮助确保您的整个索引都在内存中。即便如此,请记住,Java GC、CPU 速度、内存速度以及将索引预热到内存中都会显着影响响应时间。

要了解更多信息,请参阅

【讨论】:

  • Solr 和 Lucene 不会在相同的 JVM 约束下运行,因此分配的内存将来自同一个池,而不管库的哪个部分正在运行?如果您谈论的是内存映射文件,则它是在操作系统级别处理的,而不是特定于 Lucene 的(如果需要,您还可以在这种情况下将索引文件预加载到操作系统文件级别缓存中)。
  • 是的,但是当大多数人想到“将索引保存在内存中”时 - 它是堆外内存。
  • 我不认为,关闭交换是一个好主意:内存中有一些数据部分很少使用,例如某些特定的操作系统缓存或其他睡眠守护进程。对于不需要的进程,交换是正确的地方。如果没有可用的交换空间,所有那些未使用的、休眠的进程将阻塞 RAM 空间而不是交换空间。
猜你喜欢
  • 2012-03-31
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2013-03-18
  • 2011-09-17
  • 1970-01-01
  • 2013-12-01
  • 2014-06-10
相关资源
最近更新 更多