为什么在 Elasticsearch 中以昂贵的 CPU 方式合并段?

why merging of segments in costly CPU-wise in Elasticsearch?

我看到每次遇到ES高CPU的问题,总是Lucene Merge Thread。

据我了解,段已经排序,因此您每次只是合并两个排序的段,就像合并排序的合并过程一样。为什么合并会如此昂贵。还是我遗漏了什么?

合并过程在 IO 上成本高的原因有几个,CPU:

  1. Lucene 使用 Skip list 数据结构,它们的合并成本很高,有一篇关于 Skip list merge here.
  2. 的好文章
  3. 两个并行合并可以同时发生。
  4. Lucene 将需要创建第三个段并合并两个段,因此您将需要足够的 space。

有一篇关于段合并的好博客 post here