gpt4 book ai didi

Elasticsearch:Lucene Merge Thread 的高 CPU 使用率

转载 作者:行者123 更新时间:2023-11-29 02:52:23 32 4
gpt4 key购买 nike

我有一个 ES 2.4.1 集群,有 3 个主节点和 18 个数据节点,它收集日志数据,每天创建一个新索引。索引大小在一天内增长到大约 2TB。超过 7 天的索引将被删除。集群上执行的搜索很少,因此主要目标是提高索引吞吐量。

我看到了很多以下异常,这是我接下来要说的另一个症状:

EsRejectedExecutionException[rejected execution of org.elasticsearch.transport.TransportService$4@5a7d8a24 on EsThreadPoolExecutor[bulk, queue capacity = 50, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@5f9ef44f[Running, pool size = 8, active threads = 8, queued tasks = 50, completed tasks = 68888704]]];]];

集群中的节点不断地占用 CPU。我将索引刷新间隔增加到 30 秒,但收效甚微。当我检查热线程时,我看到每个节点使用 100% CPU 有多个“Lucene Merge Thread”。我还注意到每个分片的段数一直在 1000 左右,这看起来很多。以下是分割统计信息的示例:

"_2zo5": {
"generation": 139541,
"num_docs": 5206661,
"deleted_docs": 123023,
"size_in_bytes": 5423948035,
"memory_in_bytes": 7393758,
"committed": true,
"search": true,
"version": "5.5.2",
"compound": false
}

极高的“生成”数量让我担心,我想优化段创建和合并以减少节点上的 CPU 负载。

关于索引和集群配置的详细信息:

  • 每个节点都是一个 i2.2xl AWS 实例,具有 8 个 CPU 内核和 1.6T SSD 驱动器
  • 文档由 6 个批量大小为 1000 的客户端线程不断索引
  • 每个索引有 30 个分片和 1 个副本
  • 每批 1000 份文档大约需要 25 秒
  • /_cat/thread_pool?h=bulk*&v 显示 bulk.completed 在节点间均匀分布
  • 索引缓冲区大小和事务持久性保持默认
  • _all 已禁用,但动态映射已启用
  • 合并线程的数量保留为默认值,考虑到我使用的是 SSD,这应该没问题

最好的方法是什么?

谢谢!

最佳答案

以下是我为提高索引吞吐量对集群所做的优化:

  • 将 threadpool.bulk.queue_size 增加到 500,因为索引请求经常使队列过载
  • 增加了磁盘水印,因为默认设置对于我们使用的大型 SSD 来说过于激进。我设置了 "cluster.routing.allocation.disk.watermark.low": "100gb"和 "cluster.routing.allocation.disk.watermark.high": "10gb"
  • 删除未使用的索引以释放 ES 用于管理其分片的资源
  • 将主分片数量增加到 175 个,目标是将分片大小保持在 50GB 以下,并且每个处理器大约有一个分片
  • 将客户端索引批量大小设置为 10MB,这对我们来说似乎很有效,因为索引文档的大小差异很大(从 KB 到 MB)

希望这对其他人有帮助

关于Elasticsearch:Lucene Merge Thread 的高 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40775887/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com