JVMを用いた一般的なJavaは、起動直後はインタプリタのように動作するため、パフォーマンスが出ません。サービスインからすぐにパフォーマンスを出すためには、ウォームアップ(暖機運転)が必須です。Boot+Kubernetesという環境という前提で、その対応方法を紹介します。サンプルコードこちらに置いております。abekoh/spring-warmup-on-k8sアプリケーションについてユーザ登録を行うだけのWebAPIを用意しています。実際にはDB書き込みなどは行わず、標準出力ログとして流れるだけです。}}ウォームアップ処理について本題です。設定まず、ウォームアップが終わってサービスインができるか否かを判別できるように設定を施します。Probeという仕組みがあります。2.3にて追加されました。spring.main.cloud-platform=kubernetesと設定を追記すればOKです。後者だと他にもk8sに関する設定がなされるようなので、サンプルでは後者を選んでいます。k8sのdeployment.yamlは次のように設定します。設定を見直しましょう。ウォームアップの実行ウォームアップとして行うことは単純で、事前にリクエストをたくさん投げておくことです。実装したクラスにその処理を書きます。ApplicationRunnerはアプリケーション起動後、サービスイン前という状態で実行されます。このとき、LivenessProbe=OK、ReadinessProbe=NGという状態になります。Availabilityウォームアップ処理のために事前リクエストを行うにはちょうど良いタイミングです。以下はそのサンプルです。WebFluxのWebClientがMVCでも使えるとのことで、それで実装してみました。}}リクエストを実行する回数はWarmupPropertyというクラスに設定値が入るようにしております。ベンチマーク試しにどれくらいウォームアップによる効果があるのか、ベンチマークを実施してみました。scripts/generate_request.pyにランダムなリクエストを生成できるPythonスクリプトを置き、vegetaを使ってテストしました。/tmp/result.bin対象はreplicas=2として2podsで動くアプリケーションで、1000RPSで60秒間投げてみました。ウォームアップのリクエスト回数別の結果は次のとおりです。242.643行はそれぞれウォームアップのリクエスト数が0回、100回...となります。各セルの単位はミリ秒です。50,90,95,99はそれぞれパーセンタイル値で、例えば「99%のリクエストはこのレスポンスタイムに抑えられる」という値となります。0回とその他では平均値、最大値が大きく異なります。100回と1,000回ではあまり変わらない結果となりました。(むしろ悪化してるところも)10,000回では特に最適化されているように見えます。細かく調整すればより良くなると思いますが、ウォームアップの有用性が確認できました。以下の資料が非常に参考になりました。2.3"のスライドが非常に参考になります。Deckこちらではサイドカーでウォームアップを行う手法が紹介されています。その他の設定についても勉強になります。