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-prof
在 Rails.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.rb
(before require 'rails/all'
)在 windows 上将 rails s
加速 10-15 秒.
require 'securerandom'
SecureRandom.hex(16)
我在 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-prof
在 Rails.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.rb
(before require 'rails/all'
)在 windows 上将 rails s
加速 10-15 秒.
require 'securerandom'
SecureRandom.hex(16)