回答:
nproc
使用可能なCPUコア/スレッドの数を示します。たとえば、双方向SMTをサポートするクアッドコアCPU では8です。
このオプションをmake
使用して並行して実行できるジョブの数は-j
、いくつかの要因に依存します。
make
ジョブが使用するメモリ量make
の仕事は、I / O-またはCPUがバインドされていますmake -j$(nproc)
開始するには適切な場所ですが、使用可能なメモリを使い果たしてスラッシングを開始しない限り、通常はより高い値を使用できます。
本当に高速なビルドの場合、十分なメモリがある場合tmpfs
、ほとんどのジョブがCPUにバインドさmake -j$(nproc)
れ、可能な限り高速に動作するように、を使用することをお勧めします。
tmpfs
、物理RAMサイズよりも常に小さいディレクトリサイズに制限されますか?
time
呼び出しでラップすることができます。結果をクリーンアップし、繰り返し洗い流してください。最終的にtimes / j値をソートします。
残念ながら、同じビルドの異なる部分でさえ、jファクターの値が競合する場合に最適な場合があります。これは、ビルド対象、その方法、その時点でどのシステムリソースがボトルネックであるか、ビルドマシンで他に何が起こっているか、何が起こっているかによって異なりますネットワーク(分散ビルドテクニックを使用している場合)、ビルドに関係する多くのキャッシュシステムのステータス/場所/パフォーマンスなど。
100個の小さなCファイルをコンパイルする方が、1つの巨大なCファイルをコンパイルするよりも速くなる場合があります。小さく複雑なコードの構築は、大量の単純な/線形コードの構築よりも遅くなる可能性があります。
ビルドのコンテキストも重要です-専用のサーバー上のビルド用に最適化されたajファクターを使用して、排他的で重複しないビルド用に微調整すると、同じ共有サーバー上で並行してビルドする開発者が使用すると、非常に期待外れの結果が生じる可能性がありますシリアル化されている場合はそれらすべてを組み合わせた時間)、または異なるハードウェア構成のサーバー上または仮想化された時間です。
ビルド仕様の正確さの側面もあります。非常に複雑なビルドには、jファクターの増減に応じて大幅に変化する可能性のある断続的なビルド障害を引き起こす競合状態がある場合があります。
私は続けることができます。ポイントは、jファクターを最適化したいコンテキストでビルドを実際に評価する必要があるということです。@Jeff Schallerのコメントが適用されます。最適なものが見つかるまで繰り返します。個人的には、nprocの値から始め、上向きの試みがすぐに劣化を示す場合にのみ、最初に上向きと下向きに試します。
測定のばらつきを把握するために、おそらく同一のコンテキストでいくつかの同一のビルドを最初に測定することをお勧めします-高すぎると全体の最適化の作業を危険にさらす可能性があります(20%のばらつきは完全に10%の改善/ j因子検索での劣化の読み取り)。
最後に、固定されたjファクターの代わりに、サポートおよび利用可能な場合は(適応)ジョブサーバーを使用することをお勧めします-幅広いコンテキストで一貫してより良いビルドパフォーマンスを提供します。
-j
パラメータで固定数を渡さないことについてコメントできますか?例make -j
make -j
fork bombのように依存関係が許可する数のジョブを生成します(superuser.com/questions/927836/…)。ビルドは、プロセスを実行するよりもほとんどのCPUをプロセスの管理に費やすだけでクロールし(superuser.com/questions/934685/…)、高度な並列ビルドでは、システムはメモリ/スワップまたはpid#を使い果たし、ビルドは失敗します。
最も簡単な方法は、次のnproc
ように使用することです。
make -j`nproc`
このコマンドnproc
は、マシン上のコアの数を返します。目盛りで囲むことにより、nproc
コマンドが最初に実行され、数値が返され、その数値がに渡されmake
ます。
コアカウント+ 1を実行するとコンパイル時間が短縮されるという逸話的な経験があります。これは、I / O遅延、他のリソース遅延、リソース制約の他の可用性などの要因に関係しています。
でこれを行うには、これをnproc+1
試してください:
make -j$((`nproc`+1))
ccache
後で再構築が、これはOTである