読者です 読者をやめる 読者になる 読者になる

解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

コンパイルの job 数(-j、$MAKEOPTS)の適正値

GNU Gentoo Linux

近年の CPU はマルチコアが多いです。 一個の CPU で、複数の CPU を搭載しているかのような動作をします。

1つのプロセスは1つの CPU で動作をして越えません。マルチコアでも同様です。

uptimewtop などで表示される load average の数値も、1個の CPU 当たりに1ですから、 例えば8コアをフル稼働させれば(1ではなく)8になります。

例えば GNU make でビルドをするときには、-j オプションを用いることで、同時に複数のプロセス(ジョブ)を稼働させて、いわゆる並列処理を行えます。 例えば8つのジョブを動かしたければ make -j8 のようにします。 ちなみに GentooPortage では、/etc/portage/make.conf${MAKEOPTS} でこのオプションを設定可能です。

それなのに、マルチコアなのに1つのジョブだけでビルドをしてしまうと、CPU をフル稼働させられないのでビルドが終わるまでに時間がかかります。

さて、ちょうどフル稼働させるための適正値は何かというのは、以前から議論されてきました。

以前は補助記憶装置が HDD であることがほとんどで、 SSD はありませんでした。 そのため、 HDD 上でビルドしたとすれば、 HDD の読み書きにかかる時間を見込んでジョブ数を1つ増やした方が効果的だという意見も有力でした。(CPU より記憶装置の方がとても遅い。)

しかし、 SSD や tmpfs や RAM ディスク上でのビルドであれば、読み書きにおける所要時間はきわめて少ないので、読み書きがほとんど遅れないことから、CPU (コア)の数がそのままジョブ数の適正な最大値であると考えられます。

これはあくまでも最大値であって、ジョブ数を少なめにすると、ビルド時の負荷を逼迫させずシステムの動作をより安定的にすることも可能です。 サーバとして稼働中であったり、作業中にバックグラウンドでビルドをするようなときであったりするなら、ジョブ数を意図的に少なめにするとよいです。

具体的にはやはり、実際に試してみて load average の数値を確認してみるとよいでしょう。