Для получения триального ключа
заполните форму ниже
Team License (базовая версия)
Enterprise License (расширенная версия)
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
GBP
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
>
Ускоряем сборку и анализ при помощи Inc…

Ускоряем сборку и анализ при помощи IncrediBuild

17 Май 2021

"Да сколько ты ещё будешь собирать?" – фраза, которую каждый разработчик произносил хотя бы раз посреди ночи. Да, сборка бывает долгой и от этого никуда не деться. Нельзя же просто так взять и распараллелить всё это дело не на каких-то жалких 8–12 ядер, а так, чтобы на 100+. Или всё-таки можно?

0826_IncrediBuild_ru/image1.png

Мне нужно больше ядер!

Как вы могли заметить, речь сегодня пойдёт как раз о том, как можно ускорить компиляцию. И нет, в этот раз будут рассмотрены не какие-то специфичные механизмы, а самое обычное распараллеливание. Ну, тут всё, казалось бы, просто – выставляем доступное физически количество ядер, нажимаем на build и идём пить условный чай.

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

"Взять бы у этих бездельников ядра", – могли вы подумать. И правильно бы сделали, ведь это вполне себе можно реализовать. Но не нужно, конечно, принимать мои слова близко к сердцу и вооружаться паяльником. Впрочем, это уже на ваше усмотрение :)

Отдай!

Так как реквизировать машины коллег нам вряд ли кто-либо даст, будем пользоваться обходными путями. Даже если у вас и получилось убедить своих коллег поделиться железом, всё равно пользы от лишних процессоров у вас не будет, разве что можете выбрать себе тот, который пошустрее. А нам нужно то решение, которое каким-то образом позволит запускать дополнительные потоки сборки на удалённых машинах.

Благо среди тысяч категорий всякого полезного ПО, затесалась и нужная нам – система распределённой сборки. Программы этой категории делают именно то, что нам было и нужно: выдают на время простаивающие ядра коллег и при этом делают это без их ведома в автоматическом режиме. Разве что сперва нужно будет поставить всё это на их машины, но об этом немного позже...

На ком будем проверять?

Для того чтобы убедиться, что всё функционирует действительно хорошо, нужно было найти качественного подопытного. Так как у нас уже не раз были в статьях и Chromium, и Linux, а выделиться как-то хотелось, нужно было найти что-нибудь новое... Поэтому я пошёл в сторону открытых игр (а где же ещё искать большие проекты?). И, как вы увидите ниже, очень пожалел об этом решении.

Впрочем, поиск чего-то объёмного труда не составил, да и мне "повезло" повстречать открытый проект на Unreal Engine. Вдуматься только! Я действительно до момента написания этой статьи и подумать не мог, что на UE бывает Open Source™.

Итак, герой этой статьи: Unreal Tournament. Только вы не спешите сразу переходить по ссылке, так как вам может понадобиться пара дополнительных кликов – подробности *тут*.

0826_IncrediBuild_ru/image2.png

Да будет сборка на 100+ ядер!

В качестве примера системы распределённой сборки я, пожалуй, остановлюсь на IncrediBuild. Не то чтобы у меня был большой выбор – у нас была уже лицензия IncrediBuild на 20 машин. Нет, есть, конечно, открытый distcc, но он не так прост в настройке, да и к тому же практически все машины у нас под Windows.

Итак, первым делом нужно поставить агентов на машины других разработчиков. Есть два способа:

  • попросить коллег в местном Slack;
  • воззвать к силам сисадмина.

Разумеется, как и любой другой наивный человек, я написал сперва в Slack... Спустя пару дней еле-еле дошло до 12 машин из 20. После этого я воззвал к силам сисадмина, и, о чудо, заветная двадцатка была у меня в руке. Так что теперь у меня было около 145 ядер (+/- 10) :)

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

Итак, у нас теперь есть сетка на стероидах, поэтому пришло время добраться до Visual Studio. Выбираем в плагине сборку... А вот и нет :)

Если вдруг вы и сами захотите попробовать, то учтите, что сперва нужно собрать проекты ShaderCompileWorker и UnrealLightmass. Так как они небольшие, я собрал их локально. Вот теперь уже можно нажать на заветную кнопку:

0826_IncrediBuild_ru/image3.png

Итак, какая же получилась разница?

0826_IncrediBuild_ru/image4.png

Как видите, нам удалось ускорить сборку с 30 минут до почти 6! Очень даже нехило. Кстати, запуск проводился посреди рабочего дня, так что примерно таких цифр можно ожидать и не на синтетическом тесте. Впрочем, от проекта к проекту разница может быть разной.

Что ещё можно ускорить?

