【问题标题】:Elasticsearch: High CPU usage by Lucene Merge ThreadElasticsearch:Lucene 合并线程的高 CPU 使用率
【发布时间】:2016-11-23 23:34:38
【问题描述】:

我有一个 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 合并线程”。我还注意到每个分片的段数一直在 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 应该没问题

最好的方法是什么?

谢谢!

【问题讨论】:

  • 您多久索引一次文档?输出与批量队列相关的值的 ESRejectedExecutionExceptions 通常意味着您正在使用批量请求使集群超载。
  • 你有多少个副本?在任何时间点有多少分片是可写的?你的散装尺寸是多少?你知道你的平均批量请求有多大吗?每个批量插入平均需要多长时间(毫秒)?当您查看 /_cat/threadpool?h=bulk*&v 时,批量请求是散布在集群中,还是会攻击一些选定的节点?您是否增加了索引缓冲区的大小?您是否考虑过将 translog 持久性设置为异步?您是否禁用了_all?您是否允许动态映射?
  • 你还在使用ssds还是spindles?你有多少个合并线程?
  • 如果我不得不猜测,根据您的描述,translog 持久性和索引缓冲区大小可能会给您带来最大的收益。但上述所有问题都是相关的,很容易因为分片太少或合并线程设置太高
  • Evanv,我在 OP 中添加了您的问题的答案。我会尝试设置 index.translog.durability: async 和 indices.memory.index_buffer_size: 70%。

标签: elasticsearch lucene


【解决方案1】:

以下是我对集群进行的优化以提高索引吞吐量:

  • 将 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)

希望这对其他人有所帮助

【讨论】:

    【解决方案2】:

    我已经运行过类似的工作负载,您最好的办法是运行每小时索引并在旧索引上运行优化,以检查段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      相关资源
      最近更新 更多