вторник, 4 августа 2009 г.

distcc 3.1-1 и pump mode

Ну вот добрались и до pump mode. Что это за зверь? Это режим, который заставляет удаленный хост компилировать не только C/C++ файлы, но и хедеры. Подробно разница между pump и простым режимом работы distcc изложена в man по distcc. Режим pump, по идее, серьезно ускоряет компиляцию, поскольку обработка хедеров перенесена с localhost на сервер(ы).

Но этот подход также создает и ряд проблем. Понятно, что во время компиляции исходные файлы проекта не должны меняться, но это-то как раз не препятствие для большинства проектов. Гораздо серьезнее, что pump не будет работать, когда на localhost и сервере находятся разные инклюды в /usr/include или /usr/local/include/. Такое может легко получиться после установки нескольких программ. Проблема идентифицирована разработчиками как "enhancement" со средним уровнем приоритета. Тем не менее, я решил попробовать использовать режим pump.

В списке компилирующих хостов надо указать, что хост будет использоваться в режиме pump и, опционально, что инклюды надо паковать перед отправкой на сервер. Делается это добавлением параметров cpp и lzo через запятую к имени/айпишнику хоста в списке:

192.168.0.180,cpp,lzo

Список хостов может быть указан в файле hosts или в переменных среды. Об этом- отдельный пост.

Перед запуском pump нужно поставить python 2.4. Не знаю, может быть, последняя версия подойдет, я не проверял. Просто поставил 2.4, а потом снес. Причины изложены ниже.

Запускается pump просто:

$ pump make -j40 CC="distcc gcc"

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

В качестве примера я компилировал все тот же vim 7.2. Хорошие новости состоят в том, что pump заработал, запустил include server, и компиляция пошла довольно бойко. Плохие новости заключаются в том, что pump под конец сломался. Вот что я получил:

distcc[26164] ERROR: compile term.c on 192.168.0.180,cpp,lzo failed
distcc[26164] (dcc_build_somewhere) Warning: remote compilation of 'term.c' failed, retrying locally
distcc[26164] Warning: failed to distribute term.c to 192.168.0.180,cpp,lzo, running locally instead
ui.c: In function ‘fill_input_buf’:
ui.c:1823: warning: ignoring return value of ‘dup’, declared with attribute warn_unused_result
distcc gcc -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -o objects/undo.o undo.c
distcc[26164] (dcc_please_send_email_after_investigation) Warning: remote compilation of 'term.c' failed, retried locally and got a different result.
distcc[26164] (dcc_note_discrepancy) Warning: now using plain distcc, possibly due to inconsistent file system changes during build
distcc gcc -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -o objects/window.o window.c
distcc gcc -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -o objects/netbeans.o netbeans.c

__________Warning: 1 pump-mode compilation(s) failed on server, but succeeded locally.
__________Distcc-pump was demoted to plain mode. See the Distcc Discrepancy Symptoms section in the include_server(1) man page.

Ближе к завершению процесса один из файлов не скомпилировался на сервере, поэтому distcc переключился в обычный режим. Я пробовал выключить упаковку инклюдов (убрать параметр lzo), но это проблему не решило. Копать глубже надо, наверное, отсюда, но желания особого нет.

Еще одна особенность режима pump, которая мне не понравилась, это то, что вся компиляция происходит на сервере, а localhost только разбирает инклюды и отсылает их. В общем, время компиляции оказалось хуже, чем просто distcc без режима pump, чуть хуже того, что давала компиляция только на сервере.

Резюмируя, можно сказать, что pump пока сыроват, и использовать его имеет смысл только при наличии нескольких серверов.

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

Отправить комментарий