【问题标题】:reduce SOLR query time for queries executing right after indexing减少索引后立即执行的查询的 SOLR 查询时间
【发布时间】:2012-02-26 00:25:07
【问题描述】:

我有一个 9 核的 SOLR。 其中一个核心有大约 1 000 000 个文档。 (约 1GB 大小)

在完成向这个核心提交 100 个文档后,我接下来对 SOLR 中所有其他核心的 20 -40 个查询变得非常慢(3 到 8 秒)

我使用数据导入处理程序每​​ 10 分钟添加约 100 个文档,然后提交(不优化)索引。

  1. 有没有办法减少索引后立即执行的查询的查询时间?
  2. 考虑到所有其他内核执行查询的速度很慢,这可能是硬件问题,还是我有很多内核的问题。

平均每秒对所有内核进行 20 次查询。 我使用 Jetty 和 SOLR 我有 mergeFactor = 10

<mergeFactor>10</mergeFactor>

我已经为缓存设置了自动预热计数

<filterCache
    class="solr.FastLRUCache"
    size="1048576"
    initialSize="131072"
    autowarmCount="943718"/>

<documentCache
  class="solr.FastLRUCache" cleanupThread="true"
  size="131072"
  initialSize="117965"
  autowarmCount="117965" />

对于 newSearcher 和 firstSearcher,我有 50 个查询来自动预热新搜索器。

<listener event="newSearcher" class="solr.QuerySenderListener">
  <arr name="queries">
    <str name="q">cake+boss</str><str name="facet">true</str><str name="facet.field">Category</str></lst>
     ...// 50 warm-up queries
  </arr>
</listener>
//the same for firstSearcher 

【问题讨论】:

    标签: solr


    【解决方案1】:

    您正在预热。这是在提交后立即减少查询时间的唯一方法。您可能需要进行预热以在缓存中获取正确的文档/查询/过滤器,但您已经朝着正确的方向前进。

    我的猜测是,由于提交导致的索引翻转,再加上缓存预热,正在消耗你所有的 CPU 和 IO。结果是您的其他核心没有获得足够的资源来快速响应。在提交期间,您的内存使用量将迅速飙升,因为在一段时间内 Solr 中有 2 个索引副本。根据您的内存使用情况,您甚至可以进行交换,这将对查询时间造成难以置信的破坏。

    在提交期间进行一些 CPU 和内存分析。确保你没有交换。查看 CPU 内核是否固定。您很可能需要在这个问题上投入更多的硬件,或者考虑将您的内核分散到不同的机器上,这样它们就不会受到影响。

    【讨论】:

    • 据我了解,当没有足够的内存来为同一个内核提供两个活动搜索器时,就会发生交换。如何仅通过分析内存使用情况来检查我是否正在交换?现在我有 -Xmx 5GB - 这是一个约束还是只有机器内存是一个约束?
    • 我说的是如果您超过物理内存,您的操作系统页面会将内存交换到磁盘。 Vmstat 将显示这一点。但是,如果您正在推动 JVM 堆限制,这也可能会导致问题,因为您的机器将花费大量时间进行垃圾收集。
    • 这里的另一个想法是减少你的 maxWarmingSearchers,如果你的查询量可以的话。请留意有关碰到 maxWarmingSearchers 限制的相关错误。
    猜你喜欢
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2019-07-22
    • 1970-01-01
    相关资源
    最近更新 更多