要求'赛璐珞'需要很长时间才能加载

时间:2016-03-27 05:19:27

标签: ruby jruby celluloid secure-random

我在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]

enter image description here

当我尝试使用ruby时,它会快速加载celluloid

1 个答案:

答案 0 :(得分:3)

安装haveged以在虚拟机上更快地补充熵。

你可能没有足够的熵来生成UUIDSecureRandom拉出jRubyhaveged容易随机出现。特别是在虚拟机上。因此,您的虚拟机确实在等待更多随机性。 sudo apt-get install haveged 通过收集新的熵来帮助快速补充随机性。

安装...

下载:http://www.issihosts.com/haveged/downloads.html

在像Mint和Ubuntu这样的类似Debian的Linux版本中,这就完成了:

SecureRandom

这是[{1}} ...

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遇到问题: