Distcc/ru

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

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

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

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

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

Настройка Portage для работы с distcc
Настроить Portage для работы с distcc легко. Выполните следующие шаги на каждой системе, которая должна участвовать в распределенной компиляции:

Сначала удостоверьтесь, что установлен :

Далее, установите переменные  и   как показано ниже. Общепринятая стратегия — выбор в качестве  удвоенного числа всех (локальных + удалённых) ядер CPU + 1, а в качестве   — числа локальных ядер CPU. Флаг  предотвращает запуск чрезмерно большого количества заданий в случаях, когда некоторые хосты недоступны или устанавливаемый пакет требует локальной компиляции (например, gcc).

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

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

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

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

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

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

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

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

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

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

Настройка distcc для работы с automake
Иногда это проще настройки Portage. Всё, что нужно сделать, это обновить переменную, добавив  перед каталогом, содержащим gcc</tt>. С одной оговоркой. Если используется ccache</tt>, то нужно поместить путь к distcc после пути к ccache:

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

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

Настройка distcc для работы с ssh
В настройке distcc через ssh есть подводные камни. Во-первых, сгенерируйте ключевую пару SSH без пароля. Учтите, что portage компилирует программы из-под пользователя portage</tt>. Домашний каталог пользователя portage</tt> —, поэтому ключи должны храниться в.

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

Убедитесь также, что каждый из хостов есть в файле, и добавьте на этих хостах свой открытый ключ в файл. Хосты test1</tt> и test2</tt> можно настроить командой:

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

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

Шаг 1: настройка Portage
Загрузите новую машину с Gentoo Linux LiveCD и следуйте инструкциям по установке, учитывая инструкции по bootstrapping’у в ЧаВо по Gentoo. Затем настройте Portage для использования distcc</tt>:

Update the  variable in the installation session as well:

Step 2: getting distcc
Install :

Step 3: setting up distcc
Run distcc-config --install to setup distcc; substitute the  in the example with the IP addresses or hostnames of the participating nodes.

Distcc is now set up to bootstrap! Continue with the proper installation instructions and do not forget to run emerge distcc after running emerge @system. This is to make sure that all of the necessary dependencies are installed.

Some packages don't use distcc
As various packages are installed, users will notice that some of them aren't being distributed (and aren't being built in parallel). This may happen because the package' doesn't support parallel operations, or the maintainer of the ebuild has explicitly disabled parallel operations due to a known problem.

Sometimes distcc</tt> might cause a package to fail to compile. If this happens, please report it.

Mixed GCC versions
If the environment hosts different GCC versions, there will likely be very weird problems. The solution is to make certain all hosts have the same GCC version.

Recent Portage updates have made Portage use  (minus gcc) instead of. This means that if i686 machines are mixed with other types (i386, i586) then the builds will run into troubles. A workaround for this may be to run export CC='gcc' CXX='c++' as root in a terminal, or put it in.

-march=native
Starting with GCC 4.3.0, the compiler supports the  option which turns on CPU auto-detection and optimizations that are worth being enabled on the processor on which GCC is running. This creates a problem when using distcc</tt> because it allows the mixing of code optimized for different processors. For example, running distcc</tt> with  on a system that has an AMD Athlon processor and doing the same on another system that has an Intel Pentium processor will mix code compiled on both processors together.

Heed the following warning:

Чтобы узнать, какие флаги включит GCC при запуске с, выполните следующее:

Distcc monitors
Distcc ships with two monitoring utilities. The text-based monitoring utility is always built and is called distccmon-text</tt>. Running it for the first time can be a bit confusing, but it is really quite easy to use. If the program is run with no parameter it will run just once. However, if it is passed a number it will update every  seconds, where   is the argument that was passed.

The other monitoring utility is only enabled when the    flag is set. This one is GTK+ based, runs in an X environment, and it is quite lovely. For Gentoo, the GUI monitor has been renamed to <tt>distccmon-gui</tt> to make it less confusing (it is originally called <tt>distccmon-gnome</tt>).

To monitor Portage's <tt>distcc</tt> usage:

External resources

 * Inlining -march=native for distcc
 * Distcc homepage