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 клиентам, работающим на  и , подключатся к локально запущенному серверу :

When logging to a file in, create the log and give appropriate permissions:

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

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

Or an example with multiple clients and a manually specified log-level

To set the proper environment variables for, place them into. For example,

For workaround, you need to edit distccd.service by running the following command.

This will open up an editor. Change the line with  directive to

Alternatively, you could also write a shell script wrapper for.

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

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

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

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

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

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

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

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

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

Hosts also need to be in:

Optionally, to set the maximum number of threads used by a host, add a forward slash "/" after each host:

The same applies to the command. If the maximum threads number is not specified, it will default to 4.

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

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

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

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

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

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

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

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

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

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

With ccache
To make Ccache work with, some prerequisites must be fulfilled:
 * Ccache is successfully set up locally
 * Distcc is successfully set up on the desired hosts

The following setup will work as follows:

Configure distccd
In order to let the daemon use, it must masquerade the path  with. Furthermore, when it uses, should use the prefix  :

Additionally must be aware of the environment variables DISTCC_DIR and CCACHE_DIR :

Next, update the environment variables:

Finally, restart the daemon to adapt all changes:

Configure ccache
First, prepare the cache directories:

The second command will create the first level directories from  to,  to  and. The following loop will then look for the first level directories, excluding the current directory  and. It then descends into each of them, creates the second level directories from to  and  to   and goes back to the previous directory , which is.

When the preparation is done, every directory - including the directory itself - must be owned by the user  :

Configure portage
To use with  and, make sure, that both features are enabled and that CCACHE_DIR is set in :

It might be redundant to set CCACHE_DIR here, since it is already defined in, mentioned here. But to make absolutely sure, configure it like that.

Remote
First enable verbose logging by setting  to   in :

After that, restart the daemon to adapt the changes:

Also check, if there are directories in - including the directory  itself - which are not owned by the user   and correct their owner permissions:

Client
Make sure, that the following environment variables are present in the current shell:

After that, navigate to a temporary directory within and compile the example mentioned below:

This will provide a verbose output, while also keeping temporary files receiving from the remote site in by default:

Any occuring error from the remote site are saved in.

If the compilation was successful, the following line will be shown.

On the remote site, it will look like this:

The important part here, is, that any symlink of is a save symlink to.

Also, on the remote site, there should be the cached file in, assuming, the example with its filename was copied from this wiki article. Generally, one can monitor the ccache size using, while compiling.

Testing distcc with ccache using emerge
Check, if necessary environment variables are present for the current shell, see here and that was configured properly, see here.

To produce some cached files on the remote site, one can compile small packages like  and   on the client:

Future usage
Make sure, that the following environment variables are always set in the desired shell:

Для 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-скрипт на хостах.

Reverse SSH
As an alternative to distcc's built-in SSH solution, a compiling server can connect to the distcc client via SSH, redirecting the client's distcc TCP port to the compiling server. There is no need for password-less SSH keys on the client.

Note that distcc uses as a literal keyword for special purpose so that  has to be used instead. For multiple compiling servers each needs its own port redirection on the client (e.g. 127.0.0.1:4000, 127.0.0.1:4001 etc). Assert that IP addresses and ports are listed in on the client.

Тестирование
Чтобы протестировать работу напишите простую 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’а явно отключил их, чтобы избежать известных проблем.

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

Rust package is known to cause excessive IO utilization as --local-load is ignored and --jobs is usually too high for local build resources. A package.env needs to be provisioned with non-distcc MAKEOPTS values to workaround this behaviour.

Смешанные версии 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 для подробной информации.

Network is unreachable
Due to network restrictions introduced by the feature, you may run into this issue. Since contradicts with this security feature, you have to disable it:

Получение более подробного вывода в логах 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, в файлы расположенные в каталоге.

Failed to create directory /dev/null/.cache/ccache/tmp: Not a directory
This error can be discovered from the standard error output file in the server if you set DISTCC_SAVE_TEMPS. It only occurs when using with.

Likely, it is because CCACHE_DIR is not properly set, or not passed correctly to. will then default to as its cache folder. However, is run by  under user distcc, which is a non-login account. See systemd section and With ccache section for setting CCACHE_DIR.

Portage build failing with errors that are apparently not connected with distcc at all
When builds are failing with errors that do not seem to be connected to distcc, but the build works with FEATURES="-distcc", it has been reported that builds sometimes fail because of DISTCC_VERBOSE=1. Try the build with DISTCC_VERBOSE=0.

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

 * Inlining  for distcc
 * Distcc homepage