Подтвердить что ты не робот

Запуск Grails медленный

Помощь! Я переношу большое приложение ruby ​​в Grails, но запуск Grails моего приложения занимает более 2 минут.

Я уже установил dbCreate для "чтения". Я гарантировал, что мой высокопроизводительный двухъядерный рабочий стол Windows-окна дает Grails необходимую оперативную память (1 Gig). У меня нет плагинов. У меня 170 классов домена, которые раньше были рубиновыми.

Когда он запустится, он распечатает строку "Запуск приложения Grails" и затем долго зависает, прежде чем он распечатает строку "Сервер работает".

Я просто сделал что-то, где я перенес все свои идентификаторы в bigints. Это, похоже, усугубило проблему. Теперь для запуска требуется около 10 минут.

Я новичок в grails, пожалуйста, дайте мне несколько подробностей о том, что и где регистрировать события при запуске? Что касается профилирования vm, то прошло несколько лет с тех пор, как я сделал много Java. Что вы рекомендуете использовать в качестве лучшего инструмента для профилирования?

Что еще я могу сделать, чтобы ускорить запуск Grails?

4b9b3361

Ответ 1

К сожалению, я не уверен, что слишком много можно сделать за пределами того, что вы уже сделали. Как вы знаете, в процессе его запуска происходит много, со всем разрешением/загрузкой плагина, добавлением динамических методов к объектам домена и общей динамической природой Groovy.

Я не уверен, какую версию вы используете, но я попросил возможность отключить проверку зависимостей при запуске в 1.2, так как это добавляет кучу времени и времени запуска.

Я понимаю выше, не слишком полезен, поэтому, возможно, это будет: я разделил свое приложение на несколько плагинов. Один для объектов домена, один для возможности графического отображения, один для импорта excel, другой для некоторых конструкций пользовательского интерфейса, которые мне нужны. Я не делал этого только из-за медленных стартапов, но преимущество в том, что я могу тестировать части системы отдельно друг от друга, прежде чем объединять все вместе.

Я собираюсь добавить новую функциональность, которая включает в себя как минимум 10 новых объектов домена, и я сначала их разрабатываю в отдельном плагине, имея заглушки для нескольких объектов, с которыми они должны взаимодействовать с основным приложением. Это позволяет мне сократить время запуска, а также улучшить мой код.

Итак, если это вариант для вас, попробуйте выделить все, чтобы вы могли работать над ними отдельно, что немного облегчит вашу проблему. Также могут быть другие преимущества с точки зрения того, что ваша команда работает над меньшими компонентами отдельно, улучшает модуляцию и т.д.

Надеюсь, это полезно.

Ответ 2

170 доменных классов довольно велики, но мне кажется, что 2 минуты все еще очень долго. У вас есть тонна плагинов? Потенциально слишком подробные настройки отладки?

Мне было бы любопытно, сколько времени потребовалось, если вы создали новое приложение grails, скопированное во всех ваших объектах домена (и подмножество плагинов, которые могут иметь объекты домена, чтобы они действительно действовали) и посмотреть, сколько времени потребуется на начать.

Предложение Джона о том, чтобы разделить вещи, если это возможно, является хорошим. Я сделал что-то подобное в предыдущих проектах, где у нас есть плагин домена, а наши другие приложения полагаются на этот плагин домена.

Вы также можете использовать события grails, чтобы регистрировать некоторую информацию о времени при запуске, чтобы увидеть, где ваши узкие места. Сроки события "PluginInstalled" должны быть хорошими, так как я думаю, что плагин hibernate был бы уловлен этим в дополнение к другим плагинам.

Ответ 3

У вас может быть проблема зависимости. Если плагин, который вы используете, полагается на библиотеку в maven, у которой есть "открытые" зависимости, grails будет идти и смотреть каждый раз, если в этом диапазоне есть более новые версии. Я понятия не имею, почему кто-то будет указывать его так. Похоже, что это приведет к ненадежному поведению. Для меня виновником является библиотека Amazon java aws, естественно используемая плагином, который говорит с облаком Амазонки.

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

обратите внимание, как некоторые из его зависимостей похожи на это

org.apache.httpcomponents httpclient [4.1, 5.0]

Кажется, что каждый раз, grails ищет более новую версию (и загружая, если она существует, я просто заметил, что 4.2-alpha1 httpclient спустился, когда я запустил это время).

Удалив эту зависимость из плагина и вручную добавив нужные библиотеки в мою .lib-папку, я сократил время запуска от > 30 секунд до < 1 сек

Ответ 4

Возможно, вам захочется увидеть, есть ли другие кнопки, которые вы можете повернуть иначе, чем Grails, чтобы исправить это.

Вы пытались приблизиться к этому как к проблеме производительности? Вы можете взглянуть на производительность коробки и попытаться выяснить, что такое узкое место. Это центральный процессор? Это проблема чтения диска? Можете ли вы подключить профилировщик к виртуальной машине и узнать, что использовать большую часть вашего времени запуска?

Ответ 5

Вы пробовали основы, подобные этим, для дальнейшего развертывания в контейнер сервлетов по вашему выбору или на месте .war bootstrapping?

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

grails run-war

grails war