Elasticsearchパフォーマンスの5つの基本

概要

フランスで行われたElasticのMeetupの動画がYoutubeにあがっていました。

www.youtube.com

公式だと、こちらのページで紹介されています。

www.elastic.co

フランスで行われているとはいえ、発表は英語でされています。
しかも、Youtubeなので自動字幕に翻訳機能をかませれば、日本語字幕を表示させて何となく話していることが分かるようにもなります。

せっかく視聴したので、メモをとったログをここに置いておくことにします。

OS編

ストレージ

パフォーマンスに関するところで基本のキ。

  • ディスクのパフォーマンスのベースラインを取得しておく(スループット、レイテンシ)
  • ベースラインを他のノードと比較してみることで、問題が分かることがある
  • ネットワークのファイルシステムは使わないで。(ストレージの仮想化も含みます)

ディスクパフォーマンスチューニングについて。

  • できることなら、SSDを使おう
  • HDDの方なら、index.merge.scheduler.max_thread.countを1に。SSDならデフォルト値でおk
  • RAIDを組むのであれば、RAID 0 (ストライピング)で最大パフォーマンスが出る

メモリ

  • ファイルシステムのキャッシュはElasticsearchにとって重要である。(可能であれば、メモリの半分以上をFSキャッシュにあてるのを推奨)
  • スワッピングが起きるのを計測する
  • OSのメモリだけでなく、JVMもモニタリングする必要がある

CPU

  • CPUも他のメトリクスと比較する必要があるため計測する必要がある。

    • GC
    • Thread pools
    • Index throttle time
    • ES performance metrics
  • CGroup throttlingのモニタリングも忘れないでください

JVM

Heapは大きすぎても、小さすぎてもダメ!

小さすぎると・・・

  • OutOfMemoryがおきる可能性がある
  • 短い間隔でメモリに負荷がかかり、スパイクがおきる
  • 頻繁な小さなGCによる停止(Elasticsearch自体のスループットの低下)
  • 使用できるIndexバッファやキャッシュが減る
  • Aggregationのパフォーマンスリミットに良くない影響が起きるかもしれない

大きすぎると・・・

  • GCの間隔がのびる(そのため1回あたりのGCによる停止が増える)

Cluster State

以下を確認してみよう。

GET /_cluster/state

アプリケーション

Elasticsearch自体のパフォーマンスについて。

Kibanaのモニタリングの画面で、Elasticsearchのクラスタ状況が確認できる。

  • クエリに対するキャッシュがあれば検索のレイテンシは小さい(が、ここではどんなクエリがキャッシュされるのか、されないのかについては触れない)
  • 負荷が高まって受け付けられない状態になると、リクエストはReject(拒否)される
  • リクエストを処理するのに使うバッファも、HeapSizeから取得するので、Heapメモリ大事

Logging

  • ログにはさまざまな情報が含まれている。
  • パフォーマンスを分析するには、時系列のグラフを確認するのが良い。(変化を確認することができるから)
  • OSの層からアプリケーションの層まで、いろんな観点で見られるようなモニタリングのツールがあると便利(Elastic APM

最後に

Finally, We're hiring...