GAE/Jをお使いの方なら、アプリの初期化にかなりの時間が掛かることにお気付きかと思います。Googleの説明資料などによると、初回アクセス時だけでなく、AppServerにアプリのランタイムがキャッシュされていない場合にも、初期化が必要なようです。

 cbnanashi@GAEではServletFilterのinitメソッドでログ出力をしているため、ランタイムの初期化時のログを抽出できるのですが、初期化時の1リクエストで8,000〜20,000ms(cpu_msでは10,000〜15,000)ほど掛かっているようです。

 これだけ待たされると、たまたま初期化に当たったユーザーは相当なストレスになると思います。また、初期化中のランタイムに対して転送された後続のリクエストは、次のようなエラーになってしまうようです。

Request was aborted after waiting too long to attempt to service your request.

 ちなみにローカルの開発環境では1秒以下で起動しています。

 単純なアプリをGAE/Jに公開したときには、起動にはそれほど時間が掛からなかった記憶があります。そこで、アプリケーションのサイズによって影響があるのかと思い、調べてみました。Servletが1個だけのアプリと、それに各種jarを5MBほど追加したアプリを作り、比べてみたところ、初期化の時間に大きな差はありませんでした。

 設定ファイルを読んだりといったJavaの処理で時間がかかっているようです(cpu_msが高い値ですので当然ですね)。サイズが影響しているなら、不要なクラスを削るなどしてダイエットすれば起動が高速化されるかと思ったのですが。

 cbnanashi@GAEは単純なアプリですのでフレームワークと呼べるものはStrutsしか使っていません。それでいてこれだけ遅いと、重量級のフレームワークでは30秒以内に初期化が終わらないということも、あり得るのではないでしょうか。

 Google App Engine向けのフレームワークとしては、起動時にすべての設定を読み込んで初期化するのではなく、動的にリクエストごとに必要な設定を収集したり、もしくは静的にクラスファイルに設定を書いておいたり(ソースファイルを生成しておく)、といったものが適しているのかもしれません。

 もしくは、簡単なアプリケーションなら、Servlet/JSPだけで記述してしまうのもひとつの手ではないかと思います。