Ruby 要求';赛璐珞';加载需要很长时间
我在谷歌计算引擎上部署了一个JRuby应用程序。我注意到加载赛璐珞需要一段时间。在查看更多细节后,我发现加载赛璐珞/内部构件/堆栈需要更多时间 通常需要2分钟以上。有一次,它甚至花了大约41分钟来加载。服务器配置良好,具有15Gb RAM和4个内核 JAVA版本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
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