🐱

AutoScalingでスケールされたWebアプリケーションサーバー(Tomcat)が起動直後にリクエスト処理時間が長くなる事象について

2023/03/24に公開

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-warmup

JVM JITコンパイラの仕組み
https://qiita.com/kinshotomoya/items/c66954aee31f06db99a0

対応方法

ユーザーからのリクエストを受け付ける前に暖気用のリクエストを投げてセルフ暖気させるパターンが多いようです。CodeDeployであればライフサイクルイベントに組み込めば実現できそうです

JVMアプリの暖機運転の導入と効果
https://developers.microad.co.jp/entry/2021/11/29/120000

後書き

色々な観点で調査を進めていましたが、JVMの初回実行時のコンパイルについて知っていたらもっと早く見つけられたなという内容でした。どなたかの役に立てば幸いです

Discussion