Arhn - архитектура программирования

Как я могу ускорить разрешение зависимостей Gradle или вообще повысить производительность?

Я конвертирую очень большую сборку из Maven. Было несколько спецификаций, которые я преобразовал в списки зависимостей. Я также использую подключаемый модуль управления Spring Dependency.

Проблема в том, что управление зависимостями занимает вечность. Обратите внимание, что это занимает слишком много времени, даже когда я использую --offline. Я также только что прочитал, что использование allprojects {} и subprojects{} приводит к сбою параллелизма. Очевидно, мне нужно что-то, что обеспечивает аналогичную функциональность. Целью этой миграции в первую очередь было повышение производительности, но я не думаю, что она стала лучше. Мне нужно знать:

Как я могу настроить свои списки зависимостей на этапе настройки, сделать это только один раз и сделать так, чтобы информация была доступна для всех проектов? Есть ли пример плагина, который делает это? Конечно, он должен работать с параллелизмом.

Есть ли что-нибудь, что мне нужно сделать с плагином управления зависимостями Spring, чтобы повысить производительность?

Прямо сейчас время сборки составляет примерно 25 минут (работает в автономном режиме), и я нахожусь на приличном 8-ядерном блоке. Это при работающем демоне и отсутствии модульного или интеграционного тестирования. :-/


  • Это должно происходить только при первой сборке коробки, верно? Черт, у тебя, должно быть, куча зависимостей. 03.02.2016
  • Я просто переместил списки в дополнительный блок вне всех проектов/подпроектов. 03.02.2016
  • На самом деле я сначала делал очистку, так что, может быть, это заставляет демона перезагружать все? Переход к блоку ext на самом деле потерял мне секунду, а не стал улучшением. 03.02.2016
  • Каждый раз, когда я пытаюсь запустить его параллельно, я получаю ошибку xjc относительно xom (com.sun.xml.xsom.*). 03.02.2016
  • ОК, а если я делаю очистку, но исходные файлы те же, он все пересобирает? Должен ли он это делать? Кажется бессмысленным. 03.02.2016
  • Конечно, вы выбросили все файлы классов 03.02.2016
  • Хорошо, но я только что запустил сборку без очистки и изменений, и это заняло 21 минуту. Не так много улучшений. Если ничего не изменится, не должно ли это быть намного быстрее? Подождите... это тоже было параллельно. Cmd: time gradle build -x test -x IntegrationTest --offline --parallel 03.02.2016
  • Запустите его с --profile и посмотрите отчет в build/reports/profile 03.02.2016
  • Думаю, вам придется показать файл (файлы) build.gradle (или аналогичный пример), чтобы мы могли увидеть, есть ли что-то явно неправильное 03.02.2016
  • Кроме того, какая у вас ОС/JDK? 03.02.2016
  • Ссылка на документы о флаге профиля 03.02.2016
  • Профиль. Это хорошая идея. Я попробую это. Линукс Минт/Ява 8 03.02.2016
  • Даже создание слюней, maven делает это за 6 минут. :-( На самом деле я не видел ничего интересного в профиле, кроме того, что конфигурация загружалась очень быстро (0,621 с), а выполнение заняло 13 минут. Очевидно, что узкое место - это разрешение зависимостей, которое заняло 29 минут. У меня есть теория. MAVEN_OPTS=-Xms512m -Xmx8g -XX:MaxPermSize=1g Как я могу установить это для Gradle? 03.02.2016
  • Сколько у вас зависимостей? все из Maven Central? они нормально кешируются в ~/.m2? Я в тупике, не видя кода... возможно, спрашиваю на форуме gradle может есть другая идея? 03.02.2016
  • Кроме того, какая версия Gradle? А вы пробовали с --daemon? Это должно ускорить второй запуск 03.02.2016
  • Конечно, кешируется в ~/.m2 либо Gradle, либо Maven. Проблема с такого рода вещами заключается в том, что редактирование сборки такого размера для онлайн-устранения неполадок требует довольно много работы. Я был бы рад получить вашу помощь, но мне также нравится работать здесь. Тем не менее, я проверю, какие у меня есть варианты. Возможно, я смогу немного расслабиться, потому что пока что я здесь единственный парень с Gradle. 03.02.2016
  • Прямо сейчас я изучаю использование оболочки gradle для установки параметров. 03.02.2016
  • Сюжет расширяется: issues.gradle.org/browse/GRADLE-2193 03.02.2016
  • allprojects {} и subprojects{} приводят к сбою параллелизма Это неверно. Я использую оба в проекте с более чем 750 подпроектами и 3 млн + мест. Время полной чистой сборки составляет менее 15 минут. 04.02.2016
  • Используете ли вы задачи Ant XJC и Apache CXF JavaExec? 04.02.2016
  • Какой у тебя привод? У нас нет SSD. 04.02.2016
  • Также прямо в документах сказано, что использование allprojects{} и subprojects{} вызывает связывание, которое саботирует параллелизм. См. 24.9. Разделенные проекты ОДНАКО обратите внимание на пояснение здесь bit.ly/1SHUuh6, где упоминается, что вы должны сделать это во время настройки. IDK, что они подразумевают под этим, поскольку это все равно должно было быть во время конфигурации. 04.02.2016
  • По общему признанию, этот материал довольно старый. Обновление было бы неплохо. 04.02.2016

Ответы:


1

Трудно сказать, не зная больше о вашей среде или настройках. Но несколько общих правил:

  1. Вы уверены, что проблема заключается в разрешении зависимостей, используйте --profile для получения дополнительной информации. (см. документы)

  2. Убедитесь, что у вас есть только один репозиторий для поиска, желательно недалеко от вас и быстро. Обычно мы настраиваем прокси-сервер в нашем Nexus, таким образом мы позволяем Nexus кэшировать для всего отдела. Для каждого нового репозитория Gradle также ищет там все версии.

  3. Убедитесь, что ваш кеш Gradle быстрый (подумайте о локальном SSD и старом диске, смонтированном по NFS). В противном случае переместите свой $GRADLE_USER_HOME в другое локальное место.

  4. Добавление DependencyResolutionListener может дать вам больше информации о том, что может быть узким местом.

Попробуйте добавить следующее в начало вашего build.gradle:

gradle.addListener(new DependencyResolutionListener() {
    ThreadLocal<Long> start = new ThreadLocal<>()
    @Override
    void beforeResolve(ResolvableDependencies dependencies) {
        start.set(System.nanoTime())
    }

    @Override
    void afterResolve(ResolvableDependencies dependencies) {
        long stop  = System.nanoTime() - start.get()
        println "resolving $dependencies.resolutionResult.root.moduleVersion of configuration $dependencies.name (${stop/1000000} ms)"
    }
})
04.02.2016
  • Позвольте мне начать сегодня с того, что я очень ценю помощь сообщества. Как оказалось, мы уже на локальных SSD. RAM-диск может быть вариантом, но профилирование показывает, что разрешение зависимостей является одним из, если не САМЫМ, узким местом. Общее время выполнения задачи: 11 м 46,27 с Все зависимости: 22 м 17,52 с Конфигурация: 3,168 с. Я посмотрю на это еще сегодня. Если мы не сможем сделать это быстрее, чем 6 минут Maven с очисткой и сборкой правил, эта миграция может быть отменена. 04.02.2016
  • И вы определили только один репозиторий для получения артефактов? 04.02.2016
  • На самом деле это очень хороший момент @Joachim Nilsson. У меня разбросаны репозитории. 04.02.2016
  • Попробуйте заменить их все одним прокси. Это поможет вам. 05.02.2016
  • Имейте в виду, что я работал с --offline, так что это не должно было быть проблемой. 05.02.2016
  • Ах, правда. Тогда ЭТО странно. Можете ли вы опубликовать результат профилирования как часть вашего вопроса? 05.02.2016
  • Мы широко используем списки зависимостей для замены Maven BOM. Может ли это быть проблемой? 05.02.2016
  • Обновление определенно улучшило ситуацию. Раньше я бил за 14 минут в лучшем случае без очистки и оффлайна. Сейчас я на 11 минуте с чистой и онлайн. Обратите внимание, что --parallel теперь работает, тогда как раньше у него были проблемы с ant.xjc. Собираюсь продолжать. Все еще нужно получить меньше 6 минут. 06.02.2016
  • Вы пытались добавить DependencyResolutionListener по найденной ссылке? Полагаю, было бы интересно следить. 08.02.2016
  • Отрицательный. Никаких подробностей относительно того, когда, где и как прикрепить экземпляр этого интерфейса, не приводится. Это входит в базовый проект или проблемный дочерний проект? И т.д. и т.д. и т.п. Прямо сейчас у меня проблемы с разрешением зависимостей в задачах ant xjc jaxb, но ИМХО ответ на любой вопрос муравья: Шаг 1: Избавьтесь от Ant. 08.02.2016
  • Добавление примера к ответу 09.02.2016
  • У меня это подошел. :-) :-) :-) Я использовал Gradle 2.8 и обновился до 2.11. Это очень помогло. Также я переместил все, что мог, из подпроектов и всех проектов. Это тоже помогло. Мне также пришлось заменить мои задачи ant xjc на JavaExec, который делает то же самое, что и Ant, когда я использую --parallel. Текущее время сборки составляет 1 мин 14 секунд! :-) Далее я начал использовать обертку gradle. 09.02.2016
  • На самом деле мы его не облизывали. Вскоре после этого мы столкнулись с этим: stackoverflow.com /questions/36577640/ Наше решение состояло в том, чтобы использовать подключаемый модуль Nebula и изменить упаковку всех спецификаций на jar. Теперь это означает, что у нас есть пустые файлы JAR, но это не так плохо, как альтернатива. Я не рекомендую плагин Spring. Судя по нашему опыту, он плохо масштабируется. 18.04.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..