【问题标题】:Elasticsearch Indexing Speed Degrade with the TimeElasticsearch 索引速度随时间下降
【发布时间】:2026-01-24 18:55:02
【问题描述】:

我正在为我的项目进行弹性搜索的一些性能调整,我需要一些帮助来提高弹性搜索索引速度。我正在使用 ES 5.1.1,并且我设置了 2 个节点,其中包含 8 个分片作为索引。我有 2 个节点的服务器,16GB RAM 和 12 个 CPU,每个服务器分配 2.2GHz 时钟速度。我需要在 1.5 小时内索引大约 25,000,000 个文档,而我目前大约需要 4 小时。我已完成以下配置更改以缩短索引时间。

  • 将“indices.store.throttle.type”设置为“无”
  • 将“refresh_interval”设置为“-1”
  • 将“translog.flush_threshold_size”增加到 1GB
  • 将“number_of_replicas”设置为“0”
  • 为索引使用 8 个分片
  • 设置 VM 选项 -Xms8g -Xmx8g(RAM 大小的一半)

我正在使用批量处理器在我的 java 应用程序中生成文档,并且我正在使用以下配置来设置批量处理器。

批量操作数:10000
以 MB 为单位的批量大小:100
并发请求:100
刷新间隔:30

最初我可以在第一分钟索引 356167 左右。但随着时间的推移,它会减少,大约 1 小时后,每分钟大约 121280 个文档。

如何在一段时间内保持索引率稳定?有没有其他方法可以提高性能?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我强烈建议不要更改配置参数,例如 translog 刷新大小、限制,除非您知道自己在做什么(这并不意味着阅读互联网上的一些博客文章 :-)

    尝试每台服务器使用单个分片,尤其是将批量大小减少到 10MB 左右。 100MB * 100 个并发请求意味着您需要 10GB 的堆来处理这些请求(不做任何其他事情)。我想并不是所有的文档都被索引,因为你在线程池中拒绝了任务。

    从小做大,而不是从大做起,但对索引没有任何洞察力。

    【讨论】:

    • 嗨@alr,非常感谢您对此的想法。我同意你的观点。实际上,我从单个分片和默认配置开始。通过使用上述配置,我可以大大减少时间。此外,在我之前使用自定义 ID 的情况下,我可以通过使用自动生成的 ID 来减少大量时间。我用上述配置多次测试索引,但没有得到 EsRejectedExecutionException。那么这不意味着我所有的对象都被索引了吗?再次感谢您。