Помимо сборки можно натравить IncrediBuild на любую тулзу, которая плодит много подпроцессов. Как вы, может, обратили внимание, я работаю в PVS-Studio. Поэтому, конечно же, я не могу обойти стороной возможность скормить ему и наш анализатор.

Профит в быстром анализе примерно такой же, как и в быстрой сборке: возможность локальных прогонов перед коммитом. Конечно, всегда есть желание залить всё сразу в мастер; но обычно тимлид бывает не в восторге от подобных действий, особенно когда валятся ночные прогоны на сервере... Поверьте мне – я валил :(

Настраивать особенно анализатор не нужно, разве что нам не повредит указать старые-добрые 145 потоков в настройках:

0826_IncrediBuild_ru/image5.png

Ну и стоит указать местной сборочной системе, кто тут анализатор:

0826_IncrediBuild_ru/image6.png

Подробности *тут*

Итак, пришло время нажать на сборку ещё раз и насладиться ускорением:

0826_IncrediBuild_ru/image7.png

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

Попытка запуска PVS-Studio #2

Спустя какое-то время я вспомнил про версию Unreal Engine, которая используется в этом проекте:

0826_IncrediBuild_ru/image9.png

Не то чтобы это плохо само по себе, но флаг -StaticAnalyzer появился много позже. Поэтому интегрироваться напрямую не то чтобы было возможно. Примерно на этом моменте я уже начал задумываться о том, чтобы забить на всё это дело и уйти пить кофе.

После пары кружек бодрящего напитка у меня возникла мысль всё-таки дочитать туториал по интеграции до конца. Помимо указанного выше способа есть ещё и мониторинг компиляции. Это как раз тот вариант, когда ничего уже не помогает.

Первым делом включим сервер мониторинга:

CLMonitor.exe monitor

Эта штука будет крутиться на фоне и следить за тобой вызовами компилятора. Но она не может отслеживать происходящее в IncrediBuild, поэтому придётся один раз собрать без него.

На фоне предыдущего запуска локальная пересборка выглядит очень бедно:

Total build time: 1710,84 seconds (Local executor: 1526,25 seconds)

Теперь сохраним то, что насобирали в отдельный файл:

CLMonitor.exe saveDump -d dump.gz

Дальше можно будет пользоваться этим дампом, пока вы не добавите новый файл в проект. Да, это не так удобно, как с флагом, но ничего не поделаешь – версия движка слишком старая.

Сам же анализ запускается вот этой командой:

CLMonitor.exe analyzeFromDump -l UE.plog -d dump.gz

Только не стоит его так запускать, ведь мы же хотим его запустить под IncrediBuild. Так что закинем эту команду в analyze.bat. И создадим рядом файл profile.xml:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Profile FormatVersion="1">
  <Tools>
    <Tool Filename="CLMonitor" AllowIntercept="true" />
    <Tool Filename="cl" AllowRemote="true" />
    <Tool Filename="PVS-Studio" AllowRemote="true" />
  </Tools>
</Profile>

Подробности *тут*

И теперь мы можем запустить всё с нашими 145 ядрами:

ibconsole /command=analyze.bat /profile=profile.xml

И как это выглядит в Build Monitor:

0826_IncrediBuild_ru/image11.png

Что-то много ошибок на этом графике, не так ли?

К нам закралась ещё одна проблема. И в этот раз дело не в том, что кто-то что-то не поддерживает. Сборка Unreal Tournament оказалась несколько специфичной.

Попытка запуска PVS-Studio #3

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

....\Build.h(42): fatal error C1189: #error: Exactly one of [UE_BUILD_DEBUG \
UE_BUILD_DEVELOPMENT UE_BUILD_TEST UE_BUILD_SHIPPING] should be defined to be 1

Так в чём проблема? Всё довольно просто – препроцессор требует, чтобы только один из следующих макросов имел значение 1:

  • UE_BUILD_DEBUG;
  • UE_BUILD_DEVELOPMENT;
  • UE_BUILD_TEST;
  • UE_BUILD_SHIPPING.

Да, вроде как всё собиралось раньше, а теперь что-то страшное вылетело. Пришлось закопаться в логи, а точнее – в дамп компиляции. Там-то проблема и нашлась. Дело было в том, что эти макросы объявляются в местном precompile header, а мы хотим только препроцессировать. Так что пришлось добавить все эти макросы вручную:

#ifdef PVS_STUDIO

#define _DEBUG
#define UE_BUILD_DEVELOPMENT 1

#define WITH_EDITOR 1
#define WITH_ENGINE 1
#define WITH_UNREAL_DEVELOPER_TOOLS 1
#define WITH_PLUGIN_SUPPORT 1

#define UE_BUILD_MINIMAL 1

#define IS_MONOLITHIC 1
#define IS_PROGRAM 1

#define PLATFORM_WINDOWS 1

#endif

Самое начало файла build.h

