はじめに
poudriere によるパッケージビルド環境を運用していると、巨大なパッケージのビルドに時間がかかると、ビルドに失敗することがあります。
ビルドシステムたるハードウェアリソースを潤沢に用意することで回避することができますが、そこまでのハードウェアリソースを用意できない場合のリソース配分をどうすればいいか調べたのでメモとして残しておきます。
確認環境
- OS: FreeBSD 14.3-p7 / 15.0-p1
- アーキテクチャ: amd64 / aarch64 / i386
- ビルドシステム: poudriere 3.4.4
/usr/local/etc/poudriere.conf
要はこのファイルにビルド環境のリソースに応じた配分を設定します。
MAX_EXECUTION_TIME
巨大なパッケージのビルドエラーになる最大の要因とも言うべきパラメータです。通常24時間(86400秒)が設定されています。つまり24時間以内にビルドが完了することが期待されています。巨大なパッケージのビルドでエラーになる環境では、この数字を上げることになります。単位は秒で指定します。また0を指定して無効にすることはできません。
NOHANG_TIME
標準出力に出力がない状態が続いた場合に、コマンドが暴走状態(ランナウェイ)と判断されるまでの時間(秒単位)を定義します。通常2時間(7200秒)が設定されています。あまりこの設定をいじる事は無いと思います。
先の設定と合わせてビルドエラーが改善しない場合に疑った方がよいパラメータとなります。
PARALLEL_JOBS
poudriere が同時にビルドするパッケージの数を指定します。デフォルトでシステムのCPUコア数(hw.ncpu を参照)が設定されています。本設定で明示的に変更が可能です。
このパラメータの調整は微妙です。巨大なパッケージのビルドの横で、他のパッケージをビルドする時には大きな値が必要になることがありますが、そのパッケージのビルドが終らないと進まないケースでは無意味となります。
PREPARE_PARALLEL_JOBS
poudriere が同時に実行するパッケージの数を指定となりますが、準備フェーズ(make fetch や make configure 等)に限っての指定となります。デフォルトでは PARALLEL_JOBS × 1.25 で設定されています。
通常これらの準備フェーズはI/Oバンド処理がメインのため、その分のパッケージビルドの各フェーズを進めておきます。
ALLOW_MAKE_JOBS
ビルド時における並列ビルドを許可するかどうかの設定となります。PARALLEL_JOBS や PREPARE_PARALLEL_JOBS はビルドするパッケージの並列度に関する設定でしたが、この設定はパッケージ自体のビルド(コンパイル)並列度を(間接的に)指定する物となります。
この設定が yes の時(/usr/local/etc/poudriere.d/)make.conf に設定された MAKE_JOBS_NUMBER 設定に基づいて並列ビルドが行われます。通常この設定は行われていないため、kern.smp.cpus の数と同じになります。
設定のまとめ
| パラメータ名 | 意味 | デフォルト | 単位 | 備考 |
|---|---|---|---|---|
| MAX_EXECUTION_TIME | 最大ビルド時間 | 86400 |
秒 | 見直しの価値あり |
| NOHANG_TIME | 正常ビルド判定時間 | 7200 |
秒 | |
| PARALLEL_JOBS |
hw.ncpu の値 |
個 | ||
| PREPARE_PARALLEL_JOBS |
hw.ncpu の数 × 1.25 |
個 | ||
| ALLOW_MAKE_JOBS | (空) | - |
yes かそれ以外の指定 |
よくある質問とその答え
Q.何で今更?
A.マニュアルに明示してないので改めて調べ直したです。ググってみると、困ってる人の例は何件か見かけましたが、こういう形でのまとめを見なかったので整理ついでに。
Q.マニュアルに無いの?
A.無いです。設定ファイルサンプルである poudriere.conf.sample のコメントに本件で調べた内容の記述があります。不親切も良いところ。検索しても出てこないわけだ。
Q.コマンドラインオプションでの指定は?
A.取り扱わない方向で。希に細かく調整したいことはあると思いますが、本ユースケースではアウトオブ想定で。
そもそも PARALLEL_JOBS と PREPARE_PARALLEL_JOBS は -J オプションで指定できますが、それ以外は指定できないです。