【问题标题】:A Range Search Query is causing Garbage Collection in Elastic Search范围搜索查询导致弹性搜索中的垃圾收集
【发布时间】:2017-10-24 05:11:51
【问题描述】:

我有一个包含 16 个节点(13 个数据节点/3 个主节点/24 GB RAM/12 GB 堆)的 Elastic Search 5.2 集群。我正在对查询进行性能测试,并在 Elastic 集群上每秒调用 50 次搜索查询。我的查询如下所示 -

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "cust_id": "AC-90-464690064500"
                    }
                },
                {
                    "range": {
                        "yy_mo_no": {
                            "gt": 201701,
                            "lte": 201710
                        }
                    }
                }
            ]
        }
    }
}

我的索引映射如下-

cust_id      Keyword
smry_amt     Long
yy_mo_no     Integer    // doc_values enabled
mkt_id       Keyword
. . .
. . .
currency_cd  Keyword   // Total 10 field with 8 Keyword type

索引包含 2 亿条记录,对于每个 cust_id,可能有 100 条记录。索引有 2 个副本。记录大小小于 100 字节。

当我运行性能测试 10 分钟时,查询响应和性能似乎很慢。在对 Kibana 监控选项卡中的更多细节进行调查后,似乎发生了很多垃圾收集活动(请参见下图)-

我有几个问题在我脑海中浮现。我对 Range 查询进行了一些研究,但在与我的情况类似的情况下没有发现什么会导致 GC 活动。我还研究了内存使用和 GC 活动,但大多数 Elastic 文档都提到年轻代 GC 在索引时是正常的,而搜索活动主要使用操作系统维护的文件系统缓存。这就是为什么在上面的图表中,由于搜索使用的是文件系统缓存,所以堆的使用并不多。

所以-

  1. 什么可能导致垃圾收集在这里发生?
  2. 图表显示,堆仍可用于 Elastic Search,与可用堆相比,已用堆仍然非常少。那么是什么触发了 GC 呢?
  3. 查询类型是否会导致创建任何内部数据结构被释放,从而导致 GC?
  4. CPU 峰值可能是由于 GC 活动造成的。
  5. 在 Elastic Search 5.5 之前的版本中是否有其他有效的方法来运行 Range 查询?
  6. 分析查询表明 Elastic 正在运行 TermQuery 和 BooleanQuery,后者的成本最高。

知道这里发生了什么吗?

提前致谢,

  • SGSI。

【问题讨论】:

  • 我认为问题与 GC 无关,根据您的图表,您在 1 分钟内有 4 次收集,总持续时间约为 100 毫秒。您能否提供您的 IO 统计信息(磁盘读取和写入)?

标签: elasticsearch garbage-collection range-query


【解决方案1】:

正确答案取决于索引设置,但我猜您使用的是启用了 docValues 的整数类型。该数据结构应该支持聚合和排序,但不支持范围查询。正确的数据类型是range。

如果 DocValues elastic/lucene 迭代所有文档(即全扫描)以匹配范围查询 - 这需要读取和解码 DV 列中的每个值 - 此操作非常昂贵,尤其是当索引不能被操作系统缓存。

【讨论】:

  • 感谢伊万的回复。还有其他几个问题,我必须专注于另一个高优先级的问题,因此延迟回复您。道歉。索引中的数据是按月计费信息的子汇总。这里有几个问题:(1)如何使用范围数据类型来存储按月计算的数据? (2) 现在搜索性能在分片数量加倍(和重新索引)后提高了一倍,我应该禁用 DocValues 吗?是否有望进一步提高搜索率?
  • 分片数量翻倍后,GC 活动减少,CPU 使用率减半,搜索率几乎翻倍。我不知道分片数量(之前 13 个数据节点上的 13 个分片与现在 13 个数据节点上的 26 个分片)和 GC 活动之间的关系是什么,但这就是搜索率提高的原因。
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多