distccおよびccacheの使用、構成、テスト

先史時代:



distccやccacheなどのツールの有効性を確認するアイデアを得た後。 それらは長い間使用されてきましたが、このすべての便利さの考えは私の頭の中でまだ展開されていました。 そして最後に、私の手が実際にチェックするようになりました。私はすぐに、すべてが実際の状況で自分のために行われたことを警告します。 これらのコンポーネントのインストールと構成を検討し、timeコマンドを使用してビルド速度をテストします。





理論:



まず、それが何であり、何に役立つかを判断します。 これを読んだとしても、おそらくこれらのツールが何のために使用されているかを既に理解しているでしょう。

ウィキペディアのDistccについての一言。

Distcc(英語版の分散C / C ++ / ObjCコンパイラー)は、リモートマシンでC / C ++ / ObjCコンパイラーを使用してソースコードをコンパイルできるツールで、コンパイルプロセスを高速化します。サーバー(distccd)とクライアント(distcc)。

Ccache(英語のコンパイラキャッシュから;「sikesh」と発音)は、Linuxおよび他のUnixライクシステム用のCおよびC ++コンパイラのキャッシュです。

csacheを使用すると、最後のコンパイル以降に変更されたファイルのみが再コンパイルされるため、数回コンパイルされる一部のパッケージまたはプロジェクトのアセンブリを大幅に高速化できます。



どうする?



  1. distccとccacheをインストールして構成します。
  2. これらのメカニズムがどの程度効率的に連携して動作するか、個別に確認してみましょう。


次のインフラストラクチャが利用可能です: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倍に向上します。 私自身は、これらのツールを引き続き使用することにしました。



All Articles