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

OpenSSL causing very slow Rails boot time on Windows

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

每当我 运行 任何需要 rails 启动(包括测试)的东西时,它都需要很长时间才能起床和 运行ning。我在 config/environment.rb 中对 config/environment.rb 中的 Benchmark 进行了一些调用,这是对 rails:

的全新安装
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)

很明显,Rails.application.initialize 考虑到它是一个干净的安装,花了很长时间。

在此先感谢您的帮助

Edit-1:我运行正在使用双核 i3 4010u@1.7GHZ 和 4GB 内存。我不认为我的机器太糟糕,因为它 运行 大部分功能都很好。

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

<Module::SecureRandom>#random_bytes
<Module::OpenSSL::Random>#random_bytes

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

return OpenSSL::Random.random_bytes(n)

所以有人知道这是什么意思吗?

Edit-2: I ran ruby-prof on Rails.application.initialize and found the culprit. A process was taking up 85% of the run time:

<Module::SecureRandom>#random_bytes
<Module::OpenSSL::Random>#random_bytes

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


return OpenSSL::Random.random_bytes(n)

So anyone have any idea what this means?

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


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

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

我成为 windows rails 开发人员已有一段时间了。我从来没有解决过这个 rails 启动问题。 运行 微秒 Rspec 测试需要 rails 22 秒才能加载到我的电脑上。 当我(暂时)注释掉 securerandom.rb(所有 ruby 版本)中的行并将其替换为硬编码 return 时,启动时间减少到 10 秒。

#return OpenSSL::Random.random_bytes(n)
return "\xD3\x04F\f0\xD6{G\xB9\x81"

将此放入我的 config/application.rbbefore require 'rails/all')在 windows 上将 rails s 加速 10-15 秒.

require 'securerandom'
SecureRandom.hex(16)