#gcc #build #g #distributed #distcc
#gcc #сборка #g #распределенный #distcc
Вопрос:
Предыстория:
- У меня есть 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 потока на localhost и 4 на remote. нехорошо. Это вы можете видеть на изображении ниже.
- Вторая проблема: Что вы также могли бы заметить, так это то, что предварительная обработка выполняется на локальной машине. Для этого есть инструмент, который поставляется с distcc. Это называется «distcc-pump» или режим перекачки и может использоваться следующим образом.
time pump make CC="distcc gcc" CXX="distcc g " -j8
К сожалению, в режиме прокачки или нет, предварительная обработка происходит полностью на localhost
, как вы можете видеть на приведенном выше изображении. Грустно.
Примечание: Ни в коем случае distcc
программа с конфигурациями, которые я перечислил здесь, не выдает никаких ошибок или предупреждений ни на сервере, ни на клиентах.
Версии:
- gcc 4.4.5
- distcc 3.2rc1.2
(Прежде чем кто-нибудь предложит — «обновить программное обеспечение!», более новые версии, скорее всего, для меня невозможны. В любом случае, эта версия distcc предлагает функции, которые мне нужны. Кроме того, я могу обновить виртуальную машину сервера, но тогда между клиентами и сервером возникнет несоответствие версий компилятора. Клиенты, которые я не могу обновить.)
Любые предложения, отзывы о том, как улучшить эту настройку / (устранить проблемы), приветствуются.
Ответ №1:
РЕДАКТИРОВАТЬ: эти решения не работают, я оставляю ответ, чтобы кто-то другой не предлагал их снова
Попробуйте с помощью
-
удаление строки, касающейся локального хоста в /etc/distcc/hosts c.f.https://superuser.com/questions/568133/force-most-compilation-to-a-remote-host-with-distcc
-
или может указывать 127.0.0.1 вместо localhost в /etc/distcc /hosts c.f. другая проблема, решаемая с помощью этой замены в https://distcc.github.io/faq.html
Комментарии:
1. ОК. Спасибо за подсказки, @bruno. Позвольте мне попробовать после обеда. Я возвращаюсь к вам.
2. Удаление
localhost
из файла, содержащего hosts, не сработало. Это все равно передало бы задания на сборку локальному хосту. Вторую часть (по сравнению с 127.0.0.1 вместо localhost) я все еще должен попробовать.3. @JoeyMallone еще не использовал distcc , но
ssh 172.24.26.208 "cd ...; gcc -j8 ..."
😉4.
...
три точки!o.O
. Ok. Как только я смогу получить доступ к этой машине для повторного тестирования, я попробую и это. Еще раз спасибо тебе за уделенное время @bruno! Очень признателен!5. Наконец-то я смог получить доступ к тестовой машине, и я попробовал несколько способов, заменив
localhost/0
строку на127.0.0.1/0
—> это отправляет все задачи сборки на localhost, даже если сервер сборки находится над ним в списке hosts.127.0.0.1/1
—> это имеет тот же эффект, что иlocalhost
, то есть сборки делятся пополам. Полное удалениеlocalhost/127.0.0.1
строки также распределяет задачи пополам.
Ответ №2:
distcc фактически проводит различие между удаленными и локальными процессорами. Но вопреки вашей интерпретации, в файле hosts IP-адрес 127.0.0.1 рассматривается как удаленный центральный процессор, и ожидается, что там будет запущен сервер distccd. Любое количество заданий, которые вы определяете в файле hosts, интерпретируется только для этих серверных узлов.
Согласно справочной странице, «localhost» интерпретируется особым образом. Это то, что, кажется, у вас не работает. Альтернативный синтаксис — --localslots=<int>
. Вы это проверяли?
Кроме того, distcc запускает задания на локальном хосте (том, с которого вы запускаете программу-драйвер). Во-первых, все связывания выполняются там. Во-вторых, когда вы указываете определенный параллелизм с make -jN, все задания, превышающие доступное количество удаленных заданий, также выполняются на вашем локальном хосте — в дополнение к части распределения рабочей нагрузки distcc. Опция --localslots
ограничивает их. На справочной странице здесь явно не упоминается localhost
. И затем есть те задания, которые завершаются сбоем на сервере и повторяются локально.
Для данного 128-ядерного сервера я бы использовал количество ядер в файле hosts и запускал только это количество заданий компиляции:
$ cat ~/.distcc/hosts
172.24.26.208/128,cpp,lzo
$ make -j 128
...
Тогда я ожидал бы не увидеть никаких заданий на компиляцию на локальном компьютере.
На странице руководства есть еще несколько слов о рекомендуемых номерах заданий. Найдите раздел (ы), начинающийся с distcc spreads the jobs across both local and remote CPUs.
Комментарии:
1. Большое вам спасибо за ваш ответ. Я опробую это на следующей неделе и свяжусь с вами.