Distcc/ru

Distcc — это программа, предназначенная для распределения по сети задач компиляции в рамках набора хостов. Она состоит из серверной части — и клиентской —. После небольшой настройки distcc может прозрачно работать с ccache, Portage и с небольшой настройкой Automake.

Если планируется использовать для начальной сборки (bootstrap) установки Gentoo, обратите внимание на раздел использование distcc для bootstrap.

Установка
Перед настройкой сперва нужно установить пакет  на все хосты.

Требования для всех хостов
Для работы с все компьютеры в сети должны иметь GCC одной версии. К примеру, можно использовать на разных машинах 3.3.x (где x — разные), а смешивание 3.3.x с 3.2.x может привести к ошибкам при компиляции или выполнении.

Убедитесь, что все системы используют одну и ту же версию binutils (eselect binutils list) в противном случае многие пакеты могут выдавать различные ошибки линковки, такими как text relocation

Emerge
Distcc поставляется с графическим монитором для отслеживания заданий, отправляемых компьютером на компиляцию. Данный монитор включается, когда установлен USE-флаг.

После настройки USE-флагов установите пакет :

Сервис
Выполните следующие инструкции для того чтобы запускался автоматически.

OpenRC
Отредактируйте и убедитесь, что с помощью директивы   разрешены только доверенные клиенты. Для усиления безопасности можно также добавить директиву, сообщив с её помощью демону , на каком IP ожидать соединений (для систем с несколькими адресами). Подробнее о безопасности в можно почитать в Distcc security notes.

Следующий пример разрешает distcc клиентам, работающим на  и , подключатся к локально запущенному серверу :

Теперь запустите демон на всех участвующих компьютерах:

systemd
Отредактируйте файл для добавления доверенных клиентов в CIDR формате. Пример ниже добавляет все IP-адреса из диапазона 192.168.1.xxx:

Перезагрузите unit-файлы после изменений:

Включите автозагрузку и запустите сервис:

Определение участвующих хостов
Для задания списка хостов используйте команду.

В следующем примере показан список определения хостов. Вариантов из первой и второй строки в большинстве случаев достаточно. В последнем используется (число)  синтаксис, чтобы сообщить  о максимально возможном количестве задач, которые можно запустить на этом узле. Подробнее о синтаксисе, использованном в третьей и четвертой строках, можно прочитать в man-странице distcc.

Есть также несколько других методов для настройки хостов. За подробностями обратитесь к man-странице.

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

Настроим для компиляции на хостах из первой строчки примера:

Также, distcc поддерживает режим "pump" через вызов команды. Такой режим может значительно сократить время сборки при компиляции нескольких файлов параллельно. Он кэширует нужные заголовочные файлы перед компиляцией на сервере, и, как следствие, не требуется повторная загрузка и обработка этих файлов.

Чтобы настроить хост для работы в режиме pump, добавьте суффикс  в определение хостов. Для режим pump необходимы оба флага  и   (независимо от того, какие файлы будут компилироваться C или C++).

С Portage
Весьма легко настроить Portage для работы с. Речь идет о включении функции, а также о настройки подходящего количества одновременно выполняемых задач (так как увеличивает доступное количество ресурсов для компиляции).

Установите переменные MAKEOPTS и FEATURES как показано ниже.

Общепринятая стратегия
 * установите  в удвоенное значение от всех (локальных + удалённых) ядер CPU + 1,
 * установите  число равное количеству локальных ядер CPU.

Использование  в переменной MAKEOPTS предотвращает запуск чрезмерно большого количества заданий в случаях, когда некоторые  хосты кластера недоступны (увеличивая количество одновременных заданий для других систем) или когда ebuild настроен так, что устанавливаемый пакет запрещает удаленную компиляцию (например, gcc). Это достигается за счет отказа начинать новые задачи компиляции, если нагрузка на систему становится равной  или выше.

Например, если запущен на двух четырехъядерных хостах, а локальный компьютер оснащен двухъядерным процессором, то переменная MAKEOPTS может выглядеть так:

CFLAGS и CXXFLAGS
Не используйте  в переменных CFLAGS и CXXFLAGS файла. Если march установлен в, то  не сможет распределить работу по другим машинам. Подходящее значение для  можно получить с помощью следующей команды:

Подробности можно найти на странице Inlining  for distcc.

A GCC bug has recently been fixed in the 8.0 dev tree which facilitates a more reliable and succinct mechanism for extrapolating appropriate machine flags. The fix has been backported to the 6 and 7 branches and should be released fairly soon. Some processing is still required and a script can be found in the distccflags repo, or via :

С automake
Иногда это проще настройки Portage. Всё, что нужно сделать, это обновить переменную PATH, добавив перед каталогом, содержащим. С одной оговоркой. Если используется, то нужно поместить путь к после пути к :

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

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

Для bootstrap
Для использования для bootstrap (то есть скомпилировать рабочие toolchain перед установкой оставшейся части системы) требуются некоторые дополнительные шаги.

Шаг 1: настройка Portage
Загрузите новую машину с Gentoo Linux LiveCD и следуйте инструкциям по установке, учитывая инструкции по начальной сборке (bootstrapping) в FAQ по Gentoo. Затем настройте Portage для использования :

Также, обновите переменную PATH в установочной сессии:

Шаг 2: установка distcc
Установите :

Шаг 3: настройка distcc
Запустите для настройки distcc; замените в примере   на IP-адреса или имена хостов, принимающих участие в компиляции.

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

