株式会社クリアコード > ククログ

ククログ


Pbuilder と Cowbuilder の性能比較

Ubuntuでdebパッケージのお手軽クリーンルーム(chroot)ビルド環境を構築するにはで Pbuilder よりも Cowbuilder の方が速いと書いてありますが、本当に Cowbuilder の方が速いのかどうか検証しました。

検証環境は以下の通りです。

OS:
Debian sid amd64
CPU:
Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz (8 core)
Memory:
8GB

検証に使うシナリオは以下の通りです。

  1. Debian Wheezy amd64 向けの milter-manager-2.0.5 をビルドします
  2. ネットワークの影響を排除するために一度ビルドして aptcache を用意します
  3. pbuilder --updatecowbuilder --updateでOSを更新する
  4. pdebuildでパッケージをビルドする

検証に使ったコードはmilter managerのリポジトリにあります。 ここでは(3)+(4)をスクリプト化して*1実行し、時間を計測しました。

いくつかのパターンで計測した結果は次の通りです。

ビルド方法時間(秒)
Pbuilder241.40
Cowbuilder215.12
Pbuilder + tmpfs99.98
Cowbuilder + tmpfsN/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 が発生しないので、高速化できました。

*1 milter managerのパッケージビルドスクリプトを改造

*2 ハードリンクはデバイスをまたいで使うことができないという制限があります。

*3 pbuilder --updateによるtarの展開と再圧縮もtmpfs上で作業するとで速くなっています。

2015-01-15

«前の記事: Heroku Meetup #13 新年会:HerokuでGroonga #herokujp 最新記事 次の記事: 無料でチケットを譲ります:CROSS 2015 全文検索エンジン群雄割拠〜あなたが使うべきはどれだ!〜»
タグ:
年・日ごとに見る
2008|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|