nixp.ru v3.0

23 января 2017,
понедельник,
20:01:56 MSK

DevOps с компанией «Флант»
Longobard написал 25 июня 2004 года в 17:31 (411 просмотр) Ведет себя как мужчина; открыл 291 тему в форуме, оставил 2499 комментариев на сайте.

Решили линуксоиды локалки (нашей) состряпать кластер. Но не нашели нормального ПО под 2.6 ядра, на 2.4 переходить никто не хотел. И тогда решили попробовать distcc — ПО для распределенной компиляции. Короче ускорение около 80% при четырех (пока) серверах.

http://www.gentoo.org/doc/en/distcc.xml

Вот дока

Вот скриптик чтобы не скашит сетку как это штатная утила делает (за такое и фильтрануть могут), а смотрит только нужные сервера. Скрипт состряпан за полчасика %)

Он занимается тем, что зачитывает из файла /etc/distcc/allhosts список людей, содержащих distccd, проверяет у них наличие работающего 3632 порта и конфигурирует систему на работу с «живыми».

Файл allhosts содержит строку где-то такого вида:

localhost 10.1.1.67 10.1.1.76 …

себя (localhost) включать обязательно. Разделитель — 1 (один) пробел.

#!/bin/bash
if [ ! -f /etc/distcc/allhosts ]; then
echo "please create file /etc/distcc/allhosts with space-separated list of hosts"
exit -1
fi
hosts=""
port=3632
n=0
for host in `cat /etc/distcc/allhosts | sed -e 's/ /\n/g'`
do
#ping it
#ping -c 1 -q -W 1 $host 2>&1 > /dev/null
#test if port is open
perl -e "use IO::Socket; IO::Socket::INET->new(Proto=>\"tcp\", PeerAddr=>\"$host\", PeerPort=>\"$port\", Timeout=>\".10\") || exit -1"
if [ $? -ne 0 ]; then
echo "$host is down"
else
echo "$host is up"
if [ -z "$hosts" ]; then
hosts=$host
else
hosts="$hosts $host"
fi
n=$(( $n+1 ))
fi
done
n=$(( $n*2+1 ))
#configure distcc
distcc-config --set-hosts "$hosts"
#patch /etc/make.conf
echo "setting -j to $n"
sed -e "s/^MAKEOPTS\(.*\)-j\([0-9]\)\(.*\)$/MAKEOPTS=\"-j$n\3/g" /etc/make.conf > /tmp/make.conf
mv /tmp/make.conf /etc/make.conf >/dev/null 2>&1

Вот такой вот скриптик. Чтобы сразу перед комиляцией он запускался — линк на emerge, сам emerge убираем куда-нить шоб в PATH его не было, в скриптике пишем:

#!/bin/bash
distccscan.sh  #это тот скриптик что выше выложен
emerge "$@"

И усе :) И будет щастье гентушникам :)

Genie
for host in `cat /etc/distcc/allhosts | sed -e ’s/ /\n/g’`

Вызов sed соверiенно лишний.

perl -e «use IO::Socket; IO::Socket::INET->new(Proto=>\«tcp\», PeerAddr=>\«$host\», PeerPort=>\«$port\», Timeout=>\«.10\») || exit -1»


есть такая программка — nsmon…. :) делает именно это.

n=$(( $n+1 ))


let n++

let n=n+1

n=$(( $n*2+1 ))


let n=2*n+1

if [ -z "$hosts" ]; then

hosts=$host

else

hosts="$hosts $host»

fi


hosts="$hosts $host»

себя (localhost) включать обязательно. Разделитель — 1 (один) пробел.

не только 1 пробел строго. можно много, можно табудяцию, можно по одному на строчку.

а localhost можно явно прописать тут

distcc-config —set-hosts «$hosts»


distcc-config —set-hosts «localhost $hosts»

Longobard

Короче не суть, главное что все пашет на ура! Теперь закупили ящик пива и на выходных будем прикручивать ОпенМосикс к 2.6 :) Попробуем налабать патчик :)

Uncle Theodore
LONGOBARD
Короче не суть, главное что все пашет на ура! Теперь закупили ящик пива и на выходных будем прикручивать ОпенМосикс к 2.6 :) Попробуем налабать патчик :)

Вот это — правильная идея! Результатом поделишься?

Good Luck,

UT

Longobard
Uncle Theodore
Вот это — правильная идея! Результатом поделишься?

Good Luck,

UT

Если он будет — поделюсь :)

Longobard

Разобрался как заставить любую софтину компиляцца через distcc. Все они компиляются через make. Вопщем делаю так:

пишу скриптик emerge:

#!/bin/bash
distccscan.sh
source /etc/profile
export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:$PATH"
/usr/bin/emerge $@

И пихаю его в /bin

Пишу скриптик make и пихаю его в /bin:

#!/bin/bash
source /etc/profile
export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:$PATH"
MAKE_J_OPT=`cat /tmp/distccscan-tmp`
rm /tmp/distccscan-tmp
/usr/bin/make -j$MAKE_J_OPT $@

В скрипте коса в конце вставил такую строчку:

touch /tmp/distccscan-tmp
echo $n > /tmp/distccscan-tmp

Вопщем теперь при команду emerge все собирается через distcc, потом запускается make для компиляции проги — и make также через distcc! Проверено: многие проги (например mplayer) в ноомальном виде собираются на локалхосте, через distcc никак. А после всех этих телодвижений тот же самый mplayer собрался у меня через distcc! Ура! Самая главная проблема решена :)

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.