[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-devel:18552] chroot環境設定時間



こんにちは、

昨日、大統一Debianで言っていたことに関連して、chroot環境設定時間の問題
を試しました。実際に調べてみると、奥が深そうですね。

私のテスト環境は、SSD + 16 GB DRAM + Core i7 (8 core相当) +
高速インターネット(実測800kB/s-1.2MB/s)のsid/testing 環境です。

行ったことは、チョット違いgetmail4 を使いbuild+lintianの実行です。
インタープリタのパッケージなのでbuild時間は短い、普通にしたら以下です。

    debuild      real 8.07 user 5.84 sys 1.38

ただ最低限必要パッケージでつくられる典型的なpbuilder/cowbuilderの標準開始用の
親chrootを使ってbuildすると、なんと(キャッシュがある状態ですが):

    cowbuilder   real 50.23 user 15.12 sys 9.80
    pbuilder     real 55.48 user 18.34 sys 10.22

となりました。確かにcowbuilderは少し早いですが、ともに非常に遅いです。

完全にキャシュのない状態としても、5秒程度遅くなるだけです。
これは、sakuraのミラーが早いという事もあります。

ここにapt-cacherをここで追加してもむしろ数秒マイナスでした。
(まあ、すでにキャッシュされていたので、不要追加プロセスでしたので
この結果は当然ですが。)

また、eatmydata -- pdebuild等も実行しましたが効果はありません。(ただ、
もしかしたらeatmydataはchrootの中のコマンド起動時に起動しないと効果が
ないのかもしれません。もしかしたら、cow-shellも同じことしている???)

どうも時間がかかる原因はこの場合パッケージのダウンロード以外です。
たかがこの程度のことをするのに6倍以上かかるのはなぜか、不思議です。
chrootてそんなに遅くならないイメージを持っていました。

そこでどこに時間がかかっているのかなと見ていると、
 パッケージで依存関係計算
  依存関係パッケージ作成
 パッケージの展開 (結構遅い)
 パッケージスクリプト実行、特にtriggerの処理
  今回は「Processing triggers for man-db ...」が気になった
  (そう言えば、TEX関係があるとbuildに字間がもっとかかった気もする)
 lintianの実行
この辺が眺めていると時間がかかってます。

一方、pbuilder/cowbuilderのcacheされたパッケージの利用や、新規ダウンロードの
パッケージのcacheへのコピー等は、画面がうるさいですが、全体の中では意外と時
間が掛かっていません。

最初に"apt-get build-dep getmail4"をして必要なパッケージを全てインストール
されたchrootを作って、それを利用だと、

    cowbuilder   real 31.16 user 11.16 sys 6.15
                 real 31.25 user 11.50 sys 5.77

です(2回とも、ほぼ再現しました)。よく見るとまだ色々インストールしているの
で遅いようです。

そこでlintianのdependencyもぶち込んでみました。それを利用だと、

    cowbuilder   real 22.82 user 10.61 sys 4.74

まあ、最悪の状況の半分以下までには追い込めました。

cowbuilder では、確かcp -lrで作業用の使い捨てchroot作成しますが、その時間は

    cp -lr base.cow  real 0.12 user 0.00 sys 0.11
    cp -lr big.cow   real 0.17 user 0.01 sys 0.15

いずれにせよ意外と早いようです。またソースパッケージの展開も

    dpkg-source -x   real 0.20 user 0.14 sys 0.04

これ自体も意外と早いです。lintianは

    lintian *.dsc     real 1.99 user 1.51 sys 0.23
    lintian *.changes real 2.60 user 2.06 sys 0.48

ですが、これは最初の8秒の例でも実行しているので差の理由にはなりません。

まあ、まだどこかで14秒ほど時間の無駄があるようです。

ここで分かったことは、chrootを最初に十分のパッケージを入れた状態で用意
して実行すると、実行時間を半減できる高速化となり、30秒位上の無駄がな
くなり、スピードが倍増以上となることです。

pbuilderの標準的使用目的である「パッケージ依存関係の検査」のためには、
最低限必要パッケージでつくられる開始用の親chrootを使うのが必要なのは
わかります。

でも、builddのように多くのパッケージをコンパイルする場合にはもっとファイ
ルがインストールされた環境を開始用の親chrootを使うほうが効率的という事の
確認に本件はなっています。

まあ、こうして見ると パッケージのテストを効率的にするためには、ある程度
良く使われるパッケージ全てがインストールされた chroot を前もって作って
おいてそれを cp -rl して作業用に持ってきて、cow-shellを使って使うのが
一番効果的みたいですね。(フォント関係テストするならもちろんfontconfig等
も前もって入れておきたいですよね。)

もしパッケージの cache 機能を自前で持ちたかったら、chrootへのアクセスは
  cowbuilder --execute
を使うのがいいのかもしれませんが、apt-cacher-ng等を用いてproxy
で cache しても、しなくても、どっちでも大差無さそうですね。
まあ、共有サーバーの負荷低減のためにも、ローカルのどこかでキャッシュ
するのは、「良い行為」でしょう。

またパッケージテストは最近いろいろあるんですね。
 lintian — static checking
 piuparts — install checking
 autopkgtest — internal test code

お粗末ですが、以上ご報告まで。

青木