Предыстория:
- У меня есть 128-ядерный сервер, который я хотел бы использовать в качестве сервера сборки.
- У меня есть куча клиентских машин, которые работают с не таким уж новым и не очень мощным ПК. (Невозможно обновить! Не в моей власти.)
Что я сделал:
- Я следовал документации distcc.
- И установил на сервер виртуальную машину с точно такой же версией компилятора, той же версией distcc -- в принципе, с тем же дистрибутивом, что и на клиентских машинах.
- После настройки клиентов и серверов я могу удаленно строить. Я могу проверить это с помощью инструмента
distccmon-text
. Я вижу на сервере 8 потоков, запущенных демоном distcc и ожидающих выполнения заданий сборки. Это было хорошо в качестве первого шага. Вы можете увидеть вывод ниже, чтобы быть уверенным.
- Второй шаг: поскольку клиентские машины являются двухъядерными машинами, а сервер предлагает 128 ядер, и не все клиенты будут компилироваться одновременно, я хотел перенести как можно большую часть сборки на сервер сборки.
Проблемы:
- Первая проблема: distcc, независимо от того, как я пытаюсь его настроить, всегда пытается распределить задания сборки поровну между клиентом и сервером. Хотя мой файл конфигурации выглядит так, как показано ниже:
# --- /etc/distcc/hosts -----------------------
# See the "Hosts Specification" section of
# "man distcc" for the format of this file.
#
# By default, just test that it works in loopback mode.
# 127.0.0.1
172.24.26.208/8,cpp,lzo
localhost/0
Который согласно документации distcc должен давать более высокий приоритет серверу сборки и более низкий приоритет локальному хосту, поскольку он появляется позже в списке. Кроме того, он должен предоставить 8 заданий на сервер сборки и 0 заданий на локальный хост. Но нет, так не бывает. При вводе make -j8
он пытается запустить 4 потока на локальном хосте и 4 на удаленном. Не очень хорошо. Это вы можете увидеть на изображении ниже.
- Вторая проблема: вы также заметите, что предварительная обработка выполняется на локальном компьютере. Для этого есть инструмент, который поставляется с distcc. Это называется "distcc-pump" или режим насоса, и его можно использовать следующим образом.
time pump make CC="distcc gcc" CXX="distcc g++" -j8
К сожалению, в режиме насоса или нет, предварительная обработка происходит на localhost
, как вы можете видеть на изображении выше. Грустно.
Примечание. Программа distcc
ни в коем случае с приведенными здесь конфигурациями не выдает никаких ошибок или предупреждений ни на сервере, ни на клиентах.
Версии:
- gcc 4.4.5
- distcc 3.2rc1.2
(Прежде чем кто-то предложит - "обновите программное обеспечение!", более новые версии, скорее всего, для меня невозможны. В любом случае, эта версия distcc предлагает функции, которые мне нужны. Также я могу обновить виртуальную машину сервера, но тогда будет несоответствие версии компилятора между клиентами и сервером. Клиенты, которые я не могу обновить.)
Приветствуются любые предложения, отзывы о том, как улучшить эту настройку/(исправить проблемы).