web-dev-qa-db-ja.com

デュアルコアCPUを使用している場合、なぜmakeに-j3オプションが推奨されるのですか?

Gentoo Linuxでは、/etc/portage/make.confMAKEOPTS変数を設定して、パッケージのビルド時にmakeが並列で実行する必要があるジョブの数を伝えることができます。私はデュアルコアCPUを持っているので、単純に-j2オプションを使用することを選択しました。 「問題」は、デュアルコアCPUを使用しているユーザーに-j3オプションを代わりに設定するように指示する参照がたくさんあることです。それらのいくつかは:

例えば、Gentooハンドブックはこう言っています:

適切な選択は、システム内のCPU(またはCPUコア)の数に1を加えた数ですが、このガイドラインは常に完全であるとは限りません。

しかし、「CPU + 1」ルールの根拠は何ですか?なぜ余分な仕事ですか?

Make.conf(5)のmanページには、次のようにも書かれています。

推奨される設定は、CPU + 1と2 * CPUs + 1の間です。

-jオプションのmake情報ページとmakeのマニュアルページの説明のセクション5.4(並列実行)も読みましたが、そこには答えがないようです。

18
Francesco Turco

常に機能する単純なルールはありません。特定のマシンで特定のコンパイルを試し、これが最良の設定だったため、または現実と何らかの関係があるかどうかに関係なく、何らかの推論を行ったため、人々は特定の図を推奨するかもしれません。

大量のRAMに恵まれている場合、長いコンパイルでの制限要因はCPU時間です。次に、CPUごとに1つのタスクに加えて、これらの一時的なI/Oブロック用に1つの保留中のタスクが適切な設定です。それは-j3デュアルコアCPU(より正確には、デュアルCPUマシンの場合)—各コアがハイパースレッドの場合、4 CPUになるため、-j5)。

RAMが非常に少ない場合、制限要因は、同時に実行できるジョブが多くないことです。そうしないと、ジョブが互いにスワップし続けることになります。たとえば、2つのコンパイラインスタンスをメモリに快適に収めることができない場合、make -j2はすでにmakeより遅い可能性があります。これは、一度にRAM=)に収めることができるコンパイラプロセスの数に依存するため、一般的な数値を導き出す方法はありません。

その間に、より多くの仕事を持つことは有益かもしれません。各コンパイラプロセスは小さいですが、全体としてビルドが大量のデータを処理する場合、ディスクI/Oがブロック要素となる可能性があります。この場合、CPUごとに一度に複数のジョブが必要になるため、常に各CPUを使用するジョブが1つあり、他のジョブはI/Oを待機しています。繰り返しますが、これはビルドジョブと使用可能なRAM、ここではデータキャッシュに使用できるものに非常に依存しています(ジョブが多すぎるとキャッシュを過度に汚染する最適な方法があります)。

これはちょっとheuristicだと思います— makeCPUs + 1プロセスを起動できるようにするには、次のことを確認する必要があります。

  1. 終了したばかりのワーカープロセスとまだ実行されていないワーカーの間にギャップはありません—実行キューを事前に満たすようなものです。
  2. 競合するプロセスが多すぎて、実行キューの事前入力で顕著なオーバーヘッドが発生することはありません。

しかし、繰り返しになりますが、これはheuristicであり、FreeBSDのハンドブックは、シングルCPUの場合でも 推奨make -j4です。

7
poige

一般に、コアの数よりも多くのジョブを開始する理由があります。 gccを使用したCコンパイルでは、-pipeがgccオプションで定義されていない場合、一時ファイルを使用してそのアクション(前処理、初回実行、最適化、およびアセンブリ)を順番に実行します。 -pipeはこれをサブプロセス間でパイプを使用するように変更します。 (-pipeの追加は、たとえばFreeBSDのデフォルトですが、Linuxでは伝統的ではありません。)したがって、2つのコアがあり、2つのジョブを並行して許可すると、ディスクI/Oに時間がかかります。 1件のジョブを追加するという推奨事項は、この詳細に関連しているようです。しかし、最終的な回答を得るには、この推奨事項を誰がいつ追加したかを見つけて彼に尋ねる必要があります:)またはGentoo develsのメーリングリストで尋ねてください。

5
Netch

基本的にその数は著者が常識と呼ぶものです。せいぜい、それは良い推測です。私が知る限り、makeを入力したときに生成されるmakeプロセスはすでにカウントされているため、-j3を使用すると、メインプロセスが待機している間、他の2つがコンパイルされます。

しかし、私がGentooを使用したときの経験則は<#cpus>*2 + 1でした。

それはすべて、チキントレイル、茶葉、またはマジック8ボールが、実行する必要のあるディスクI/Oと現在のLinuxカーネルのスケジューリングについて教えてくれることに依存します。 [この投稿のコアを開始]私の個人的な経験から(-jはGentoo固有ではありません)、#cpus + 1と#cpus * 2 +1の間のすべてが良好な結果をもたらします[この投稿のコアを終了]、平均してほとんど違いに注意してください。最近のプロセッサーとカーネルは非常に優れています。

しかし、次の場合にこのすべての変更が発生します:a)実際にコンパイルに複数のボックスを使用している(du'h)またはb)独自のコードを開発している

-j属性が高いほど、以前は不明だった依存関係が表示される可能性が高くなります。

そして、余談ですが、コアの数ではなく、CPUが使用する同時ストリームの数ではありません。 (ハイパーヘディング!)

2
Bananguin