И уже с этим небольшим костылём элегантным решением можно запустить анализ. Причём сборка не сломается, так как мы воспользовались макросом PVS_STUDIO.

Итак, долгожданные результаты анализа:

0826_IncrediBuild_ru/image13.png

Согласитесь, почти 15 минут вместо двух с половиной часов – это очень хорошее ускорение. Сложно представить, чтобы вы могли пить кофе 2 часа кряду и ни у кого не возникло бы сомнений на ваш счёт. А вот 15-минутный перекур вопросов не вызывает. Наверное...

И что у нас в итоге?

Разумеется, что в идеальном мире увеличение количества потоков в N раз увеличило бы скорость сборки в N раз. Но живём мы в совершенно ином мире, поэтому стоит учитывать локальную нагрузку на агентов (удалённые машины), нагрузку на сеть, время на организацию всего этого дела и ещё много деталей, которые скрыты под капотом.

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

0826_IncrediBuild_ru/image14.png

Я запустил по пять раз и посчитал среднее по запускам (эти цифры вы и видели в графиках) :)

Популярные статьи по теме
Эффект последней строки

Дата: 31 Май 2014

Автор: Андрей Карпов

Я изучил множество ошибок, возникающих в результате копирования кода. И утверждаю, что чаще всего ошибки допускают в последнем фрагменте однотипного кода. Ранее я не встречал в книгах описания этого …
Как и почему статические анализаторы борются с ложными срабатываниями

Дата: 20 Мар 2017

Автор: Андрей Карпов

В своей предыдущей статье я писал, что мне не нравится подход, при котором статические анализаторы кода оцениваются с помощью синтетических тестов. В статье приводился пример, воспринимаемый анализат…
Главный вопрос программирования, рефакторинга и всего такого

Дата: 14 Апр 2016

Автор: Андрей Карпов

Вы угадали, ответ - "42". Здесь приводится 42 рекомендации по программированию, которые помогут избежать множества ошибок, сэкономить время и нервы. Автором рекомендаций выступает Андрей Карпов - тех…
Бесплатный PVS-Studio для тех, кто развивает открытые проекты

Дата: 22 Дек 2018

Автор: Андрей Карпов

В канун празднования нового 2019 года команда PVS-Studio решила сделать приятный подарок всем контрибьюторам open-source проектов, хостящихся на GitHub, GitLab или Bitbucket. Им предоставляется возмо…
Как PVS-Studio оказался внимательнее, чем три с половиной программиста

Дата: 22 Окт 2018

Автор: Андрей Карпов

PVS-Studio, как и другие статические анализаторы кода, часто выдаёт ложные срабатывания. Но не стоит спешить считать странные срабатывания ложными. Это короткая история о том, как PVS-Studio вновь ок…
PVS-Studio ROI

Дата: 30 Янв 2019

Автор: Андрей Карпов

Время от времени нам задают вопрос, какую пользу в денежном эквиваленте получит компания от использования анализатора PVS-Studio. Мы решили оформить ответ в виде статьи и привести таблицы, которые по…
Технологии, используемые в анализаторе кода PVS-Studio для поиска ошибок и потенциальных уязвимостей

Дата: 21 Ноя 2018

Автор: Андрей Карпов

Краткое описание технологий, используемых в инструменте PVS-Studio, которые позволяют эффективно обнаруживать большое количество паттернов ошибок и потенциальных уязвимостей. Статья описывает реализа…
PVS-Studio для Java

Дата: 17 Янв 2019

Автор: Андрей Карпов

В седьмой версии статического анализатора PVS-Studio мы добавили поддержку языка Java. Пришло время немного рассказать, как мы начинали делать поддержку языка Java, что у нас получилось и какие дальн…
Характеристики анализатора PVS-Studio на примере EFL Core Libraries, 10-15% ложных срабатываний

Дата: 31 Июл 2017

Автор: Андрей Карпов

После большой статьи про проверку операционной системы Tizen мне было задано много вопросов о проценте ложных срабатываний и о плотности ошибок (сколько ошибок PVS-Studio выявляет на 1000 строк кода)…
Статический анализ как часть процесса разработки Unreal Engine

Дата: 27 Июн 2017

Автор: Андрей Карпов

Проект Unreal Engine развивается - добавляется новый код и изменятся уже написанный. Неизбежное следствие развития проекта - появление в коде новых ошибок, которые желательно выявлять как можно раньш…

Комментарии (0)

Следующие комментарии

На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Этот сайт использует куки и другие технологии, чтобы предоставить вам более персонализированный опыт. Продолжая просмотр страниц нашего веб-сайта, вы принимаете условия использования этих файлов. Если вы не хотите, чтобы ваши данные обрабатывались, пожалуйста, покиньте данный сайт. Подробнее →
Принять