我在Google计算引擎上部署了一个JRuby应用程序。我注意到加载celluloid
宝石需要一段时间。在查看更多细节后,我发现加载celluloid/internals/stack
需要更多时间。
通常需要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时,它会快速加载celluloid
。
答案 0 :(得分:3)
haveged
以在虚拟机上更快地补充熵。你可能没有足够的熵来生成UUID
从SecureRandom
拉出jRuby
,haveged
容易随机出现。特别是在虚拟机上。因此,您的虚拟机确实在等待更多随机性。 sudo apt-get install haveged
通过收集新的熵来帮助快速补充随机性。
下载:http://www.issihosts.com/haveged/downloads.html
在像Mint和Ubuntu这样的类似Debian的Linux版本中,这就完成了:
SecureRandom
jRuby
的已知问题
过去我也遇到过此问题,并且必须使用strace
来查找问题。请注意此文件,即您在问题中提到的行之前加载的文件... internals/uuid.rb
:
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
这是违规代码,因为它会生成一个9
十六进制数字字符串,可用作UUID
代码的前缀...使用SecureRandom
。
然后,通过Celluloid::Internals::UUID.generate
方法使用它。但是在加载时,Celluloid::Internals::UUID
模块执行的操作需要SecureRandom
... jRuby
遇到问题: