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