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 使用 jetty 作为开发 appserver 的 servlet 容器

-Jetty 依赖于 java.security.SecureRandom

-SecureRandom 默认从 /dev/random 消耗熵

-/dev/random 将在没有足够的熵可供读取时阻塞

GCE 实例在轻度使用时(例如,仅用作测试 appengine 服务器)不会快速生成熵。因此,java appengine 服务器的重复启动消耗来自 /dev/random 的熵比补充它的速度更快,导致启动时的阻塞行为,您观察到启动时挂起。

您可以通过提高开发应用服务器的日志记录级别来确认挂起是由于 SecureRandom 问题造成的。您应该会看到类似于“init SecureRandom”的消息,然后是阻塞行为。

一些可能的方法来解决这个问题:

1) 将以下内容添加到 dev_appserver.sh 调用将导致 SecureRandom 使用 /dev/urandom 熵源而不是 /dev/random:

--jvm_flag="-Djava.security.egd=file:/dev/./urandom"

2) 拥有一个使用率更高的 GCE 实例应该会导致更快地收集熵数据,这反过来会使 /dev/random 在开发应用程序服务器的后续重新启动时不太容易受到阻塞。

于 2013-06-03T23:01:46.817 回答