なぜデュアルコアCPUを使用しているときにmakeに-j3オプションを推奨するのですか?


18

Gentoo Linuxを、設定することが可能であるMAKEOPTSに変数を/etc/portage/make.conf伝えるためにmake、パッケージを構築する際には、並列に実行する必要がありますどのように多くの仕事。私はデュアルコアCPUを持っているので、私は単純に-j2オプションを使用することを選択しました。コアごとに1つのジョブなので、両方とも何かをしなければなりません。「問題」は、デュアルコアCPUを使用しているユーザーに-j3代わりにオプションを設定するよう指示する多くの参考文献があることです。それらのいくつかは次のとおりです。

たとえば、Gentooハンドブックには次のように書かれています:

適切な選択は、システムのCPU(またはCPUコア)の数に1を足したものですが、このガイドラインは必ずしも完全ではありません。

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

make.conf(5)のマニュアルページには次のようにも書かれています:

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

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



回答:


13

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

大量の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、ここではデータキャッシュに使用できるもの(非常に多くのジョブがキャッシュを過度に汚染するのが最適です)に大きく依存しています。


CPUコアがハイパースレッド化されている場合、それぞれが2としてカウントされることを知りませんでした。とにかく、私のCPUはハイパースレッディングをサポートしていないようです。
フランチェスコターコ

私はこの答えを受け入れました。とにかく、私は-j2自分のシステムに固執することにしました。私は両方を試してみました新興ためですgccfirefoxの設定で-j1まで-j5(10の合計のためのコマンドをemerge)、及びその中には思わ-j2間違いなく速くよりも、ある-j1他の3つの設定は、並みのあります、-j2
フランチェスコターコ

7

これはちょっとヒューリスティックだと思います。プロセスmakeを起動できるようにCPUs + 1するには、次のことを確認する必要があります。

  1. 終了したばかりのワーカープロセスとまだ実行されていないワーカーとの間にギャップはありません。
  2. その実行キューの事前入力で顕著なオーバーヘッドをもたらすほど多くの競合するプロセスはありません。

しかし、これもヒューリスティックであり、FreeBSDのハンドブックでは単一のCPUを推奨 make -j4しています。


5

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


2

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

ただし、Gentooを使用したときの経験則はそうでした<#cpus>*2 + 1

それはすべて、チキントレイル、ティーリーフ、またはマジック8ボールが、実行する必要があるディスクI / Oと現在のLinuxカーネルのスケジューリングについて教えてくれることにかかっています。[この投稿のコアを始める]私の個人的な経験から(-jGentoo固有ではありません)、#cpus + 1から#cpus * 2 +1までのすべてが素晴らしい結果をもたらします[この投稿のコアを終了する]。最近では、プロセッサとカーネルは非常に優れています。

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

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

補足説明として、コアの数ではなく、CPUが使用する同時ストリームの数ではいけません。(ハイパーヘディング!)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.