2009-12-11 18 views
28

ヘルプ!私は大規模なルビーアプリをGrailsに移植していますが、Grailsの起動には2分以上かかります。Grailsの起動が遅い

私はすでにdbCreateを「読み込み」に設定しています。ハイエンドのデュアルプロセッサデスクトップウィンドウボックスでGrailsに必要なRAM(1ギガ)が確保されています。私はプラグインをインストールしていない。私は、以前はルビークラスであった170のドメインクラスを持っています。

起動すると、「Running Grails App ..」という行が表示され、その後、「Server running」行が表示されるまでに長い時間停止します。

私はすべてのIDをbigintに移行しました。それは問題を悪化させたようだ。今起動に約10分かかります。

私はgrailsの新機能です。スタートアップ時にイベントやイベントをログに記録するための詳細をいくつか教えてください。 VMのプロファイリングに関しては、Javaをたくさんしてから数年経ちました。今では最高のプロファイリングツールとして何をお勧めしますか?

Grailsの起動を高速化するために他に何ができますか?

答えて

10

残念ながら、私はあまりにもあなたがすでに行ったことを超えて行うことができるとは思わない。ご存知のように、起動時には、すべてのプラグインの解決/ロード、ドメインオブジェクトへの動的メソッドの追加、Groovyの全体的な動的な性質の追加などがあります。

使用しているバージョンがわかりませんが、1.2で起動したときに依存関係のチェックを無効にする機能を要求しました。起動時にも時間がかかるためです。

私は上記のことがあまり役に立ちませんので、おそらくこれは次のようになります。アプリケーションをいくつかのプラグインに分割します。 1つはドメインオブジェクト用、1つはグラフ機能用、もう1つはExcelインポート用、もう1つは必要なUI構成用です。起動時間が遅いからといって、私はそれをやっていませんでしたが、利点は、すべてを統合する前にシステムの部分を互いに別々にテストできることです。

私は、少なくとも10個の新しいドメインオブジェクトを含む新しい機能を追加しようとしています。最初に別のプラグインでそれらを開発しています。コアアプリケーションから数え切れないほどのオブジェクトをスタブする必要があります。これにより、起動時間を短縮することができ、コードをよりよく分離できます。

あなたのためのオプションの場合は、別々に作業できるように物を分けてください。これにより、問題が多少緩和されます。また、小規模なコンポーネントを個別に処理したり、モジュール化を改善したりするなど、他のメリットもあります。

希望します。

1

これを修正するには、他のノブがGrails以外のものになっているかどうかを知りたいかもしれません。

パフォーマンスの問題としてこれを試しましたか?あなたはボックスのパフォーマンスを見て、ボトルネックが何であるかを調べることができます。それはCPUですか?それはディスクの読み込みの問題ですか?プロファイラをVMに接続して、起動時間の大半を使用しているものを見つけることができますか?

3

170ドメインクラスはかなり大きいですが、2分はまだ私にとって本当に長いようです。大量のプラグインがインストールされていますか?潜在的に冗長なデバッグ設定?

グレースアプリケーションを新しく作成して、すべてのドメインオブジェクト(およびドメインオブジェクトが実際に動作する必要があるかもしれないプラグインのサブセット)にコピーした場合、どのくらいの時間がかかるのか不思議です始めること。

可能ならばジーンが物を分けることについての提案は良いことです。私はドメインプラグインを持っている以前のプロジェクトと同様のことをやったことがあり、他のすべてのアプリケーションはすべてそのドメインプラグインに依存しています。

また、grails eventsを使用して、起動時にタイミング情報を記録して、ボトルネックがどこにあるかを確認することもできます。 「PluginInstalled」イベントのタイミングは、他のプラグインに加えて、これによってHibernateプラグインが捕捉されると思うので、良いはずです。

2

依存関係の問題がある可能性があります。あなたが使用するプラグインが、オープンエンドの依存関係を持つmavenのライブラリに依存している場合、その範囲で新しいバージョンがダウンロードされるようになると、grailsは毎回探します。なぜ誰がそれをこのように指定するのか分かりません。それは信頼できない行動につながると思われる。私にとっては、Amazonのクラウドと交信するプラグインによって自然に使用される、Amazonのjava awsライブラリです。

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

ノートその依存関係のいくつかは、このようなものですか

org.apache.httpcomponents HTTPClientの[4.1、5.0)

それたびは、Grailsの新しいバージョンを探しているように見えます(そしてダウンロードしている場合は、今回実行したときにhttpclientの4.2-alpha1が表示されていることに気付きました)。プラグインからその依存関係を削除し、手動で私の.libフォルダに必要なライブラリを追加することにより

は、私が< 1秒

0

に> 30秒から私の起動時間を削減しますが、サーブレットへのさらなる展開のためにこれらのような基礎を試してみましたあなたが選んだコンテナか、または.warブートストラップしていますか?

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

grails run-war 

grails war 
関連する問題