先史時代:
distccやccacheなどのツールの有効性を確認するアイデアを得た後。 それらは長い間使用されてきましたが、このすべての便利さの考えは私の頭の中でまだ展開されていました。 そして最後に、私の手が実際にチェックするようになりました。私はすぐに、すべてが実際の状況で自分のために行われたことを警告します。 これらのコンポーネントのインストールと構成を検討し、timeコマンドを使用してビルド速度をテストします。
理論:
まず、それが何であり、何に役立つかを判断します。 これを読んだとしても、おそらくこれらのツールが何のために使用されているかを既に理解しているでしょう。
ウィキペディアのDistccについての一言。
Distcc(英語版の分散C / C ++ / ObjCコンパイラー)は、リモートマシンでC / C ++ / ObjCコンパイラーを使用してソースコードをコンパイルできるツールで、コンパイルプロセスを高速化します。サーバー(distccd)とクライアント(distcc)。
Ccache(英語のコンパイラキャッシュから;「sikesh」と発音)は、Linuxおよび他のUnixライクシステム用のCおよびC ++コンパイラのキャッシュです。
csacheを使用すると、最後のコンパイル以降に変更されたファイルのみが再コンパイルされるため、数回コンパイルされる一部のパッケージまたはプロジェクトのアセンブリを大幅に高速化できます。
どうする?
- distccとccacheをインストールして構成します。
- これらのメカニズムがどの程度効率的に連携して動作するか、個別に確認してみましょう。
次のインフラストラクチャが利用可能です:100 Mib / sネットワーク、次のマシン:
| Distccクライアント
| Distccサーバー
| Distccサーバー | Distccサーバー |
CPU
| Intel Pentium Dual E2160 1.80GHz
| Intel Xeon 3.20GHz
| Intel Pentium D CPU 3.00GHz
| Intel Pentium 4 CPU 3.00GHz
|
記憶
| 1 GB
| 1 GB | 1 GB | 1 GB |
Gcc
| 4.4.5
| 4.4.5 | 4.4.5 | 4.4.5 |
OS
| gentoo x86
| gentoo x86 | debian 5.0.7 x86
| debian 5.0.7 x86
|
ご覧のとおり、マシンはかなり脆弱ですが、テストの時点ですべてのサードパーティサービスが無効になっているため、タスクに対応しています。 また、ご覧のように、すべてのマシンに1つのバージョンのGCCがインストールされています(同じバージョンを使用することをお勧めします。バージョン4.4の最後の桁の違いは許可されています。*)。
インストールとセットアップ:
まず、ツールをインストールして構成する必要があります。
ジェンツー
distccとccacheのインストールプロセスについては、 マニュアルに詳しく説明されています。主な段階について簡単に説明し 、いくつかのニュアンスを示します。
distccをインストールします。
emerge -avt distcc
USEフラグ、残す必要があるもの、インストールを削除して開始する必要のないものを確認します。
distccのビルドとインストール後、distccdデーモンの設定は/etc/conf.d/distccdファイル、/ etc / distcc / hostsにある使用済みホストのリストにあります。 /etc/conf.d/distccdで、distccdサーバーの設定を変更する必要があります。
ログ機能を追加します。デバッグに必要です。将来は無効にできます。
DISTCCD_OPTS="${DISTCCD_OPTS} --log-file /var/log/distcc.log --log-level info "
要求を処理するホスト(ネットワーク)のリストを定義します。
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.0.0/24"
デーモンを起動するインターフェイスとポートを指定します。
DISTCCD_OPTS="${DISTCCD_OPTS} --listen 192.168.0.174"
サービスを起動する優先度を指定することもできます。この値は厳密に個別に設定する必要があります。デフォルトでは値は15です。
DISTCCD_OPTS="${DISTCCD_OPTS} -N 15"
distccを使用できることをシステムに伝える必要があり、make.confに追加します。
FEATURES="distcc"
そして、一時的なdistccファイルのディレクトリを定義します:
DISTCC_DIR="/tmp/.distcc"
メモリを気にせず、パフォーマンスを向上させたい場合は、一時ファイルディレクトリをtmpfsに移動できます(ファイルシステムは仮想メモリ(RAM +スワップ)に編成されています。一時ファイルの保存に適しています。)
mount -t tmpfs tmpfs -o size=850M /tmp/
tmpfsオーバーフローの場合、データはスワップで書き込まれ、他のプログラムのパフォーマンスに悪影響を及ぼす可能性があります。
永続的に使用するには、次の行を/ etc / fstabに追加します。
tmpfs /tmp tmpfs size=850M,mode=0777 0 0
次に、サービス自体を開始する必要があります。
/etc/init.d/distccd start
また、スタートアップに追加することもできます。
rc-update add distccd default
distccのサーバー側に対して行った変更を思い出させてください。
次に、クライアント側で何をする必要があるかを見てみましょう。 ここではすべてが簡単です。distccサーバーとして機能するホストのリストを、スペースを入れて1行で/ etc / distcc / hostsファイルに追加する必要があります(マシン名とIPアドレスの両方を指定できます)。 マシンのリストは、電力の低い順に開始することをお勧めします。 クライアントはサーバーになることができ、その逆も可能です。
ccache マニュアルをインストールする
emerge -avt ccache
USEフラグ、残す必要があるもの、インストールを削除して開始する必要のないものを確認します。
ccacheのビルドとインストールが完了したら、/ etc / make.confを変更し、ccacheを使用する必要があることをシステムに伝えます。
FEATURES="distcc ccache "
キャッシュサイズを設定します。
CCACHE_SIZE="2G"
キャッシュの場所を決定します。
CCACHE_DIR="/var/tmp/ccache"
キャッシュディレクトリは、tmpfsに保存することもできます。
mount -t tmpfs tmpfs -o size=2G /var/tmp/ccache
またはfstabに登録します。
tmpfs /var/tmp/ccache tmpfs size=2G,mode=0777 0 0
ただし、システムのリブートが発生すると、tmpfsのすべてのデータが失われ、ccacheのすべての動作時間がゼロになります。
Debian
distccをインストールします。 クライアントはgentooを搭載したマシンになるため、Debianマシンでは何かを修正する必要があります。
distccとccacheをインストールします。
apt-get install distcc
apt-get install ccache
distccdデーモンのパラメーターはファイル/ etc / default / distccにあり、使用されるホストのリストは/ etc / distcc / hostsにあります。
/ etc / default / distccを変更します。 マシンの起動時にデーモンの起動をオンにします:
STARTDISTCC="true"
要求をリッスンするサブネットを示します。
ALLOWEDNETS="192.168.3.0/24"
サービスがポートをリッスンするアドレスを指定します。
LISTENER="192.168.3.103"
実行中のプロセスが機能する優先度:
NICE="15"
mDNS / DNS-SDによる有効化または検出
ZEROCONF="false"
/ etc / distcc / hostsの値は、必要に応じてgentooにも入力されます(私のdebianはdistccサーバーとしてのみ使用されます)。
ここで、使用するgccのバージョンにシンボリックリンクを追加する必要があります。リンクには、クライアント上の実行可能ファイルの名前(i686-pc-linux-gnu-c ++)が必要です。
cd /usr/bin/
ln -s ./g++-4.4 ./i686-pc-linux-gnu-c++
ln -s ./cpp-4.4 ./i686-pc-linux-gnu-cpp
ln -s ./gcc-4.4 ./i686-pc-linux-gnu-gcc
ln -s ./g++-4.4 ./i686-pc-linux-gnu-g++
distccサーバーを実行します。
/etc/init.d/distccd start
i686-pc-linux-gnu-c ++などのリンクを作成する必要があることを明確にする必要があります。これは、クライアントシステム(gentoo)で、コンパイル中に同じ名前(gcc-4.4)のハードリンクが起動されるためです。
また、最良の結果を得るために、一時ファイル用のビルドディレクトリをtmpfsファイルシステムに配置しました。
テスト中
次に、例の有効性を確認してみましょう。 実験の純度を高めるために、アセンブリを3回実施しました。 mplayerを収集します。最初の1つだけが手に入りました。 timeユーティリティを使用してテストします。このユーティリティは、出力で次のインジケータを提供します。
user-プロセスがユーザーモードで費やしたCPU時間の合計秒数。
sysは、プロセスがカーネルモードで費やしたCPU時間の合計秒数です。
real-実際の経過時間(秒単位)。
1 -j2オプションを指定したdistccおよびccache(-distcc -ccache)を使用せずに、ローカルホストでmplayerをビルドします
time MAKEOPTS="-j2" FEATURES="-distcc -ccache" emerge -vt mplayer
1 | 2 | 3 |
---|---|---|
実3m56.979s
ユーザー6m11.729s sys 0m44.551s | 実3m55.825s
ユーザー6m12.151s sys 0m43.660s | 実3m55.745s
ユーザー6m12.351s sys 0m43.671s |
2 distccおよびccache(-distcc -ccache)を-j3オプションとともに使用せずに、ローカルホストでmplayerをビルドします
time MAKEOPTS="-j3" FEATURES="-distcc -ccache" emerge -vt mplayer
1 | 2 | 3 |
---|---|---|
実3m57.662s
ユーザー6m15.214s sys 0m43.392s | 実3m58.108s
ユーザー6m14.779s sys 0m43.656s | 実3m57.901s
ユーザー6m14.894s sys 0m43.464s |
3 distccを使用せずに、ローカルホストでmplayerをビルドしますが、-j2オプションを使用してccacheを有効にします(-distcc ccache)
time MAKEOPTS="-j2" FEATURES="-distcc ccache" emerge -vt mplayer
1 | 2 | 3 |
---|---|---|
実4m14.438s
ユーザー6m28.199s sys 1m0.705s | 実数0m58.587s
ユーザー0m39.101s sys 0m25.706s | 実数0m57.901s
ユーザー0m38.940s sys 0m25.564s |
4 distccを使用し、ccacheを使用しない(distcc -ccache)-j10オプションを使用して、ローカルホスト上でmplayerをビルドします
time MAKEOPTS="-j10" FEATURES="distcc -ccache" emerge -vt mplayer
1 | 2 | 3 |
---|---|---|
実2m26.516s
ユーザー1m6.692s sys 0m34.821s | 実2m27.065s
ユーザー1m6.643s sys 0m34.856s | 実2m26.965s
ユーザー1m6.593s sys 0m34.569s |
5 distccおよびccache(distcc ccache)と-j10オプションを使用して、ローカルホストでmplayerをビルドします
time MAKEOPTS="-j10" FEATURES="distcc ccache" emerge -vt mplayer
1 | 2 | 3 |
---|---|---|
実2m28.590s
ユーザー1m16.117s sys 0m45.723s | 実数0m57.456s
ユーザー0m39.892s sys 0m24.781s | 実数0m57.411s
ユーザー0m39.947s sys 0m24.692s |
クロムなど、もっと難しいことを試してみることにしました
5最初に、distccとccacheのないローカルマシンで収集します。
time MAKEOPTS="-j2" FEATURES="-distcc -ccache" emerge -vt chromium
1 | 2 | 3 |
---|---|---|
実67m30.435s
ユーザー116m58.378s sys 11m57.523s | 実66m50.345s
ユーザー115m48.389s sys 11m59.223s | 実67分45.165秒
ユーザー116m59.548s sys 11m57.530s |
6 distccを使用してビルドしてみましょう(distcc -ccache)
time MAKEOPTS="-j10" FEATURES="distcc -ccache" emerge -vt chromium
1 | 2 | 3 |
---|---|---|
実36m25.392s
ユーザー16m2.063s sys 8m8.307s | 実35m15.291s
ユーザー15m10.604s sys 7m4.378s | 実35m22.390s
ユーザー15m1.423s sys 7m5.156s |
7すでに改善されているので、同じことを試してみましょう。ただし、distccとccacheを使用します。
time MAKEOPTS="-j10" FEATURES="distcc ccache" emerge -vt chromium
1 | 2 | 3 |
---|---|---|
実32m2.656s
ユーザー18m56.006s sys 10m57.023s | 実17m22.228s
ユーザー18m1.757s sys 9m36.169s | 実16m59.284s
ユーザー17m59.577s sys 8m35.679s |
結論:
さて、全体像を見て、テストの結果を要約できます。 そして、結論は次のとおりです。distccを使用すると、ビルド時間が約半分に短縮され、ccacheと組み合わせると、速度が約4倍に向上します。 私自身は、これらのツールを引き続き使用することにしました。