Дополнительно
У программы есть множество дополнительных возможностей и приложений, помогающих работать в окружении.

Утилиты для мониторинга
Distcc поставляется с двумя инструментами мониторинга. Текстовая утилита для мониторинга собирается всегда и называется. Интерфейс поначалу может смутить, но на самом деле использовать его очень просто. Если запустить программу без параметров, она просто запустится однократно. Однако, если передать ей в качестве параметра число, то информация будет обновляться каждые   секунд.

Другая утилита для мониторинга включается с помощью USE-флага. Она основана на GTK+, запускается в окружении X и достаточно приятна. В Gentoo, чтобы избежать путаницы, GUI-монитор переименован в (оригинальное название — ).

Чтобы наблюдать за тем, как Portage использует, запустите:

Трюк: задайте DISTCC_DIR в переменном окружении:

Теперь, обновите окружение:

И наконец, запустите графическую оболочку приложения:

SSH для взаимодействия
В настройке distcc через SSH есть подводные камни. Во-первых, сгенерируйте ключевую пару SSH без пароля. Учтите, что Portage компилирует программы из-под пользователя portage (по умолчанию как root, если не включена ). Домашний каталог пользователя portage —, поэтому ключи должны храниться в.

Во-вторых, сделайте для каждого хоста раздел в файле конфигурации SSH:

Отправьте публичный ключ на все ноды, участвующие в компиляции:

Убедитесь также, что каждый из хостов есть в файле :

Измените владельца так:

Чтобы настроить хосты  и , выполните:

Обратите внимание на знак, с его помощью в distcc указываются ssh-хосты.

Наконец, сообщите какой бинарный файл SSH нужно использовать:

Если взаимосвязь осуществляется через SSH, нет нужды запускать  init-скрипт на хостах.

Тестирование
Чтобы протестировать работу напишите простую Hello distcc программу и запустите  в подробном режиме (verbose), чтобы убедится, что взаимосвязь между хостами distcc работает хорошо.

Далее, включите подробный режим, скомпилируйте программу с помощью и слинкуйте сгенерированный объектный файл в исполняемый:

There should be a bunch of output about finding its configuration, selecting the host to connect to, starting to connect to it, and ultimately compile. If the output does not list the desired hosts, check the configuration.

Наконец, проверьте, что скомпилированная программа работает хорошо. Чтобы протестировать все хосты, перечислите все хотсы компиляции в файле hosts.

Устранение проблем
Следующий раздел может помочь в решении проблем, если такие встречаются при использовании.

ERROR: failed to open
По состоянию на 22 января 2015 года файл в  не правильно создается. По-видимому это затрагивает только версию 3.1-r8 distcc. Эта ошибка еще решается (смотрите ). Ее можно решить самостоятельно, создав файл журнала и назначив ему правильного владельца. После этого перезапустите демон distccd:

Затем, в конфигурационном файле, который располагается в , измените на каталог , который был создан ранее:

Наконец, перезапустите сервис distccd:

Некоторые пакеты не используют distcc
Можно заметить, что сборка некоторых пакетов не распределяется по хостам (и не происходит параллельно, т. е. в несколько процессов). Такое может происходить, когда пакета не поддерживает параллельные операции, или мейнтейнер ebuild’а явно отключил их, чтобы избежать известных проблем.

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

Смешанные версии GCC
Если на взаимодействующих хостах разные версии GCC, то велика вероятность возникновения очень странных проблем. Решение — установить на все хосты одну версию GCC.

После недавных обновлений Portage стал использовать  (минус gcc) вместо. Это значит, что совместное использование i686-машин с машинами других типов (i386, i586) может вызвать проблемы со сборкой. Обходным решеним может быть запуск:

Можно задать переменные CC и CXX в в списком значений из команды выше.

-march=native
GCC, начиная с версии 4.3.0, поддерживает параметр, который включает автоматическое определение CPU, на котором запущен GCC, и оптимизаций, которые стоит включить для него. Это создает проблемы при использовании, так как допускает смешивание оптимизированного для разных процессоров кода. К примеру, запуск с   на системе с процессором AMD Athlon и на другой системе с процессором Intel Pentium приведет к смешиванию кода, скомпилированного на обоих процессорах.

Обратите внимание на следующее предупреждение:

Посмотрите раздел CFLAGS и CXXFLAGS и использование  в distcc для подробной информации.

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

Подробный журнал потом можно найти в.

Keep in mind that the first invocation visible in  isn’t necessary the first  call during a build process. For example a build server can get a one-minute backoff period during the configuration stage when some checks are performed using a compiler ( sets a backoff period when compilation on a remote server failed, it doesn’t matter whether it failed on local machine or not).

Поищите в каталоге, что изучить такую ситуацию. Найдите другие журналы или вызовите непосредственно из рабочего каталога.

DISTCC_SAVE_TEMPS — это еще одна интересная переменная. Когда она установлена, сохраняется стандартный поток вывода/ошибок с удаленного компилятора, который использует Portage, в файлы расположенные в каталоге.

Смотрите также

 * Руководство по кросс-компиляции с distcc расскажет как компилировать программу на компьютере одной архитектуры для выполнения ее на другой архитектуре при помощи . Это может быть так же просто, как компилировать на Athlon (i686) для выполнения на K6-2 (i586), или компилировать на SPARC для выполнения программы на PowerPC.

Внешние ресурсы

 * Inlining  for distcc
 * Distcc homepage