6

Google コンピューティング インスタンスで Google AppEngine のローカル開発サーバー (Java) を実行しようとしています。(コンピューティング エンジン インスタンスをテスト サーバーとして使用しています)。

appcfg.sh を使用して開発サーバーを起動しようとすると、90% の確率でサーバーが起動せず、最終的に起動する前に 10 分間ハングすることがわかりました。

ハングしたときにこの行がコンソールに出力されないため、サーバーが起動していないことがわかります。

Server default is running at http://localhost:8080/

誰もこのようなものを見たことがありますか?

4

1 に答える 1

10

手短に:

-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 がその後の開発アプリケーション サーバーの再起動時にブロックされる可能性が低くなります。

于 2013-06-03T23:01:46.817 に答える