Как использовать distcc для предварительной обработки и компиляции всего удаленно?

Предыстория:

  • У меня есть 128-ядерный сервер, который я хотел бы использовать в качестве сервера сборки.
  • У меня есть куча клиентских машин, которые работают с не таким уж новым и не очень мощным ПК. (Невозможно обновить! Не в моей власти.)

Что я сделал:

  • Я следовал документации distcc.
  • И установил на сервер виртуальную машину с точно такой же версией компилятора, той же версией distcc -- в принципе, с тем же дистрибутивом, что и на клиентских машинах.
  • После настройки клиентов и серверов я могу удаленно строить. Я могу проверить это с помощью инструмента distccmon-text. Я вижу на сервере 8 потоков, запущенных демоном distcc и ожидающих выполнения заданий сборки. Это было хорошо в качестве первого шага. Вы можете увидеть вывод ниже, чтобы быть уверенным.

введите здесь описание изображения

  • Второй шаг: поскольку клиентские машины являются двухъядерными машинами, а сервер предлагает 128 ядер, и не все клиенты будут компилироваться одновременно, я хотел перенести как можно большую часть сборки на сервер сборки.

Проблемы:

  1. Первая проблема: 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 на удаленном. Не очень хорошо. Это вы можете увидеть на изображении ниже.

введите здесь описание изображения

  1. Вторая проблема: вы также заметите, что предварительная обработка выполняется на локальном компьютере. Для этого есть инструмент, который поставляется с distcc. Это называется "distcc-pump" или режим насоса, и его можно использовать следующим образом.
time pump make CC="distcc gcc" CXX="distcc g++" -j8

К сожалению, в режиме насоса или нет, предварительная обработка происходит на localhost, как вы можете видеть на изображении выше. Грустно.

Примечание. Программа distcc ни в коем случае с приведенными здесь конфигурациями не выдает никаких ошибок или предупреждений ни на сервере, ни на клиентах.

Версии:

  • gcc 4.4.5
  • distcc 3.2rc1.2

(Прежде чем кто-то предложит - "обновите программное обеспечение!", более новые версии, скорее всего, для меня невозможны. В любом случае, эта версия distcc предлагает функции, которые мне нужны. Также я могу обновить виртуальную машину сервера, но тогда будет несоответствие версии компилятора между клиентами и сервером. Клиенты, которые я не могу обновить.)

Приветствуются любые предложения, отзывы о том, как улучшить эту настройку/(исправить проблемы).


person Duck Dodgers    schedule 09.04.2019    source источник


Ответы (2)


EDIT: эти решения не работают, я дал ответ, чтобы кто-то другой не предложил их снова


Попробуйте

person bruno    schedule 09.04.2019
comment
В порядке. Спасибо за подсказки, @bruno. Позвольте мне попробовать после обеда. Я возвращаюсь к вам. - person Duck Dodgers; 09.04.2019
comment
Удаление localhost из файла, содержащего hosts, не помогло. Это по-прежнему будет давать задания на сборку локальному хосту. 2-ю часть (визави 127.0.0.1 вместо localhost) надо еще попробовать. - person Duck Dodgers; 09.04.2019
comment
@JoeyMallone иначе не используйте distcc, а ssh 172.24.26.208 "cd ...; gcc -j8 ..." ;-) - person bruno; 09.04.2019
comment
... три точки! o.O. В порядке. Как только я смогу снова получить эту машину для тестирования, я тоже попробую. Еще раз спасибо за время @bruno! Очень признателен! - person Duck Dodgers; 09.04.2019
comment
Наконец-то мне удалось заполучить тестовую машину, и я попробовал несколько вещей, заменив строку localhost/0 на 127.0.0.1/0 --› это отправляет все задачи сборки на локальный хост, даже если сервер сборки находится над ним в списке хостов. 127.0.0.1/1 --› имеет тот же эффект, что и localhost, то есть сборки делятся пополам. Полное удаление строки localhost/127.0.0.1 также распределяет задачи пополам. - person Duck Dodgers; 10.04.2019
comment
@JoeyMallone хорошо, извините, что не решил вашу проблему, явно есть ошибка в distcc - person bruno; 10.04.2019
comment
да вроде так. Попробую с более новыми версиями. Спасибо за ваше время @bruno. - person Duck Dodgers; 10.04.2019

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.

person Matthias Doerfel    schedule 25.01.2020
comment
Спасибо вам большое за ваш ответ. Я попробую это на следующей неделе и вернусь к вам. - person Duck Dodgers; 26.01.2020