make -j
RAMを過剰に消費しないように強制する方法はありますか?私は開発チームで働いていますが、ハードウェアセットが異なる-j8
ため、すべての人に最適であるとは限りません。ただし、make -j
RAMの使用量が多すぎて、スワップに波及し、システム全体がダウンする可能性があります。どうすればこれを回避できますか?
理想的には、システムの負荷を監視し、新しいスレッドの生成を停止し、いくつかが完了するのを待って、続行するようにします。
make -j
RAMを過剰に消費しないように強制する方法はありますか?私は開発チームで働いていますが、ハードウェアセットが異なる-j8
ため、すべての人に最適であるとは限りません。ただし、make -j
RAMの使用量が多すぎて、スワップに波及し、システム全体がダウンする可能性があります。どうすればこれを回避できますか?
理想的には、システムの負荷を監視し、新しいスレッドの生成を停止し、いくつかが完了するのを待って、続行するようにします。
やや単純な解決策は、各ワークステーションに、そのハードウェアが処理できるものに適した環境変数を持たせることです。makefileにこの環境変数を読み取らせ、それを-jオプションに渡します。gnumakeに環境変数を読み取らせる方法。
また、ビルドプロセスに多くのステップがあり、時間がかかる場合は、make
ビルド中にリソース使用量を増減できるように、環境変数を再読み込みしてください。
また、リソース使用量の監視を実行し、環境変数を変更するのではなく、ワークステーションで実行しているサービス/アプリケーションを使用している可能性がmake
あります...
make -jが何をするのか混乱する可能性はありますか?(少なくとも私は長い間それを間違っていました...)。オプションのない-jはCPUの数に適応すると思いましたが、そうではありません-単に制限を適用しません。これは、大規模なプロジェクトの場合、膨大な数のプロセスを作成し(「トップ」を実行して表示するだけです...)、場合によってはすべてのRAMを使い果たすことを意味します。プロジェクトの「make-j」が16GbのRAMをすべて使用して失敗したときに、これに遭遇しました。「make -j 8」は、2.5 GbのRAM使用量でトップになりました(8コアでは、負荷は100%に近くなります。両方の場合)。
効率の点では、数千のプロセスのスケジューリングにはある程度のオーバーヘッドがあるため、予想されるCPUの最大数以上の制限を使用する方が制限なしよりも効率的だと思います。作成されるプロセスの総数は一定である必要がありますが、「-j」は一度に多数のプロセスを作成するため、メモリ割り当てが問題になる可能性があります。CPUの数の2倍に制限を設定する場合でも、制限をまったく設定しないよりも保守的である必要があります。
PS:もう少し掘り下げた後、私はきちんとした解決策を思いつきました-プロセッサの数を読み、それを-jオプションとして使用してください:
make -j `nproc`
を使用してプロセスRAMの使用を制限することができますulimit
。ただし、制限を超えると、プロセスが失敗する可能性があります。gcc
シングルスレッドでリンクする場合、制限を超えるのが大好きです。したがって、ulimit
ソリューションは一般的ではありません。
もう1つの解決策は、gcc
スレッドごとのRAM使用量の見積もりを提供し、めったに使用されないスワップを維持することです。load-average
負荷が高すぎる場合に、新しいスレッド/ジョブの生成を停止するために追加できます。
私は次のスクリプト/etc/profile.d/makeopts.sh
(gentoo)を使用しています:
#!/bin/bash
# We need up to 1000 MB (less than 1GB) per thread.
MAX_THREADS=$(($(getconf _PHYS_PAGES) * $(getconf PAGE_SIZE) / (1000 ** 3)))
EFFECTIVE_THREADS=$(getconf _NPROCESSORS_ONLN)
THREADS=$((MAX_THREADS < EFFECTIVE_THREADS ? MAX_THREADS : EFFECTIVE_THREADS))
MAX_JOBS=$((MAX_THREADS / THREADS))
JOBS=$((MAX_JOBS < EFFECTIVE_THREADS ? MAX_JOBS : EFFECTIVE_THREADS))
MAX_LOAD=$((EFFECTIVE_THREADS * 9 / 10))
export MAKEOPTS="--jobs=$THREADS --load-average=$MAX_LOAD"
export EMERGE_DEFAULT_OPTS="--jobs=$JOBS --load-average=$MAX_LOAD"
4スレッドと16GBRAMを搭載したマシン:
MAKEOPTS="--jobs=4 --load-average=3"
EMERGE_DEFAULT_OPTS="--jobs=4 --load-average=3"
16スレッドと32GBRAMを搭載したマシン:
MAKEOPTS="--jobs=16 --load-average=14"
EMERGE_DEFAULT_OPTS="--jobs=2 --load-average=14"
この構成はのために作成されたものであることに注意してくださいCFLAGS="-O2 -pipe -march=native"
。ライト/ヘビーオプションを追加/削除する場合は、再見積もりしてください。