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

5
我遇到了Ruby on Rails运行极慢的问题。我在Windows 8机器上使用Ruby 2.1.3p242和Rails 4.2.1。
每当我运行需要启动rails的任何东西(包括测试),它都需要很长时间才能启动。我在一个干净的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 RAM。我认为我的电脑性能还不错,大多数东西都可以很好地运行。”
“编辑2:我在 Rails.application.initialize 上运行了 ruby-prof 并找到了罪魁祸首。其中一个进程占用了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)

这是什么意思?

2
我唯一的猜测是你的机器不行或者这是一个与Windows相关的问题。我能建议的就是使用ruby-prof来尝试追踪罪魁祸首。即使在强大的机器上,Rails也需要几秒钟来初始化。 - tpbowden
也许你已经禁用了 Spring? - Mohammad AbuShady
1
Spring 只会加速后续的加载... - max
根据Spring的Github页面所述:“Spring广泛使用Process.fork,因此无法在不支持分叉(Windows、JRuby)的平台上提供加速。” - Circuit 8
1
哦,我明白了...你的系统上是否已经正确安装了openssl?https://www.openssl.org/related/binaries.html - Ruby Racer
显示剩余10条评论
3个回答

4

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

是的,在Windows上,OpenSSL用于生成随机数种子的代码存在问题。请参阅OpenSSL维基百科上的随机数和Windows问题


return OpenSSL::Random.random_bytes(n)

So anyone have any idea what this means?

Ruby返回随机数。在这种情况下,由于没有提供其他种子,OpenSSL将在返回随机数之前使用自动种子。
Ruby不应调用或允许库隐式调用它。如果未对随机数生成器进行种子处理,则库将通过内部调用自动进行种子处理。
相反,Ruby应该使用从操作系统读取字节,然后调用OpenSSL的。这将避免调用。

谢谢。我查看了有关随机数和Windows问题的链接,并在这个页面上找到了建议。我不确定如何执行他们的建议,即“在RAND_poll()函数中注释掉以下代码行:”。您认为这是可行的方法吗?如果是,我该如何操作? - Circuit 8
@Joshua - 修复 Ruby,而不是 OpenSSL。Ruby 没有正确使用 OpenSSL,在 Windows 上表现出来。在 Ruby 初始化中,让它调用 CryptGenRandom,然后将这些字节传递给 OpenSSL 的 RAND_seed。您还应该向 Ruby 提交错误报告,因为这是平台的问题。 - jww
我不知道该如何去做。有没有简单的方法来解决这个问题,或者你能指引我一些相关的指南吗? - Circuit 8
有没有简单的方法来解决这个问题... 我不知道,因为我不是 Ruby 的专家(由于它需要跨越一些基本安全服务的障碍,所以这种语言让我感到沮丧。所以我完全避免使用它)。 我相当确定解决方案不是注释 OpenSSL 中与随机数生成器相关的代码。我们知道那会怎样结束。 - jww
1
@JoshuaHarris 我只是跟随这个答案,因为这个问题已经像jww在Ruby 2.3中描述的那样得到解决。请参见此处:https://bugs.ruby-lang.org/issues/12139 - Casper

2
将以下代码放入我的config/application.rb文件中(require 'rails/all'之前),可以在Windows系统上加快rails s的速度10-15秒。
require 'securerandom'
SecureRandom.hex(16)

0

我已经做了一段时间的Windows Rails开发。我从来没有解决过这个Rails启动问题。在我的电脑上运行微秒级的Rspec测试需要22秒才能加载Rails。

当我(临时)注释掉securerandom.rb中的代码行(所有Ruby版本均适用),并使用硬编码返回值替换它时,启动时间缩短到了10秒钟。

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

哦,我已经安装了最新版本的openSSL 1.02和git 2.7.x。 - Justin
上面的黑客方法不是解决方案。顺便说一下,我的测试出了问题。它们以前通过的测试现在开始失败了。 - Justin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接