ElasticsearchのCircuit Breaker

(2017-02-24)

ElasticsearchをDockerで動かしてGrafanaで可視化する - sambaiz.net

ESに送られるデータの量が増えてくるとGrafanaのDashboardにグラフが表示されなくなってしまった。 表示されたエラーはこういうの。

"root_cause": [
    {
        "type": "circuit_breaking_exception",
        "reason": "[request] Data too large, data for [] would be larger than limit of [8998512230/8.3gb]",
        "bytes_wanted": 10464007168,
        "bytes_limit": 8998512230
    }
],

これは1リクエストの集計などで使うメモリ量がしきい値をこえて Circuit Breakerが発動したということ。 メモリを食いつぶしてOutOfMemoryになる前に焼き切れるようになっている。

情報はstatsのapiでも取得できる。

$ curl localhost:9200/_nodes/stats | jq .nodes[].breakers.request
{
  "limit_size_in_bytes": 8998512230,
  "limit_size": "8.3gb",
  "estimated_size_in_bytes": 10348347504,
  "estimated_size": "9.6gb",
  "overhead": 1,
  "tripped": 470
}

今回ひっかかったのはindices.breaker.request.limit。デフォルトではJVMのヒープメモリの60%になっているが、 これを80%にまで緩和する。併せてparent-levelのbreakerも上げる。

$ curl -XPUT localhost:9200/_cluster/settings -d '{
    "persistent" : {
        "indices.breaker.request.limit": "80%",
        "indices.breaker.total.limit": "80%"
    }
}'
$ curl -XPUT localhost:9200/_cluster/settings -d '{
    "persistent" : {
        "indices.breaker.request.limit": "80%",
        "indices.breaker.total.limit": "80%"
    }
}'

必要なメモリ量を上回ったのでひとまずは返せるようになった。 これは一時しのぎで、定常的に大量にメモリが必要なリクエストを処理する必要があるなら、そもそもメモリが足りないので増やさなければならない。

$ curl localhost:9200/_nodes/stats | jq .nodes[].breakers.request
{
  "limit_size_in_bytes": 11998016307,
  "limit_size": "11.1gb",
  "estimated_size_in_bytes": 10473078896,
  "estimated_size": "9.7gb",
  "overhead": 1,
  "tripped": 470
}