概要
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 code
やbody size
といった数値でも問題ないものは"type": "integer"
に。path
やmethod
など完全一致で良いものは"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.log
やkibana.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