Twitter: Болезнь прошла, пришли типичные будни. Скоро 18, но я этого не чувствую. 4 mins ago
10
Июнь

distcc – распределенная компиляция

После покупки нетбука я серьезно задумался о том, как бы ускорить процесс компиляции разного софта, которого нет в бинарном виде… Собирать, скажем, wine с фиксом для warcraft 3 требует полной пересборки, а wine софтина тяжелая, и собирается крайне лениво. Да и грузить несчастный atom по максимуму тоже не особо хочется. Впрочем, выход был найден достаточно быстро. distcc – система для распределенного компилирования.

Для начала о том, на чем все это тестировалось.

1. Для чего собиралось – HP 2140, Intel Atom 1.6 GHz, RAM 2 GB, ArchLinux.
2. Нода 1 – PC, Intel Core 2 Duo e 6550, 2.33 GHz, 1 GB RAM, Ubuntu Linux 9.04
3. Нода 2 – Acer Aspire 5720G, Intel Core 2 Duo T7300, 2 GHz, 2 GB RAM, Ubuntu Linux 9.04

Впрочем, ноды могут быть и на FreeBSD, и на Solaris – роли это не играет. Желательно только чтобы ветка gcc везде была одна, например gcc 4, хотя и это не обязательно.

Итак, поехали.

Ставим distcc из репозитариев. Он есть в бинарном виде в репах и у арча, и у убунты.

Правим конфиги. В ubuntu: /etc/default/distcc, archlinux – /etc/conf.d/distcc. Конфиги понятны, снабжены справкой и т. п. Я рекомендую закомментить строку LISTENER, чтобы демон слушал все сетевые интерфейсы, и изменить строку ALLOWEDNETS=”192.168.1.0/24″- так указано у меня для моей домашней сети.

Аналогично проделываем для всех машин. Все? Запускаем демона через /etc/init.d/distccd start для Убунты, и /etc/rc.d/distcc start для ArchLinux.

Теперь надо настроить компилятор для того, чтобы он использовал distcc. Так как я софт собираю арчевой утилитой makepkg, я могу это сделать через конфиг /etc/makepkg.conf , и приведу пример для него.
Для начала, уберем знак ! перед distcc в параметре BUILDENV, тем самым включив distcc. Затем идем в DISTCC_HOSTS и пишем там через пробел IP адреса машин с запущенным демоном distcc. Можно добавить после хоста параметр сжатия – /10,lzo, например 192.168.1.13/10,lzo. Локалхост писать не надо если в кольце больше 2х машин – он занимается обработкой данных. Если хотите собирать заодно и на 127.0.0.1 – пишите в массив. Ну и наконец переходим к параметру MAKEFLAGS и пропишем там количество потоков. Я взял 8 – на каждый двухъядерный проц 3 потока, и на Atom 2.

Теперь запустим компиляцию при помощи makepkg. Сделаем, например, yaourt -S wine-w3fix в арчлинухе, запустив тем самым сборку wine с фиксом для warcraft 3 из AUR. Теперь надо посмотреть статистику использования distcc.

Как это сделать? Есть два варинта. Первый – distccmon-text – текстовый монитор, показывающий потоки, и distccmon-gnome – на базе GTK.

Не работает? Смотрите /var/log/distccd.log. И пишите мне, чем смогу помогу.

Как собирать просто при помощи make? Надо выставлять, например, вот такие флаги:

CC='distcc gcc' CXX='distcc g++'

И стартовать make при помощи make -jN, где N – колво потоков.

Что же мы получим на выходе? Нужный нам бинарник, разумеется. Все флаги передаются на ноды – если вы собирали с -O2 и -march=prescott, то на всех нодах файлы будут собираться с этими флагами. Вы ничего не потеряете при сборке с помощью distcc.

Кстати говоря, Вы можете спокойно собирать софт при помощи distcc и на других машинах, вот на примере моей конфигурации Вы можете собирать софт на Acer Aspire, используя мощности PC и Atom.

А вот собирать ядро я не рекомендую, только если у вас не абсолютно одинаковые машины с одинаковой осью, компилером и библиотеками – иначе будут проблемы.

Пишите комменты, пинайте, спрашивайте, мучайте… Всегда рад ответить =) И кстати, это моя первая статья такой тематики и такого масштаба, так что приму конструктивную критику.

Комментарии (2) к записи “distcc – распределенная компиляция”

  1. Jazz пишет:

    distcc, если мне не изменяет память, очень плохо распределяет задания между неравными узлами… Если нужная машина очень слабая, лучше использовать целевую компиляцию. Правда, HP 2140 это не грозит

  2. x-demon пишет:

    Говорят, пофиксили


Оставить комментарий


Имя (обязательно):
E-Mail (обязательно):
Ваш сайт:

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Garmin Oregon 300 - обзор девайса    | Edimax EW-7318USg, или wifi адаптер для вардрайвинга    | Комплект вардрайвера в сборе    | Странные запросы к поисковикам    | Взлом wifi сетей, или воздушная тревога    | Zoundry Raven Opensource    | Archlinux repo - [xdemon-repo]    |
BlogMemes.ru blogo blogboosterpopularsite