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-prof了Rails.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)
所以任何人都知道这意味着什么?
Edit-2:我在 Rails.application.initialize 上运行 ruby-prof 并找到了罪魁祸首。一个进程占用了 85% 的运行时间:
Run Code Online (Sandbox Code Playgroud)<Module::SecureRandom>#random_bytes <Module::OpenSSL::Random>#random_bytes
是的,用于播种随机数生成器的 OpenSSL 代码在 Windows 上存在问题。请参阅OpenSSL wiki 上的随机数和 Windows 问题。
Run Code Online (Sandbox Code Playgroud)return OpenSSL::Random.random_bytes(n)那么有人知道这意味着什么吗?
Ruby 返回随机数。在这种情况下,OpenSSL 将在重新调整随机数之前自动播种,RAND_poll因为没有提供其他种子。
Ruby 不应调用或RAND_poll允许库隐式调用它。如果随机数生成器尚未播种,则库将通过RAND_poll内部调用自动为自己播种。
相反,Ruby 应该使用从操作系统读取字节CryptGenRandom,然后调用 OpenSSL 的RAND_seed。这将避免调用RAND_poll.