我正在尝试在 Google 计算实例上为 Google AppEngine 运行本地开发服务器 (java)。 (我们使用计算引擎实例作为测试服务器)。
当尝试使用 appcfg.sh 启动开发服务器时,我们注意到在 90% 的情况下,服务器不会启动并在最终启动前挂起 10 分钟。
我知道服务器还没有启动,因为当它挂起时,这行永远不会打印到控制台:
Server default is running at http://localhost:8080/
有人见过这样的东西吗?
最佳答案
简而言之:
-App Engine java SDK 使用jetty 作为开发应用服务器的servlet 容器
-Jetty依赖java.security.SecureRandom
-SecureRandom 默认消耗来自/dev/random 的熵
-/dev/random 将在没有足够的熵可供读取时阻塞
GCE 实例在使用较少时(例如,仅用作测试应用引擎服务器)不会快速生成熵。因此,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 在随后重新启动开发应用程序服务器时不易受到阻塞。
关于java - 运行 Google Compute Engine 实例的 GAE 开发服务器 <phew>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16804437/