“[circuit_breaking_exception] [parent]”数据太大,“[<http_request>]”的数据会出错

Rag*_*har 15 node.js elasticsearch

在顺利工作了 10 多个月之后,我在进行简单的搜索查询时突然开始在生产中出现此错误。

{
  "error" : {
    "root_cause" : [
      {
        "type" : "circuit_breaking_exception",
        "reason" : "[parent] Data too large, data for [<http_request>] would be [745522124/710.9mb], which is larger than the limit of [745517875/710.9mb]",
        "bytes_wanted" : 745522124,
        "bytes_limit" : 745517875
      }
    ],
    "type" : "circuit_breaking_exception",
    "reason" : "[parent] Data too large, data for [<http_request>] would be [745522124/710.9mb], which is larger than the limit of [745517875/710.9mb]",
    "bytes_wanted" : 745522124,
    "bytes_limit" : 745517875
  },
  "status" : 503
}
Run Code Online (Sandbox Code Playgroud)

最初,我在执行简单术语查询时遇到此错误,当我收到此circuit_breaking_exception错误时,为了调试此错误,我在 elasticsearch 集群上尝试了 _cat/health 查询,但仍然出现相同的错误,即使是最简单的查询localhost:9200也会给出相同的结果错误 不确定集群突然发生了什么。她是我的断路器状态:

"breakers" : {
        "request" : {
          "limit_size_in_bytes" : 639015321,
          "limit_size" : "609.4mb",
          "estimated_size_in_bytes" : 0,
          "estimated_size" : "0b",
          "overhead" : 1.0,
          "tripped" : 0
        },
        "fielddata" : {
          "limit_size_in_bytes" : 639015321,
          "limit_size" : "609.4mb",
          "estimated_size_in_bytes" : 406826332,
          "estimated_size" : "387.9mb",
          "overhead" : 1.03,
          "tripped" : 0
        },
        "in_flight_requests" : {
          "limit_size_in_bytes" : 1065025536,
          "limit_size" : "1015.6mb",
          "estimated_size_in_bytes" : 560,
          "estimated_size" : "560b",
          "overhead" : 1.0,
          "tripped" : 0
        },
        "accounting" : {
          "limit_size_in_bytes" : 1065025536,
          "limit_size" : "1015.6mb",
          "estimated_size_in_bytes" : 146387859,
          "estimated_size" : "139.6mb",
          "overhead" : 1.0,
          "tripped" : 0
        },
        "parent" : {
          "limit_size_in_bytes" : 745517875,
          "limit_size" : "710.9mb",
          "estimated_size_in_bytes" : 553214751,
          "estimated_size" : "527.5mb",
          "overhead" : 1.0,
          "tripped" : 0
        }
      }
Run Code Online (Sandbox Code Playgroud)

我在Github Issue中发现了一个类似的问题,建议增加断路器内存或禁用它。但我不确定该选择什么。请帮忙!

弹性搜索 6.3 版

Rag*_*har 27

最后经过一些研究,我找到了一个解决方案,即

  1. 我们不应该禁用断路器,因为它可能会导致 OOM 错误并最终可能导致 elasticsearch 崩溃。
  2. 动态增加断路器内存百分比是好的,但它也是一个临时解决方案,因为在解决方案结束后,增加的百分比也可能被填满。
  3. 最后,我们还有第三个选项,即增加整体 JVM 堆大小,默认情况下为 1GB,但建议在生产中应该在 30-32 GB 左右,并且它应该小于可用总内存的 50%。

有关详细信息,请检查此以了解生产环境中 Elasticsearch 的良好 JVM 内存配置,Heap: Sizing and Swapping

  • 这适用于所有版本,但您可以通过标题为堆大小设置的链接导航到最新版本,即 https://www.elastic.co/guide/en/elasticsearch/reference/7.10/important-settings.html#heap-尺寸设置。本文档包含许多其他设置,可以帮助您配置良好的生产级别 es 环境。 (2认同)
  • @RadioControlled,导出 ES_JAVA_OPTS="-Xms2g -Xmx2g",这是在最新版本中设置堆大小的方式。这里的2g就是2GB。请记住,此大小不应超过总可用内存的一半。 (2认同)