Ruby 要求';赛璐珞';加载需要很长时间

Ruby 要求';赛璐珞';加载需要很长时间,ruby,jruby,celluloid,secure-random,Ruby,Jruby,Celluloid,Secure Random,我在谷歌计算引擎上部署了一个JRuby应用程序。我注意到加载赛璐珞需要一段时间。在查看更多细节后,我发现加载赛璐珞/内部构件/堆栈需要更多时间 通常需要2分钟以上。有一次,它甚至花了大约41分钟来加载。服务器配置良好,具有15Gb RAM和4个内核 JAVA版本 java version "1.8.0_74" Java(TM) SE Runtime Environment (build 1.8.0_74-b02) Java HotSpot(TM) 64-Bit Server VM (build

我在谷歌计算引擎上部署了一个JRuby应用程序。我注意到加载赛璐珞需要一段时间。在查看更多细节后,我发现加载赛璐珞/内部构件/堆栈需要更多时间

通常需要2分钟以上。有一次,它甚至花了大约41分钟来加载。服务器配置良好,具有15Gb RAM和4个内核

JAVA版本

java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)
JRUBY版本

jruby 9.0.5.0 (2.2.3) 2016-01-26 7bee00d Java HotSpot(TM) 64-Bit Server VM 25.74-b02 on 1.8.0_74-b02 +jit [linux-amd64]


当我尝试使用ruby时,它会快速加载赛璐珞。

安装haveged,以便在虚拟机上更快地补充熵。 您可能没有足够的熵来生成从
SecureRandom
中提取的
UUID
,而
jRuby
下的UUID很容易失去随机性。特别是在虚拟机上。因此,您的虚拟机实际上正在等待更多的随机性成为可能
haveged
通过收集新的熵,帮助快速补充随机性

安装。。。 下载:

在类似于Debian的Linux版本(如Mint和Ubuntu)下,这可以实现:

sudo apt-get install haveged

这是
jRuby
下的
SecureRandom
的一个已知问题。。。 过去我也有这个问题,必须使用
strace
来定位问题。请注意这个文件,它是您在问题中提到的行之前加载的…:

这是有问题的代码,因为它生成了一个
9
十六进制数字字符串,可以用作
UUID
代码的前缀。。。使用
SecureRandom

然后,通过
赛璐珞::internal::UUID.generate
方法可以使用它。但是在加载时,
Celluloid::internal::UUID
模块执行需要
SecureRandom
的操作。。。jRuby在以下方面遇到了问题:


太棒了!很高兴我能帮上忙我明白这是非阻塞的,但你能详细说明一下吗?不确定,但这会导致以后出现任何问题吗?我只是想了解更多关于这个问题的信息。如果您在运行赛璐珞的系统上安装了
haveged
,并且这为您解决了问题,那么这个问题将不会再次出现。当
赛璐珞
启动时,它会引入一系列随机字符,用于生成
UUID
,该操作是一个阻塞操作,甚至在
赛璐珞
启动任何东西或真正实例化任何东西之前。如果你对发生这种情况的确切地点感到好奇,我可以在不久的将来回来把它添加到我的答案中。每台
*nix
计算机都在存储它接收到的熵——通常来自击键、鼠标移动、,甚至网络流量——但对于键盘上没有用户的虚拟机来说,这些熵的来源几乎是零
haveged
使用一种特殊的方法,将机器上运行的进程转化为熵源,这非常适合虚拟机。谢谢。是的,我想知道发生这种事的确切地点。请随时更新答案。您可以使用command+shift+3在mac上制作屏幕截图,或使用command+shift+4在屏幕上制作部分屏幕截图更新我的答案,并提供更多详细信息。
require "securerandom"

module Celluloid
  module Internals
    # Clearly Ruby doesn't have enough UUID libraries
    # This one aims to be fast and simple with good support for multiple threads
    # If there's a better UUID library I can use with similar multithreaded
    # performance, I certainly wouldn't mind using a gem for this!
    module UUID
      values = SecureRandom.hex(9).match(/(.{8})(.{4})(.{3})(.{3})/)
      PREFIX = "#{values[1]}-#{values[2]}-4#{values[3]}-8#{values[4]}".freeze

      #de ...
    end
  end
end