読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

Kibanaの運用で注意すること

Elasticsearch Kibana

概要

Kibanaをログ可視化&検索として扱う上でいくつかの問題が生じたので、その時の対処方法をまとめます。
ログ可視化という用途であればレスポンス速度などの優先度は下げられるため、以下の対応が可能になります。

環境

  • Ubuntu 14.04
  • Elasticsearch 2.1.1
  • Kibana 4.3.1

問題1:OutOfMemoryErrorが出る

field data cacheのサイズを絞る

SortやAggregation(集計)を高速に行うために、各fieldのデータをメモリに載せていますがデフォルトだと無制限に載るため調整します。

/etc/elasticsearch/elasticsearch.yml

indices.fielddata.cache.size: 75%

※ 下記のdoc_valuesを使うのであれば設定は不要です


doc_valuesを使う

キャッシュの際メモリは使わず、ディスクに保持します。mappingで各フィールドに"doc_values": trueを設定します。
※ Elasticsearch2.xからは自動でtrueになるため設定は不要です

PUT /music/_mapping/song
{
  "properties" : {
    "tag": {
      "type":       "string",
      "index" :     "not_analyzed",
      "doc_values": true 
    }
  }
}

ダッシュボードの要素を減らす

特に1画面にまとめる必要がなければ、複数のダッシュボードに分けることでクエリを分散させましょう。


メモリを増やす

/etc/default/elasticsearch

ES_HEAP_SIZE=8g

出来る限り使用可能なメモリを増やしましょう。あまり増やすとGCで"Stop the world"が起きますが、用途がログ用なので許容できます。

それでもダメならハードウェアで解決しましょう


問題2:データの容量が足りない

インデックスの圧縮設定を変更する

デフォルトのLZ4圧縮よりは低速になりますが、圧縮率の高いbest_compressionを利用します。

/etc/elasticsearch/elasticsearch.yml

index.code: best_compression

古いインデックスを定期的に削除

可視化やログ調査に必要な分のみ残し、古いインデックスを定期的に削除します。
削除方法は以下を参考にしてください。

CuratorでElasticsearchのインデックスを削除


mappingを最適化する

  • templateで全てtypeを指定する。
  • 全フィールドを保持する必要がないのであれば"dynamic": falseで追加しないように。
  • status codebody sizeといった数値でも問題ないものは"type": "integer"に。
  • pathmethodなど完全一致で良いものは"index": "not_analyzed"に。

ストレージ容量を増やす

それでもダメならハードウェアで解決しましょう


問題3:登録される docs が少ない

Thread Poolのサイズを変更する

Elasticsearch はthreadpoolの閾値を超えたキューを破棄する設定となっています。
なのでキューサイズを無制限にします。

/etc/elasticsearch/elasticsearch.yml

threadpool.index.queue_size: -1
threadpool.bulk.queue_size: -1

登録するログを絞る

そもそも設計としてそのログが必要かどうかを考えます。
不要であればディスク容量も削減できるし一石二鳥です。

問題4:気づいたらプロセスが落ちてる

Kibanaのメモリを制限

問題1に近いですが、elasticsearch.logkibana.logには何も出力されず落ちていることがありました。
syslogを見てみると以下のようにプロセスがkillされてました。

Jan 29 02:34:24 ip-10-74-211-114 kernel: [67140.516206] Out of memory: Kill process 1676 (java) score 591 or sacrifice child
Jan 29 02:34:24 ip-10-74-211-114 kernel: [67140.519793] Killed process 1676 (java) total-vm:4622048kB, anon-rss:2369012kB, file-rss:21368kB

これはKibanaが4.2.x以降、nodeのV8エンジンが実行環境のメモリ上限を考慮せず、設定値のメモリ上限(1.5GB)までフルに使ってしまい、メモリが枯渇して起きた現象でした。
elasticsearch側でなく、kibana側が原因のメモリ枯渇です。

対応としてはNODE_OPTIONSという環境変数を指定して、1.5Gまで使う前にGCさせることです。

NODE_OPTIONS="--max-old-space-size=250" bin/kibana

ソース