4/04/2010

Распределенная компиляция: Gentoo Ubuntu и distcc

На моей домашней машине стоит Gentoo Linux, а это значит я постоянно там что нибудь компиляю. Так вот я уже много всяких штук перепробовал для ускорения компиляции, таких как ccache, компиляция в оперативной памяти. И вот недавно, в связи с приобретением ноутбука, появилась возможность установить и настроить distcc для распределенной компиляции.

Итак что мы имеем:

1. Desktop :
  • AMD Athlon (tm) 64 3000+, 2 гб. оперативной памяти.
  • Gentoo Linux x86_64, 2.6.33 - linux kernel, gcc version 4.4.3
2. Laptop :
  • Intel(r) Core(tm) i3 CPU M 330, 2.13GHz, 3 гб. оперативной памяти.
  • Ubuntu Linux x86_64, 2.6.33 - linux kernel, gcc version 4.4.3
Для того, чтобы собранные с помощью distcc бинарники работали, необходимо, чтобы
первые две цифры в версии компилятора были одинаковыми.

Настройка Ubuntu.
Устанавливаем компиляторы и distcc:

sudo apt-get install gcc g++ distcc

Затем добавляем в файл /etc/distcc/hosts адрес хоста, на котором можно запускать кrомпиляцию и через "/" максимальное количество потоков, которое способен принять для компиляции компьютер:

echo "192.168.2.1/2" > /etc/distcc/hosts

Далее нужно настроить демон distcc который будет принимать файлы для компиляции от Desktop компьютера. Для этого редактируем файл /etc/default/distcc где устанавливаем какой интерфейс слушать, сколько работ может принимать хост для компляции и т.д. Вот пример моего файла конфигурации:

STARTDISTCC="true"
ALLOWEDNETS="127.0.0.1 192.168.2.1"
LISTENER="192.168.2.2"
NICE="10"
JOBS="4"

После этого запускаем демон distcc:

/etc/init.d/distcc start

Настройка Gentoo.
Устанавливаем distcc :

emerge -v distcc

Указываем список хостов, на которые передавать данные для компиляции и количество потоков:

/usr/bin/distcc-config --set-hosts "
192.168.2.1/2 192.168.2.2/4"

настраиваем демон distcc, добавляя в файл /etc/conf.d/distccd следующие строки:

DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.2.2"
DISTCCD_OPTS="${DISTCCD_OPTS} --listen 192.168.2.1"
DISTCCD_OPTS="${DISTCCD_OPTS} --jobs 2"


запускаем distcc:

/etc/init.d/distccd start

Для того, чтобы проверить, что все настроено правильно добавляем в Gentoo в файл /etc/make.conf строчку:

FEATURES="distcc"

и пробуем собрать какой нибудь пакет:

emerge dev-libs/glib

И в то же самое время, смотрим на Ubuntu файл логов distcc. Если все работает нормально, то сообщения должны быть примерно такими:

distccd[5791] (dcc_job_summary) client: 192.168.2.1:55352 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:67ms x86_64-pc-linux-gnu-gcc /var/tmp/ccache/api.tmp.ZION.23853.i

Возможные проблемы.

Я столкнулся со следующей проблемой. В логах на машине с Ubuntu у меня появлялась строчка:

distccd[4506] (dcc_execvp) ERROR: failed to exec x86_64-pc-linux-gnu-g++: No such file or directory.

Это сообщение появлялось из за того, что в Gentoo компилятор называется x86_64-pc-linux-gnu-g++ а в Ubuntu x86_64-linux-gnu-g++.
Чтобы это вылечить, нужно создать в каталоге /usr/bin/ символическую ссылку:

ln -s g++ x86_64-pc-linux-gnu-g++

6 комментариев:

  1. А возможна ли компиляция между разными архитектурами? Например, на одной машине x86, а на другой x86_64?

    ОтветитьУдалить
  2. А как это использовать в debian?
    У меня сеть мощных рабочих станций под debian. Можно сказать, простаивает ;-)
    Я хочу для того же debian и собирать пакеты.

    ОтветитьУдалить
  3. Да компиляция возможна. Но у меня почему то пока не получается настроить между x86 и x86_64. Я как только настрою, расскажу как это сделать.
    В теории все просто. Ставишь на машине кросс-компилятор (в Gentoo с помощью утилиты crossdev) и и вперед.

    ОтветитьУдалить
  4. К сожалению я не большой знаток дебиана. Но в теории можно распределенно компилировать любой код, указав в качестве компилятора distcc
    например так:
    CC=distcc make

    ОтветитьУдалить
  5. А нужен ли distccd на генте? С убунты же врядли что-то будет компилиться?
    Еще стоить упомянуть pump-mode для distcc, дает еще больше скорости.
    Кроскомпиляцию делал по http://www.gentoo.org/doc/en/cross-compiling-distcc.xml , но в данном случае crossdev нужно ствить на убунту же.

    ОтветитьУдалить
  6. distccd на генте нужен, если хост с гентой тоже используется для компиляции. У меня как раз такой случай.
    Про pump-mode слышал, но пока времени нет до него добраться чтобы попробовать.

    ОтветитьУдалить