ElasticSearchでjava.lang.OutOfMemoryErrorのエラーが出た対応

ElasticSearchで java.lang.OutOfMemoryError のエラーが出た対応です。

検証のため、メモリ4Gのサーバーに72MのデータをBulkでアップデートした際にでたエラーの対応履歴となります。

OSはCentOS7系です。

実際に行ったのは以下のURLにある設定でマッピングまでを行いました。
https://developer-collaboration.com/2018/08/12/elasticsearch-6-2/

 

上記までは問題なく実行を行い、大きめのファイルのbulkでのアップデートを行った際に、クライアント側は以下のエラーとなりました。

 

サーバー側では以下のログが出ています。

 

気になるのは以下の行。

そこで諸々対応してみました。

 

JVMのヒープサイズの最大値と最小値を変更

Java関連のエラーということで設定の変更を実施します。

公式ドキュメントでは以下となります。
https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html

以下の記述があるので物理メモリの2GBに設定をします。

Set Xmx to no more than 50% of your physical RAM, to ensure that there is enough physical RAM left for kernel file system caches.

 

topコマンドなどで確認すると常に2Gのメモリが割り当てられるようになりました。(デフォルトは1G)

こちらで実施した結果も、前よりも長くは接続ができましたが結局同じエラーで終了してしまいました。

 

/etc/elasticsearch/elasticsearch.ymlの設定をする

設定ファイルと言えば上記ファイルなので変更をしてみます。

同じような事例か以下にありましたので設定を変更してみます。

 EC2に立てたElasticsearchクラスタの設定を見直してみた(何度も落ちるので・・・)

 

設定を入れたのは以下の2つです。(リンクのものは一部設定で起動しなかったので)

https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration-memory.html

こちら設定実施後も状況は変わらずでした。

今回は登録系なので field data cache は該当しなかったということでしょうか。

SortやAggregation(集計) で OutOfMemoryError だと有効そうですが。

 

★ Elasticsearchへのクエリが突然Failし始めた時の対処(fielddata cacheがデフォルト無限で泣いた話)
★ ElasticSearchのfield data cacheについて

 

システム系の設定の見直し

公式ドキュメントではシステム系の設定についても記載あるので変更してみました。

https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html

結果的に設定しましたが状況変わりませんでした。

 

結論として

色々試しましたが、JVMのヒープサイズを3Gに変更したらアップができました。

身もふたもないですがメモリをあげるしかないようでした。

バルク自体がかなりメモリを使うようですので、あまり大きなサイズのアップは危険ということがわかりました。

もともとbulkで試すのに推奨されるのが5M – 15Mのようでしたのでファイル的に大きすぎたというコトで。

https://www.elastic.co/guide/en/elasticsearch/guide/current/bulk.html