针对大型静态索引的性能调整?

时间:2017-11-20 14:55:47

标签: elasticsearch

我们的数据集如下:

  • 大约800万份文件。我们预计不会发生大的变化。从长远来看,最多只有1000万。
  • 主分片的150GB存储空间
  • 群集:5个数据节点,16GB专用于ES,8个核心和SSD
  • 25个碎片,2个复制品

文档经常每天更新一次。

查询非常简单:主要是geo和term(s)过滤器。 对于ES标准,请求的数据集非常大(每次搜索请求100到1000个文档)。

请求时间比预期慢,大多数请求的时间超过200毫秒。 监控工具显示节点完全正常:

elasticsearch's cluster monitoring

节点配置是标准配置。我们只将bootstrap.memory_lock: true添加到默认设置。

为了加快搜索速度,首先要做的是什么?索引时间不是问题。如果更快的搜索意味着索引时间更慢,那么一切都很好。

我的第一个猜测是玩碎片的数量?还有什么?

2 个答案:

答案 0 :(得分:1)

我会采取以下措施来缩小/排除问题的可能原因:

  1. 收集更多主机/ JVM的统计信息,例如: GC活动,IO统计等,以查看是否有任何可疑之处。
  2. 在没有摄取运行的情况下进行测试,以将索引排除为可能影响性能的因素。如果有帮助 - 调整索引以减少群集的总体负载,请参阅indexing optimization
  3. 尝试较小的结果集,例如10,根据我使用较大结果集的经验可能会增加明显的延迟。
  4. 请尝试Profile API了解时间花费的位置,这可能有助于查明可以优化的查询中有问题的部分。
  5. 请查看search optimization以获取一般搜索性能调整建议。

答案 1 :(得分:1)

快速计算:800万个文档可以创建150GB的数据(主分片),因此平均文档大小约为19KB?如果你在最糟糕的情况下得到1000,那就是19MB。我有点惊讶它只需要200ms ......

200ms是结果集中took的时间还是已经在客户端上了?无论如何,看看查询对10个结果需要多长时间会很有趣。我想知道你是否真的需要很快的结果。

是的,你的分片数量有点高(10可能更好,甚至可能是5),但你需要测试实际产生的差异。