2019年3月アーカイブ

CCACHE+DISTCCに設定

| コメント(0) | トラックバック(0)

DISTCCで分散コンパイルを試したが、KERNELのコンパイルは大半が同じコードをコンパイルしていると推定。CCACHEを追加することで無駄なコンパイル時間を短縮する。特に設定はしていないが

makeを

make -jXX CC="ccache distcc arm-slackware-linux-anueabi-gcc" CXX="ccache distcc arm-slackware-linux-gnueabi-g++"

でキャッシュの動作を確認した。

SlackwarearmのCurrentはarm v7以上しかリリースされていない。arm v6のRaspberry Pi Zeroは14.2までがリリースされている。distccでコンパイルを助けるにもgccのバージョンを合わせる必要がある。よって、Zeroの14.2の環境をcurrentにアップグレードが望まれる。現状、本家では望み薄なので、自分でビルドするしかない。最終的にslackware 15でRaspberry PI Zeroもサポートされることを夢見るがそれまでは、コツコツとCurrentをビルドする。まずは、開発環境から、Crossコンパイル環境はZeroにも構築しているが、ネーティブに以下をビルドしなおす。パッケージはここらに置いておく。

  • binutils-2.32
  • glibc-2.29
  • gcc-8.3.0
    • gccをコンパイルするにgnatのバージョンのみが古くうまくコンパイル出来なかった。古いバージョンにすべてを揃えることで問題は解決した。

DISTCCを設定追加。

| コメント(0) | トラックバック(0)

Slackware64のMultilibなビルド環境でdistccを設定。リアルのx86_64の他、32bitのコンパイルも分散コンパイル。Slackware-currentはARCHがi586でgccはi586-slackware-linux-gccとなっている。

これに対して、Slackware64はx86_64-slackware-linux-gccに-m32のオプションをつけてコンパイルすると32Bitのバイナリがビルドできる。そのため、

/usr/bin/32/gcc

がラッパーとして準備されている。これを利用して、クロスコンパイルの/opt/gcc-cross/bin/にラッパーとしてi586-slackware-linux-gccを以下の様に置いた。REALCC=/usr/bin/32/gccが変更点

#!/bin/bash
# $Id: gccwrapper,v 1.1 2009/09/14 10:35:12 eha Exp eha $
# Copyright (C) 2007  Frederick Emmott <mail@fredemmott.co.uk>
# Copyright 2009  Eric Hameleers, Eindhoven, NL
# Based on the file with the same name which is part of
# the Slamd64 Linux project (www.slamd64.com)

# Distributed under the GNU General Public License, version 2, as
# published by the Free Software Foundation.

# Find the stub gcc's directory:
STUBPATH=$(cd $(dirname $0); pwd)

# Now find the "real" gcc
#REALCC=$(PATH="$(echo $PATH | sed "s#\(.*\):\?$STUBPATH/\?:\?#\1#")" which $(basename $0))
REALCC=/usr/bin/32/gcc

