OpenSSL在Windows上导致非常慢的Rails启动时间

Jos*_*ris 5 ruby openssl ruby-on-rails ruby-on-rails-4

我遇到Ruby on Rails运行速度非常慢的问题.我在Windows 8机器上使用Ruby 2.1.3p242和Rails 4.2.1.

每当我运行需要启动轨道(包括测试)的任何东西时,启动和运行需要很长时间.在干净安装的rails上,我在config/environment.rb中调用了Benchmark:

require File.expand_path('../application', __FILE__)
User cpu    System Cpu   Total Cpu   elapsed time
0.000000    0.000000     0.000000    (0.000000)

Rails.application.initialize!
15.282000   2.891000  18.173000 ( 18.201173)
Run Code Online (Sandbox Code Playgroud)

很明显Rails.application.initialize,考虑到它的清洁安装需要花费很长时间.

在此先感谢您的帮助

编辑-1:我正在运行双核i3 4010u@1.7GHZ,内存为4GB.我不认为我的机器太糟糕了,因为它运行得非常好.

编辑-2:我跑ruby-profRails.application.initialize,找到了罪魁祸首.一个过程占用了85%的运行时间:

<Module::SecureRandom>#random_bytes
<Module::OpenSSL::Random>#random_bytes
Run Code Online (Sandbox Code Playgroud)

这显然是在Ruby21/lib/ruby/2.1.0/securerandom.rb#62 我查找该文件中的第62行时出现的,这就是我发现的:

return OpenSSL::Random.random_bytes(n)
Run Code Online (Sandbox Code Playgroud)

所以任何人都知道这意味着什么?

jww*_*jww 4

Edit-2:我在 Rails.application.initialize 上运行 ruby​​-prof 并找到了罪魁祸首。一个进程占用了 85% 的运行时间:

<Module::SecureRandom>#random_bytes
<Module::OpenSSL::Random>#random_bytes
Run Code Online (Sandbox Code Playgroud)

是的,用于播种随机数生成器的 OpenSSL 代码在 Windows 上存在问题。请参阅OpenSSL wiki 上的随机数和 Windows 问题。


return OpenSSL::Random.random_bytes(n)
Run Code Online (Sandbox Code Playgroud)

那么有人知道这意味着什么吗?

Ruby 返回随机数。在这种情况下,OpenSSL 将在重新调整随机数之前自动播种,RAND_poll因为没有提供其他种子。


Ruby 不应调用RAND_poll允许库隐式调用它。如果随机数生成器尚未播种,则库将通过RAND_poll内部调用自动为自己播种。

相反,Ruby 应该使用从操作系统读取字节CryptGenRandom,然后调用 OpenSSL 的RAND_seed。这将避免调用RAND_poll.