[英]OpenSSL causing very slow Rails boot time on Windows
我遇到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%的運行時間:
<Module::SecureRandom>#random_bytes
<Module::OpenSSL::Random>#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%的運行時間:
<Module::SecureRandom>#random_bytes <Module::OpenSSL::Random>#random_bytes
是的,用於播種隨機數生成器的OpenSSL代碼在Windows上存在問題。 請參閱OpenSSL wiki上的隨機數和Windows問題 。
return OpenSSL::Random.random_bytes(n)
所以任何人都知道這意味着什么?
Ruby正在返回隨機數。 在這種情況下,OpenSSL將在使用RAND_poll
重新調整隨機數之前自動進行RAND_poll
因為沒有提供其他種子。
紅寶石不應該叫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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.