ElasticSearch(OpenSearch)が重いときはrefresh_intervalを長くしてパフォーマンスチューニングする
背景
ElasticSearch(OpenSearch)に大量のデータをBulkで登録していました。登録処理自体に問題はないのですが、登録処理中に検索のリクエストを投げてもレスポンスが1分以上かかってしまう現象が発生してしまっていました。
大量のデータを登録するなよって話なのですが、、、何か改善する方法はないかと試行錯誤して、refresh_intervalを変更することで遅延をほぼなくすことができました。
refresh_intervalを長くする
refresh_intervalは更新間隔の設定です。僕がElasticSearch(OpenSearch)をガチャガチャいじってた当時(2022年4月ごろ)は、デフォルトで1sになってました。この値を大きくすることでパフォーマンスを向上させることができます。AWSのドキュメントでは60s以上することがソリューションとして挙げられていました。
即時反映が求められないのであれば、refresh_intervalを長く設定してみるとパフォーマンスが向上するかもしれません。
refresh_interval を 60 秒以上に増やす
ちなみにrefresh_intervalを-1に設定すると更新が行われないようになるようです(その場合、後述のRefresh APIで更新を反映させます)。
またデータの更新後、手動でrefreshさせたい、という場合はPOSTでRefresh APIを呼び出せばOKです。
ただし、
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