2015-05-01 10 views
5

Ich habe ein Problem mit Ruby on Rails läuft extrem langsam. Ich benutze Ruby 2.1.3p242 und Rails 4.2.1 auf einem Windows 8 Rechner.OpenSSL verursacht sehr langsamen Rails Boot-Zeit unter Windows

Immer, wenn ich irgendetwas betreibe, das zum Starten Rails benötigt (einschließlich Tests), dauert es sehr lange, bis es betriebsbereit ist. Ich habe ein paar Anrufe zu Benchmark in config/environment.rb auf einem sauberen Schienen installieren:

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) 

Klar Rails.application.initialize ist eine absurde lange Zeit angesichts ihrer eine saubere Aufnahme installieren.

Vielen Dank im Voraus für Ihre Hilfe

Bearbeiten-1: Ich bin auf einem Dual-Core-i3 [email protected] mit 4 GB RAM. Ich glaube nicht, dass meine Maschine so schlecht ist, weil sie die meisten Dinge sehr gut beherrscht.

Edit-2: Ich lief ruby-prof auf Rails.application.initialize und fand den Schuldigen. Ein Verfahren wurde unter 85% der Laufzeit bis:

<Module::SecureRandom>#random_bytes 
<Module::OpenSSL::Random>#random_bytes 

Dies wird auftreten offenbar in Ruby21/lib/ruby/2.1.0/securerandom.rb#62 I Linie 62 in dieser Datei nachgeschlagen und das ist, was ich gefunden habe:

return OpenSSL::Random.random_bytes(n) 

So jemand Hast du eine Ahnung was das bedeutet?

+2

Meine einzige Vermutung ist entweder Ihre Maschine saugt oder es ist ein Windows-Problem. Alles, was ich vorschlagen kann, ist [ruby-prof] (https://github.com/ruby-prof/ruby-prof), um den Übeltäter ausfindig zu machen. Selbst auf leistungsfähigen Maschinen benötigt Rails einige Sekunden, um sich zu initialisieren. – tpbowden

+0

vielleicht hast du den Frühling behindert? –

+1

Die Feder beschleunigt nur die nachfolgenden Lasten ... – max

Antwort

4

Bearbeiten-2: Ich lief ruby-prof auf Rails.application.initialize und fand die Täter. Ein Verfahren wurde unter 85% der Laufzeit bis:

<Module::SecureRandom>#random_bytes 
<Module::OpenSSL::Random>#random_bytes 

Ja, der Code OpenSSL für Impfen des Zufallszahlengenerators auf Windows problematisch ist. Siehe Random Numbers and Windows Issues im OpenSSL-Wiki.


return OpenSSL::Random.random_bytes(n) 

So hat jemand eine Ahnung, was das bedeutet?

Ruby gibt Zufallszahlen zurück. In diesem Fall wird OpenSSL sich selbst automatisch absenden, bevor eine Zufallszahl mit RAND_poll erneut gesendet wird, da kein anderer Seed bereitgestellt wurde.


Rubin sollte nicht Aufruf RAND_poll oder lassen Sie es implizit durch die Bibliothek aufgerufen werden. Wenn der Zufallszahlengenerator nicht gesetzt wurde, wird die Bibliothek automatisch durch den internen Aufruf von RAND_poll gestartet.

Stattdessen sollte Ruby Bytes aus dem Betriebssystem mit CryptGenRandom lesen und dann OpenSSL RAND_seed aufrufen. Das wird den Anruf zu RAND_poll vermeiden.

+0

Danke dafür. Ich habe den Link auf Zufallszahlen und Windows Probleme überprüft und es auf dieser [Seite] vorgeschlagen (https://groups.google.com/forum/#!topic/mailing.openssl.users/uEO5roA55Wg) Ich bin mir nicht sicher, wie um das zu tun, was sie vorschlagen, nämlich _ "Kommentieren Sie die folgenden Codezeilen in RAND_poll():" _ Wie würde ich dies tun, und ist es Ihrer Meinung nach ein praktikabler Ansatz? –

+0

@Joshua - Fix Ruby, nicht OpenSSL. Ruby verwendet OpenSSL nicht korrekt und es zeigt seinen Kopf unter Windows an. Rufen Sie in der Ruby-Initialisierung CryptGenRandom auf und übergeben Sie diese Bytes dann an RSS_seed von OpenSSL. Sie sollten auch einen Fehlerbericht mit Ruby einreichen, da dies ein Problem mit der Plattform ist. – jww

+0

Ich habe keine Ahnung, wie ich das machen würde. Gibt es eine einfache Möglichkeit, dieses Problem zu beheben, oder irgendwelche Anleitungen, auf die Sie mich hinweisen können? –

0

Ich bin seit einiger Zeit ein Windows-Schienen-Entwickler. Ich habe dieses Startproblem für Schienen nie gelöst. Das Ausführen eines Mikrosekunden-Rspec-Tests dauert 22 Sekunden, um den PC zu laden. Wenn ich die Zeile in securandandom (vorübergehend) auskommentiere.rb (alle Ruby-Versionen) und ersetzen Sie es durch eine hartcodierte Rückgabe die Startzeit ist auf 10 Sekunden reduziert.

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

Oh, und ich habe die neuesten Versionen von OpenSSL 1.02 und Git installiert. 2.7.x – Justin

+0

Der Hack oben ist keine Lösung BTW. Schlimme Dinge sind mit meinen Tests passiert. Sie begannen zu versagen, als sie vorher bestanden hatten. – Justin

1

Putting in meinem config/application.rb (vorrequire 'rails/all') beschleunigt rails s von 10-15 Sekunden auf Fenster.

require 'securerandom' 
SecureRandom.hex(16)