👌

ElasticSearch(OpenSearch)が重いときはrefresh_intervalを長くしてパフォーマンスチューニングする

2022/11/24に公開

背景

ElasticSearch(OpenSearch)に大量のデータをBulkで登録していました。登録処理自体に問題はないのですが、登録処理中に検索のリクエストを投げてもレスポンスが1分以上かかってしまう現象が発生してしまっていました。
大量のデータを登録するなよって話なのですが、、、何か改善する方法はないかと試行錯誤して、refresh_intervalを変更することで遅延をほぼなくすことができました。

refresh_intervalを長くする

refresh_intervalは更新間隔の設定です。僕がElasticSearch(OpenSearch)をガチャガチャいじってた当時(2022年4月ごろ)は、デフォルトで1sになってました。この値を大きくすることでパフォーマンスを向上させることができます。AWSのドキュメントでは60s以上することがソリューションとして挙げられていました。
即時反映が求められないのであれば、refresh_intervalを長く設定してみるとパフォーマンスが向上するかもしれません。

refresh_interval を 60 秒以上に増やす

https://aws.amazon.com/jp/premiumsupport/knowledge-center/opensearch-indexing-performance/

ちなみにrefresh_intervalを-1に設定すると更新が行われないようになるようです(その場合、後述のRefresh APIで更新を反映させます)。

https://opensearch.org/docs/latest/search-plugins/knn/performance-tuning/

またデータの更新後、手動でrefreshさせたい、という場合はPOSTでRefresh APIを呼び出せばOKです。

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-refresh.html

ただし、

Refreshes are resource-intensive. To ensure good cluster performance, we recommend waiting for Elasticsearch’s periodic refresh rather than performing an explicit refresh when possible.

とあるように極力は手動でRefresh APIを呼び出すのは避けて、(refresh_intervalで設定した間隔で実行される)定期的な更新でやったほうが良いようです。

株式会社ゆめみ

Discussion