#performance #maven #build #hudson #artifactory
#Производительность #maven #сборка #хадсон #артефактор
Вопрос:
Нам приходится регулярно настраивать новые среды сборки, и процесс кажется не таким простым. Сегодня я получил новую машину сборки, и первая сборка Maven была настолько медленной, что я хотел уточнить, почему производительность была такой плохой. Но как это сделать?
Наш контекст:
- Мы используем несколько машин сборки, каждый проект получает свой собственный.
- Каждая машина сборки имеет аналогичную настройку, так что проекты могут запускаться немедленно и не требуют много настроек.
- У нас предварительно настроены следующие инструменты:
- Хадсон (в настоящее время 2.1.1, но изменится)
- Artifactory 2.3.3.1
- Сонар
- У Hudson, Artifactory и Sonar настроен собственный Tomcat
- Maven 2.2.1 и Maven 3.0.3 (без пользовательской конфигурации, только установка имеет
settings.xml
) - Ant 1.7.1 и Ant 1.8.2 (здесь не актуально)
- Клиент Subversion 1.6
Все инструменты должны работать вместе, особенно цепочка репозиториев должна быть:
- Репозиторий Maven машины сборки
- Артефактор машины сборки
- Артефактор центральной компании (работает как зеркало и кэш для всего мира)
- Maven central (и другой репозиторий)
Поэтому, когда для сборки Maven требуется разрешить зависимость, сначала она будет найдена в локальном репозитории Maven, оттуда в локальном репозитории Artifactory, затем в центральном репозитории Artifactory и только затем в Интернете.
Обычно нам приходится использовать прокси для подключения к Интернету, нам это не нужно в нашей интрасети.
Первая сборка (Maven Hello World) была собрана примерно за 45 минут. В то время происходила вся загрузка, но я бы подумал, что при использовании нашей цепочки репозиториев (где центральный репозиторий хорошо заполнен) сборка будет намного быстрее. Поэтому я думаю, что в центре внимания отладки будет сеть, локальная сборка не является проблемой. Итак, рассматривается конфигурация и взаимодействие Maven и Artifactory.
Как вы отлаживаете такую среду? У меня есть доступ к машине сборки (как sudo) и к центральному репозиторию, но я не знаю, с чего начать, что доказывать, где искать. Итак, каков ваш опыт, какими советами и рекомендациями вы хотели бы поделиться?
Ответ №1:
Вот несколько вещей, которые я сделал до сих пор. Если у вас есть дополнительные советы, добро пожаловать!
Я подозревал, что источником зла является цепочка репозиториев, поэтому я сначала обратился к этому. Причины:
- Реальная сборка на локальном компьютере (программы hello world) может отличаться в миллисекундах, но не в минутах.
- Сеть имеет значение, поэтому сначала атакуйте ее.
Цепочка репозиториев интересна, если что-то не найдено локально. Вот шаги, чтобы убедиться, что это так:
- Для Maven удалите содержимое локального кэша. Если локальный кэш заполнен, вы не знаете, найден ли ресурс в локальном кэше или в другом месте. (Сделайте это хотя бы в конце, если все остальное снова работает.)
- Для Artifactory также найдите этот кеш и очистите его, удалив его содержимое. Это всего лишь кеш, поэтому он будет заполнен новым.
- Если вы используете умный браузер для измерения поиска, убедитесь, что запрошенное вами не находится в кэше браузера.
- В противном случае используйте инструмент, подобный
wget
запросу ресурса. - Постарайтесь свести к минимуму источники сбоев. Поэтому попробуйте разделить большое расстояние вашего поиска на меньшие сегменты, которые вы контролируете.
- Не используйте Maven для выполнения поиска, начните сначала с репозитория Artifactory (только), а затем с Maven.
Это привело к следующим тестам, которые я хотел выполнить. Каждый раз, когда я убеждался, что предыдущие предварительные условия были выполнены:
-
Спросите
https://<my-project-artifactory>/repo/<my-pom>
. Ожидание:- Локальный поиск завершится ошибкой, поэтому необходимо найти ресурс в удаленном репозитории в центральном хранилище артефактов компании.
- Возможные эффекты могут исходить от прокси, поиска артефактов.
Результат: для поиска простого POM потребовалось ~ 30 секунд. Это слишком много.
-
Удалите прокси. С
wget
, есть вариант--no-proxy
, который делает именно это. Ожидание:- Более быстрый поиск.
Результат: никаких изменений вообще, поэтому прокси не был причиной.
-
Спросите
https://<my-project-artifactory>/libs-snapshots-company/<my-pom>
. Поэтому измените виртуальный репозиторий на реальный удаленный репозиторий. Ожидание:- Artifactory знает, где выполнять поиск, поэтому это будет намного быстрее.
Результат: POM был найден немедленно, поэтому в течение 30 секунд артефактор выполняет поиск. Но в чем может быть причина этого?
-
Удалены в Artifactory все удаленные и виртуальные репозитории (остались только наши компании и кэшированный Maven central). Но используйте снова
https://<my-project-artifactory>/repo/<my-pom>
. Ожидание:- Artifactory найдет репозиторий намного быстрее.
Результат: POM пришел мгновенно, не поддается измерению.
-
Тогда я был смелым и просто начал сборку (с локальным пустым кэшем). Затем для сборки потребовалось 5 секунд (вместо 15 минут тем же утром).
Итак, я думаю, что теперь я лучше понял, что может пойти не так, остается много вопросов. Пожалуйста, добавляйте свои идеи в качестве ответов, вы получите за них репутацию!
Комментарии:
1. Время, затрачиваемое Artifactory на разрешение элементов при обращении через виртуальный репозиторий, зависит от запрошенного артефакта и от реальных репозиториев, которые указанные виртуальные агрегаты.
2. Например, когда запрашиваются maven-metadata, Artifactory должен выполнить итерацию по всем вложенным реальным репозиториям и объединить все найденные соответствующие метаданные, что может занять некоторое время. Добавьте в этот микс несколько удаленных репозиториев, разрешение из них требует времени; возможно, ваша цепочка удаленных репозиториев включает в себя несколько медленных?
3. Как уже упоминалось, удаленные репозитории могут задерживать время разрешения. Есть пара вещей, которые вы можете сделать, чтобы решить эту проблему: агрегировать только удаленные репозитории, которые вам действительно нужны; вы также можете контролировать порядок разрешения между агрегированными репозиториями, поэтому вы можете поместить репозитории, которые, как вы знаете, являются самыми быстрыми, ранее в цепочке.
4. Большое спасибо, я проведу еще несколько экспериментов, чтобы уточнить, что необходимо и что мы можем предоставить централизованно. Я добавлю это к майскому «ответу».