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

#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

Все инструменты должны работать вместе, особенно цепочка репозиториев должна быть:

  1. Репозиторий Maven машины сборки
  2. Артефактор машины сборки
  3. Артефактор центральной компании (работает как зеркало и кэш для всего мира)
  4. Maven central (и другой репозиторий)

Поэтому, когда для сборки Maven требуется разрешить зависимость, сначала она будет найдена в локальном репозитории Maven, оттуда в локальном репозитории Artifactory, затем в центральном репозитории Artifactory и только затем в Интернете.

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

Первая сборка (Maven Hello World) была собрана примерно за 45 минут. В то время происходила вся загрузка, но я бы подумал, что при использовании нашей цепочки репозиториев (где центральный репозиторий хорошо заполнен) сборка будет намного быстрее. Поэтому я думаю, что в центре внимания отладки будет сеть, локальная сборка не является проблемой. Итак, рассматривается конфигурация и взаимодействие Maven и Artifactory.

Как вы отлаживаете такую среду? У меня есть доступ к машине сборки (как sudo) и к центральному репозиторию, но я не знаю, с чего начать, что доказывать, где искать. Итак, каков ваш опыт, какими советами и рекомендациями вы хотели бы поделиться?

Ответ №1:

Вот несколько вещей, которые я сделал до сих пор. Если у вас есть дополнительные советы, добро пожаловать!

Я подозревал, что источником зла является цепочка репозиториев, поэтому я сначала обратился к этому. Причины:

  • Реальная сборка на локальном компьютере (программы hello world) может отличаться в миллисекундах, но не в минутах.
  • Сеть имеет значение, поэтому сначала атакуйте ее.

Цепочка репозиториев интересна, если что-то не найдено локально. Вот шаги, чтобы убедиться, что это так:

  • Для Maven удалите содержимое локального кэша. Если локальный кэш заполнен, вы не знаете, найден ли ресурс в локальном кэше или в другом месте. (Сделайте это хотя бы в конце, если все остальное снова работает.)
  • Для Artifactory также найдите этот кеш и очистите его, удалив его содержимое. Это всего лишь кеш, поэтому он будет заполнен новым.
  • Если вы используете умный браузер для измерения поиска, убедитесь, что запрошенное вами не находится в кэше браузера.
  • В противном случае используйте инструмент, подобный wget запросу ресурса.
  • Постарайтесь свести к минимуму источники сбоев. Поэтому попробуйте разделить большое расстояние вашего поиска на меньшие сегменты, которые вы контролируете.
  • Не используйте Maven для выполнения поиска, начните сначала с репозитория Artifactory (только), а затем с Maven.

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

  1. Спросите https://<my-project-artifactory>/repo/<my-pom> . Ожидание:

    • Локальный поиск завершится ошибкой, поэтому необходимо найти ресурс в удаленном репозитории в центральном хранилище артефактов компании.
    • Возможные эффекты могут исходить от прокси, поиска артефактов.

    Результат: для поиска простого POM потребовалось ~ 30 секунд. Это слишком много.

  2. Удалите прокси. С wget , есть вариант --no-proxy , который делает именно это. Ожидание:

    • Более быстрый поиск.

    Результат: никаких изменений вообще, поэтому прокси не был причиной.

  3. Спросите https://<my-project-artifactory>/libs-snapshots-company/<my-pom> . Поэтому измените виртуальный репозиторий на реальный удаленный репозиторий. Ожидание:

    • Artifactory знает, где выполнять поиск, поэтому это будет намного быстрее.

    Результат: POM был найден немедленно, поэтому в течение 30 секунд артефактор выполняет поиск. Но в чем может быть причина этого?

  4. Удалены в Artifactory все удаленные и виртуальные репозитории (остались только наши компании и кэшированный Maven central). Но используйте снова https://<my-project-artifactory>/repo/<my-pom> . Ожидание:

    • Artifactory найдет репозиторий намного быстрее.

    Результат: POM пришел мгновенно, не поддается измерению.

  5. Тогда я был смелым и просто начал сборку (с локальным пустым кэшем). Затем для сборки потребовалось 5 секунд (вместо 15 минут тем же утром).

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

Комментарии:

1. Время, затрачиваемое Artifactory на разрешение элементов при обращении через виртуальный репозиторий, зависит от запрошенного артефакта и от реальных репозиториев, которые указанные виртуальные агрегаты.

2. Например, когда запрашиваются maven-metadata, Artifactory должен выполнить итерацию по всем вложенным реальным репозиториям и объединить все найденные соответствующие метаданные, что может занять некоторое время. Добавьте в этот микс несколько удаленных репозиториев, разрешение из них требует времени; возможно, ваша цепочка удаленных репозиториев включает в себя несколько медленных?

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

4. Большое спасибо, я проведу еще несколько экспериментов, чтобы уточнить, что необходимо и что мы можем предоставить централизованно. Я добавлю это к майскому «ответу».