2009-12-11 20 views
28

Hilfe! Ich portiere eine große Ruby-App nach Grails - aber der Grails-Start meiner Anwendung dauert mehr als 2 Minuten.Grails Start ist langsam

Ich habe bereits gesetzt dbCreate zu "lesen" Ich habe sichergestellt, dass meine High-End-Dual-Prozessor-Desktop-Windows-Box Grails benötigt RAM (1 Gig). Ich habe keine Plugins installiert. Ich habe 170 Domain-Klassen, die früher Ruby-Klassen waren.

Wenn es startet, druckt es die Zeile "Running Grails App .." aus und bleibt dann lange hängen, bevor es die Zeile "Server running" ausgibt.

Ich habe gerade etwas gemacht, wo ich alle meine IDs zu bigints migriert habe. Das scheint das Problem verschlimmert zu haben. Jetzt dauert es ca. 10 Minuten bis zum Start.

Ich bin neu zu Grals würdest du mir bitte ein paar weitere Details darüber geben, wo und wo die Ereignisse beim Start zu protokollieren? Was die Profilerstellung betrifft, war es ein paar Jahre her, dass ich viel Java gemacht habe. Was empfehlen Sie als das beste Profiling-Tool, das Sie jetzt verwenden können?

Was kann ich noch tun, um den Start von Grails zu beschleunigen?

Antwort

10

Leider bin ich mir nicht sicher, ob zu viel getan werden kann, außer was Sie bereits getan haben. Wie Sie wissen, gibt es eine Menge zu tun, wenn es startet, mit der ganzen Plugin-Auflösung/dem Laden, Hinzufügen dynamischer Methoden zu Ihren Domain-Objekten und der allgemeinen Dynamik von Groovy.

Ich bin mir nicht sicher, welche Version Sie verwenden, aber ich habe nach der Möglichkeit gefragt, die Abhängigkeitsprüfung beim Start in 1.2 zu deaktivieren, da dies auch eine Menge Zeit für die Startzeit hinzufügt.

Ich realisiere oben ist nicht allzu hilfreich, also vielleicht wird dies sein: Ich habe meine Anwendung in mehrere Plugins aufgeteilt. Eine für Domänenobjekte, eine für Grafikfunktionen, eine für Excel-Import, eine weitere für einige UI-Konstrukte, die ich brauchte. Ich habe es nicht nur wegen der langsamen Startzeiten gemacht, aber der Vorteil ist, dass ich Teile des Systems getrennt voneinander testen kann, bevor ich alles zusammen integriere.

Ich bin im Begriff, ein Stück neue Funktionalität hinzuzufügen, die mindestens 10 neue Domain-Objekte enthält, und ich entwickle sie zuerst in einem separaten Plugin, indem ich Stubs für die wenigen Objekte habe, mit denen sie interagieren müssen. Dadurch kann ich sowohl die Startzeiten reduzieren als auch meinen Code besser isolieren.

Also, wenn es eine Option für Sie ist, versuchen Sie, Dinge zu trennen, so dass Sie separat arbeiten können, was Ihr Problem etwas lindern wird. Es kann auch andere Vorteile in Bezug darauf, dass Ihr Team an kleineren Komponenten separat arbeiten muss, eine bessere Modularisierung usw. geben.

Hoffe, das ist hilfreich.

1

Sie könnten sehen, ob es andere Knöpfe gibt, die Sie anders als Grails drehen können, um das zu beheben.

Haben Sie versucht, dies als Leistungsproblem zu betrachten? Sie können sich die Leistung der Box ansehen und herausfinden, was der Engpass ist. Ist es CPU? Ist es ein Leseproblem für die Festplatte? Können Sie einen Profiler an die VM anhängen und herausfinden, was den größten Teil Ihrer Startzeit ausmacht?

3

170 Domain-Klassen ist ziemlich groß, aber 2 Minuten scheint mir immer noch sehr lange. Hast du eine Menge Plugins installiert? Möglicherweise zu ausführliche Debug-Einstellungen?

Ich wäre gespannt, wie lange es dauert, wenn Sie eine App für neue Grails erstellen, kopiert in alle Ihre Domain-Objekte (und die Teilmenge von Plugins, die die Domain-Objekte tatsächlich benötigen) und sehen, wie lange das dauert anfangen.

Jean's Vorschlag über die Trennung von Dingen, wenn möglich, ist ein guter. Ich habe bei früheren Projekten, bei denen wir ein Domain-Plugin haben, etwas Ähnliches getan, und unsere anderen Apps sind alle auf dieses Domain-Plugin angewiesen.

Sie könnten auch die grails events verwenden, um einige Timing-Informationen beim Start zu protokollieren, um zu sehen, wo Ihre Engpässe sind. Das Timing des "PluginInstalled" -Ereignisses sollte gut sein, da ich denke, dass das Hibernate-Plugin dadurch zusätzlich zu den anderen Plugins erfasst würde.

2

Möglicherweise liegt ein Abhängigkeitsproblem vor. Wenn ein Plugin, das du verwendest, auf eine Bibliothek in Maven angewiesen ist, die 'offene' Abhängigkeiten hat, werden die Grails jedes Mal nachsehen, ob es neuere Versionen zum Herunterladen gibt. Ich habe keine Ahnung, warum irgendjemand es so spezifizieren würde. Es scheint, es würde zu unzuverlässigem Verhalten führen. Für mich ist der Übeltäter die java aws-Bibliothek von Amazon, die natürlich von einem Plugin verwendet wird, das mit der Cloud von Amazon kommuniziert.

http://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk/1.2.10

Notiz, wie einige seiner Abhängigkeiten wie diese sind

org.apache.httpcomponents Httpclient [4.1, 5.0)

es scheint, dass jedes Mal, wird grails für eine neuere Version suchen (und herunterladen, wenn es existiert, habe ich gerade bemerkt 4.2-Alpha1 von httpclient kommen herunter, wenn ich diesmal lief).

Durch diese Abhängigkeit von der Plugin zu entfernen und manuell das Hinzufügen der erforderlichen Bibliotheken zu meinem LIB-Ordner, reduzierte ich meine Startzeit von> 30 Sekunden bis < 1sec

0

Haben Sie Grundlagen für die weitere Bereitstellung an ein Servlet wie diese versuchten Container Ihrer Wahl oder In-Place .war Bootstrapping?

grails -Ddisable.auto.recompile=true run-app 

grails run-war 

grails war