# Filter out -m64 from $@ (this is sometimes added even though we specify -m32)
declare -a Arguments
for i; do
  case "$i" in 
    -m64)
      ;;
    *)
      Arguments[${#Arguments[@]}]="$i"
      ;;
  esac
done

# Compiling a 32bit program requires we call gcc with -m32
$REALCC -m32 "${Arguments[@]}"

# Exit with $REALCC's exit code
exit $?

同じ要領でd++も。後は、/usr/lib64/distcc/にdistccのリンクをi586-slackware-linux-gccと言う名前で作製。これで32bitのslackware-currentとslackware64-currentの混在環境でx86のkernelのコンパイルが出来ている。

構築したdistccで、Raspberry Piのkernelをコンパイルしてみた。kernelは現時点の4.19.27。コンパイルに参加するCPUはメインのx86_64(6CPU), x86(3CPU), Raspberry PI 3B+(4CPU), Raspberry PI zero(1CPU).

Local PC(x86_64)

real 5m29.826s
user 27m59.365s
sys 2m57.170s

Distcc(x86_64)

real 4m10.946s
user 12m12.995s
sys 2m5.350s

CPU負荷が下がり、数値としてはコンパイルが早くなっている様だ。

他の環境から確認した。

Local PC(x86)

real 9m2.760s
user 22m44.356s
sys 3m14.252s

Distcc(x86)そこそこ早くなっている。

real 6m18.326s
user 10m53.253s
sys 3m7.877s

Distcc(3B+) うまく分散できていない?

real 31m35.665s
user 75m49.896s
sys 13m7.891s

Distcc(Zero)....いろいろボトルネックがあって。。。

DISTCCを設定。

| コメント(0) | トラックバック(0)

Slackware64の環境でいろいろなコンパイル出来る様に設定。現在、slackware64-currentのパッケージ(distcc-3.3.2-x86_64-2.txz)はコンパイル時にエラーが発生する。

/usr/lib/distcc

が無いと言うエラーが発生している。ソースを見るとconfigure時にLIBDIR=/usr/lib64が欠けているので、設定ファイルを/lusr/lib64/distccに置いているがdistccdは/usr/lib/distccを参照しているのでは?。修正したパッケージをここに置いておく。


DISTCCの設定は

/etc/default/distcc

STARTDISTCC="true"

#
# Which networks/hosts should be allowed to connect to the daemon?
# You can list multiple hosts/networks separated by spaces.
# Networks have to be in CIDR notation, f.e. 192.168.1.0/24
# Hosts are represented by a single IP Adress
#
# ALLOWEDNETS="127.0.0.1"

ALLOWEDNETS="192.168.1.0/24"

#
# Which interface should distccd listen on?
# You can specify a single interface, identified by it's IP address, here.
#
# LISTENER="127.0.0.1"

LISTENER="192.168.1.180"

#
# You can specify a (positive) nice level for the distcc process here
#
# NICE="10"

NICE="10"

#
# You can specify a maximum number of jobs, the server will accept concurrently
#
# JOBS=""

JOBS="2"

#
# Enable Zeroconf support?
# If enabled, distccd will register via mDNS/DNS-SD.
# It can then automatically be found by zeroconf enabled distcc clients
# without the need of a manually configured host list.
#
# ZEROCONF="true"

ZEROCONF="false"

/etc/distcc/clients.allow

# Comments start with "#" and go to end of line.  Non-comment lines should
# contain entries suitable for passing to the --allow option of distccd, e.g.
#    192.168.1.100
#    192.168.2.0/8
#
# From the distccd man page:
#      -a, --allow IPADDR[/MASK]
#              Instructs  distccd  to  accept  connections  from the IP address
#              IPADDR.  A CIDR mask length can be supplied optionally  after  a
#              trailing  slash,  e.g.  192.168.0.0/24,  in which case addresses
#              that match in the most significant MASK bits  will  be  allowed.
#              If  no  --allow  options are specified, no clients are allowed!
#              Unauthorized connections are rejected by closing the TCP connec-
#              tion immediately.  A warning is logged on the server but nothing
#              is sent to the client.
#
# You should only allow trusted hosts to connect to distccd in TCP mode.
# You should assume that any user on the trusted hosts can (with some
# effort) run arbitrary commands as the distcc user on the distccd host.
# If this is not acceptible, then you should leave this config file empty
# (apart from comments) and thus only allow SSH mode rather than TCP mode.
# However, be aware that SSH mode has poorer performance than TCP mode.

# For RedHat-like distributions using systemd, you should instead look in:
# /etc/sysconfig/distccd in order to configure the trusted hosts list
# See: https://bugzilla.redhat.com/show_bug.cgi?id=1187517
 
# Add your trusted hosts here, e.g. start by uncommented the line below.
127.0.0.1
192.168.1.0/24

/etc/distcc/hosts

# --- /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
192.168.1.X
192.168.1.XX
192.168.1.XXX
192.168.1.XXX

を設定。

ビルドの環境はクロスコンパイルを追加。

cd /usr/lib64/distcc
ln -s ../../bin/distcc arm-slackware-linux-gnueabi-gcc
ln -s ../../bin/distcc arm-slackware-linux-gnueabi-g++
ln -s ../../bin/distcc arm-slackware-linux-gnueabi-gcc-8.3.0

という感じでコンパイルに使うバイナリ名をdistccへリンクする。

サーバの起動の設定は/etc/init.d/distccd


クライアント側では、環境変数を設定

export DISTCC_HOSTS="<distcc server ip>"

として、configureは

CC="distcc arm-slackware-linux-gnueabi-gcc" CXX="distcc arm-slackware-linux-gnueabi-g++" ./configure

makeは

make CC="distcc arm-slackware-linux-anueabi-gcc" CXX="distcc arm-slackware-linux-gnueabi-g++"

とするとサーバのバイナリを使用してコンパイルされる"様"だ。

Slackware arm 14.2環境のライブラリーなどを弄うると、ミスでバージョンが一致しないとかセグメントフォルトなど基本的なツール類が動作しなくなる場合がある。レスキューの為、busyboxのスタティックなバイナリーを作製してインストールしておく。

クロスコンパイルは途中でErrorして今のところうまく行かない。下位互換と言うことでarmv6l環境のbusyboxとする為、Raspberry Pi ZeroでSBoを活用してヴァージョン1.30.1をビルドした。

これd、いざと言う場合には、tar,xzなどがあれば、元のパッケージに戻すことができるはず。

このアーカイブについて

このページには、2019年3月に書かれた記事が新しい順に公開されています。

前のアーカイブは2019年2月です。

次のアーカイブは2019年4月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

2019年6月

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30