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

#gcc #build #g #distributed #distcc

#gcc #сборка #g #распределенный #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 потока на localhost и 4 на remote. нехорошо. Это вы можете видеть на изображении ниже.

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

  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 предлагает функции, которые мне нужны. Кроме того, я могу обновить виртуальную машину сервера, но тогда между клиентами и сервером возникнет несоответствие версий компилятора. Клиенты, которые я не могу обновить.)

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

Ответ №1:

РЕДАКТИРОВАТЬ: эти решения не работают, я оставляю ответ, чтобы кто-то другой не предлагал их снова


Попробуйте с помощью

Комментарии:

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. Большое вам спасибо за ваш ответ. Я опробую это на следующей неделе и свяжусь с вами.