2

我在 Google 计算引擎上部署了一个 JRuby 应用程序。我注意到加载celluloidgem 需要一段时间。在查看了更多细节后,我发现加载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快速加载。

4

1 回答 1

3

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

您可能没有足够的熵来生成UUID' , SecureRandom从中jRuby很容易耗尽随机性。尤其是在虚拟机上。所以你的虚拟机实际上是在等待更多的随机性成为可能。haveged通过收集新的熵来帮助快速补充随机性闪电。

安装...

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

在类似 Debian 的 Linux 风格(如 Mint 和 Ubuntu)下,这可以完成:

sudo apt-get install haveged

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但遇到了以下问题:

于 2016-03-27T06:47:22.250 回答