Ubuntuでdebパッケージのお手軽クリーンルーム(chroot)ビルド環境を構築するにはで Pbuilder よりも Cowbuilder の方が速いと書いてありますが、本当に Cowbuilder の方が速いのかどうか検証しました。
検証環境は以下の通りです。
-
OS:
-
Debian sid amd64
-
CPU:
-
Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz (8 core)
-
Memory:
-
8GB
検証に使うシナリオは以下の通りです。
-
Debian Wheezy amd64 向けの milter-manager-2.0.5 をビルドします
-
ネットワークの影響を排除するために一度ビルドして aptcache を用意します
-
pbuilder --update
かcowbuilder --update
でOSを更新する -
pdebuild
でパッケージをビルドする
検証に使ったコードはmilter managerのリポジトリにあります。 ここでは(3)+(4)をスクリプト化して1実行し、時間を計測しました。
いくつかのパターンで計測した結果は次の通りです。
ビルド方法 | 時間(秒) |
---|---|
Pbuilder | 241.40 |
Cowbuilder | 215.12 |
Pbuilder + tmpfs | 99.98 |
Cowbuilder + tmpfs | N/A |
Cowbuilder はハードリンクを使うので原理的に tmpfs を使うことができません。2
追加の設定
追加の設定が必要な環境について説明します。
Pbuilder + tmpfs
Pbuilder と tmpfs を一緒に使うためには追加の設定が必要です。
tmpfs を用意します。
$ sudo mount -t tmpfs -o size=2g tmpfs /var/cache/pbuilder/build
pbuilder のデフォルトのビルドディレクトリを tmpfs にします。
pbuilderrc に以下の内容を追加します。
APTCACHEHARDLINK=no
これで aptcache のコピーにハードリンクを使わなくなります。
APTCACHEHARDLINK
以外の設定はほぼ全てコマンドラインオプションで指定することができます。それ以外のオプションをどのように使用しているかはビルドスクリプトを参照してください。
まとめ
Cowbuilder は Pbuilder よりも速いことがわかりましたが、それよりも Pbuilder + tmpfs の方が速いということがわかりました。 Cowbuilder は Pbuilder でボトルネックとなっていた Disk I/O の量を減らす方法として COW を使っています。 一方、Pbuilder + tmpfs では tmpfs を使うことによって Disk I/O そのものをなくして高速化しています。3
pdebuildを使ったdebパッケージのビルドでは、最小環境にビルドに必要なパッケージを全てインストールしてからパッケージのビルドを開始するので、大量のパッケージをインストールします。 そのため COW を使って変更のあった部分のみディスクに書き込んだとしてもベースイメージからの変更量が多くなるため大量の Disk I/O が発生し、Cowbuilder でも思った程速くなりませんでした。 Pbuilder + tmpfs では大量のパッケージインストールを tmpfs 上で行うため Disk I/O が発生しないので、高速化できました。