2012-07-24 5 views
9

make -jにRAMを過度に消費させないようにする方法はありますか?私は開発チームで働いていますが、我々は異なるハードウェアセットを持っているので、-j8は皆にとって最適ではないかもしれません。しかし、make -jは私のためにあまりにも多くのRAMを使用し、スワップに流出し、システム全体がダウンする可能性があります。どうすればこれを避けることができますか?Make -j RAM limits

理想的には、私はシステム負荷を監視し、新しいスレッドの生成を停止し、完了するのを待ってから続行することが理想的です。

+0

GNUのLinux/Unix上で作りますか? – Chimera

+0

'make --version'が' make --version'を報告するGNU Make 3.81 – Drise

答えて

4

多少単純な解決策は、各ワークステーションがそのハードウェアが処理できるものに適した環境変数を持つことです。 makefileにこの環境変数を読み込ませ、-jオプションに渡します。 How to get gnu make to read env variables.

また、ビルドプロセスに多くの手順があり、長い時間がかかる場合は、makeが環境変数を再読み込みして、ビルド中にリソースの使用量を減らしたり増やすことができます。また

、多分これを実行する別の方法があります...

+1

ハードウェアが扱えることは、何がコンパイルされているかによって異なり、make -jによって最適に制御することはできません。ソース。たとえば、-O0対-O2またはC対C++またはGCC対Intelコンパイラ。 –

3

をリソース使用量の監視を行い、その代わりmakeがそれを行う必要がありしようとしているの環境変数を変更したワークステーション上で実行中のサービス/アプリケーションを持っています:

システムの負荷が大きい場合には、あなたはそれの負荷が軽いときよりも少ない ジョブを実行したいおそらくます

http://www.gnu.org/software/make/manual/html_node/Parallel.html#Parallelから)。 '-l'オプションを使用すると、 load averageの に基づいて、同時に実行するジョブの数を制限することができます。 '-l'または '--max-load'オプションの後には、 浮動小数点数が続きます。たとえば、

-l 2.5は、負荷平均が2.5を超える場合、複数のジョブを開始することはできません。 '-l'オプションが指定されていた場合は、それに続く数字がないので、負荷制限は になります。

あなたのすべてのRAMが不安定になることが心配な場合は、これが役に立ちます。この場合の「負荷」は、稼働時間またはトップレポートという意味です。あなたがスワッピングしている、または悪いことに、スラッシングしている場合、負荷が撃たれます。このオプションの値を試すことができます。並列化されていないビルド時には負荷レベルを監視し、makeの並列プロセスの数を増やすにつれて監視する必要があります。これはあなたのマシンのための合理的なベースラインを与える必要があります。

+0

唯一の問題は、異なるハードウェアセット*があることです。しかしこれはうまくいくかもしれません。 – Drise

+1

問題ではありません。合理的な負荷制限は、ハードウェアとは無関係に、必要なものを正確に行う必要があります。 *イタリック体でも入力できます*。 –

+0

@ keith.layneはい、良い点。この場合、負荷はRAMの使用と相関していると仮定します。 – Chimera

-1

make -jは何か混乱する可能性はありますか? (少なくとも私は長い間それが間違っていた...)。私は、オプションなしの-jオプションがCPUの数に適応すると仮定しましたが、そうではありません。単純に制限は適用されません。これは、大きなプロジェクトの場合、膨大な数のプロセスを作成し(単に "トップ"で見て...)、すべてのRAMを使い果たす可能性があることを意味します。私のプロジェクトの "make -j"が私の16GbのRAMをすべて使用して失敗し、2.5GbのRAM使用量で "make -j 8"が上回ったとき、私はうんざりしました(8つのコアで100%両方の場合)。

効率の面では、何千ものプロセスのスケジューリングにいくらかのオーバーヘッドがあるため、最大限のCPU数以上の制限を使用しない方が効率が良いと思います。作成されるプロセスの総数は一定でなければならないが、 "-j"は一度に多くのプロセスを作成するため、メモリ割り当てが問題になる可能性がある。制限数をCPU数の2倍に設定しても、制限をまったく設定しない場合よりも慎重にすべきです。

PS:いくつかは、より多くの私はきちんとした解決策を考え出した掘りした後に - ちょうどプロセッサの数を読み出し、-jオプションとしてあることを使用します。

make -j `nproc`