繁体   English   中英

Elasticsearch:Lucene Merge Thread的高CPU使用率

[英]Elasticsearch: High CPU usage by Lucene Merge Thread

我有一个带有2个主节点和18个数据节点的ES 2.4.1群集,该群集收集每天创建的新索引的日志数据。 一天之内,索引大小会增长到大约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。 我将索引刷新间隔增加到30s,但是效果不大。 当我检查热线程时,使用100%CPU的每个节点会看到多个“ Lucene合并线程”。 我还注意到,每个分片的段数一直在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,因为索引请求经常使队列超载
  • 增加了磁盘水印,因为对于我们使用的大型固态硬盘,默认设置过于激进。 我设置“ cluster.routing.allocation.disk.watermark.low”:“ 100gb”和“ cluster.routing.allocation.disk.watermark.high”:“ 10gb”
  • 删除未使用的索引以释放ES用于管理其分片的资源
  • 将主分片数量增加到175,目的是使分片大小保持在50GB以下,并且每个处理器具有大约一个分片
  • 将客户端索引批处理大小设置为10MB,这对我们来说似乎非常有效,因为建立索引的文档大小变化很大(从KB到MB)

希望这对别人有帮助

我已经完成了类似的工作量,并且最好的选择是每小时运行一次索引,并对较旧的索引进行优化以保持细分的状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM