手短に:
-App Engine Java SDK は、開発 appserver のサーブレット コンテナとして jetty を使用します。
-Jetty は java.security.SecureRandom に依存しています
-SecureRandom はデフォルトで /dev/random からエントロピーを消費します
- /dev/random は、読み取りに使用できるエントロピーが不十分な場合にブロックされます
GCE インスタンスは、軽く使用した場合 (たとえば、テスト appengine サーバーとしてのみ)、エントロピーをすぐには生成しません。そのため、Java appengine サーバーを繰り返し起動すると、/dev/random からのエントロピーが補充されるよりも速く消費され、起動時にハングアップとして観察された起動時のブロック動作が発生します。
ハングの原因が SecureRandom の問題であることは、開発アプリケーション サーバーのログ レベルを上げることで確認できます。「init SecureRandom」のようなメッセージが表示された後、ブロック動作が表示されます。
これに対処するいくつかの可能な方法:
1) dev_appserver.sh 呼び出しに以下を追加すると、SecureRandom は /dev/random ではなく /dev/urandom エントロピー ソースを消費します。
--jvm_flag="-Djava.security.egd=file:/dev/./urandom"
2) より頻繁に使用される GCE インスタンスを使用すると、エントロピー データがより迅速に収集されるようになります。これにより、/dev/random がその後の開発アプリケーション サーバーの再起動時にブロックされる可能性が低くなります。