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.
А вот собирать ядро я не рекомендую, только если у вас не абсолютно одинаковые машины с одинаковой осью, компилером и библиотеками – иначе будут проблемы.
Пишите комменты, пинайте, спрашивайте, мучайте… Всегда рад ответить =) И кстати, это моя первая статья такой тематики и такого масштаба, так что приму конструктивную критику.







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