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

我遇到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) 

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

在此先感谢您的帮助

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

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

 #random_bytes #random_bytes 

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

 return OpenSSL::Random.random_bytes(n) 

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

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

 #random_bytes #random_bytes 

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


 return OpenSSL::Random.random_bytes(n) 

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

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


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

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

把它放在我的config/application.rb require 'rails/all' )将窗口上的rails s加速10-15秒。

 require 'securerandom' SecureRandom.hex(16) 

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

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