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]

ここに画像の説明を入力


ルビーで同じことを試したところ、celluloidすぐにロードされました。

4

1 に答える 1

3

haveged仮想マシンでエントロピーをより速く補充するためにインストールします。

を生成するのに十分なエントロピーがない可能性がありますが、そこUUIDから ランダム性が簡単に失われます。特に仮想マシンでは。したがって、仮想マシンは文字通り、よりランダム性が可能になるのを待っています。新しい種類のエントロピーを収集することで、そのランダム性をすばやく補充するのに役立ちます。SecureRandomjRubyhaveged

インストール中...

ダウンロード: http://www.issihosts.com/haveged/downloads.html

Mint や Ubuntu などの Debian ライクな Linux フレーバーでは、次のようにします。

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コードの接頭辞として使用できる16進数の文字列を生成するため、これは問題のあるコードでしたUUID... using SecureRandom.

その後、Celluloid::Internals::UUID.generateメソッドを介してそれを使用します。しかし、ロード時に、Celluloid::Internals::UUIDモジュールは次のような問題があったSecureRandom... を必要とする操作を実行します。jRuby

于 2016-03-27T06:47:22.250 に答える