🐱
AutoScalingでスケールされたWebアプリケーションサーバー(Tomcat)が起動直後にリクエスト処理時間が長くなる事象について
Tomcatを使用しているWebアプリケーションサーバーで発生した事象があったので記事にしました
環境
- Tomcatを使用しているWebアプリケーションサーバー
- WebアプリケーションサーバーはAutoscalingでスケールされる
- アプリケーションはCodeDeployによってデプロイされる
発生した事象
- AutoScalingでEC2がスケールアウトされ、ELBに紐づけられた直後に一時的に5XXエラーが発生する
調査した内容
- 発生する5XXエラーは一時的なもので継続しない
- 5XXエラーの内容はELB 504(TimeOut)
- 特定のURLで504が発生しているわけではない(全般的に発生する)
- 504エラーで返していたリクエストは少し経つと200で返すようになる
原因
- JVMの仕様による影響
- JVMは初回実行時にコンパイルが走るため、初回実行時は時間が掛かる
- この影響でELBのアイドルタイムアウトの時間を超えた
ZOZOMATにおけるJVMの暖機運転の導入と改善効果について
https://techblog.zozo.com/entry/zozomat-jvm-warmupJVM JITコンパイラの仕組み
https://qiita.com/kinshotomoya/items/c66954aee31f06db99a0
対応方法
ユーザーからのリクエストを受け付ける前に暖気用のリクエストを投げてセルフ暖気させるパターンが多いようです。CodeDeployであればライフサイクルイベントに組み込めば実現できそうです
JVMアプリの暖機運転の導入と効果
https://developers.microad.co.jp/entry/2021/11/29/120000
後書き
色々な観点で調査を進めていましたが、JVMの初回実行時のコンパイルについて知っていたらもっと早く見つけられたなという内容でした。どなたかの役に立てば幸いです
Discussion