今日早く何かを作っている間、私はmake
走ることにしました。
$ make -j
おそらく、合理的な制限をデフォルトにcabal
設定するなど、他のプログラムの習慣によるものかもしれません。-j
約20秒後、デスクトップ全体が動作を停止しました。。私は活動の兆候を見つけました。ファンが回転しません。 HDDインジケーターは緑色に点灯していますが、ディスクの活動音は聞こえません。ええと。10分間の沈黙の最後に、ついに以前に押された最初のキーに対する反応が現れ、非常におなじみのディスク叩く音も聞こえ始めました。応答しないこのシステムで端末に入ろうと20分間ゆっくりと試みた後、ついに放棄してREISUBを使用しました。
最初は、犯人が関係のないデスクトップアプリケーションであるに違いないと思いました。対話型bashセッションのメモリ制限このような状況が来る前に!しかし、/var/log/syslog
OOMキラーが残した痕跡は異なります。一部のps
廃車場疑わしいこと包装そしてc++
プロセスcc1plus
!
以下は、ダンプの1つの頻度分析です。
Command Number of appearances
'sh' 322
'c++' 321
'cc1plus' 321
'chrome' 27
'make' 27
'bash' 3
all else combined 120
そこでGNU makeのマニュアルページを確認しました:(強調追加)
-j [jobs], --jobs[=jobs] 同時に実行するジョブ(コマンド)の数を指定します。 -jオプションが複数ある場合、最後のオプションが適用されます。 -jオプションを引数なしで指定すると、makeは同時に実行できるジョブの数を制限しません。
問題を再現できるかどうかを確認したくありません。(博士様、すると痛いです)これ...)しかし、これまでの結果はホームランのように見えます。明らかに、make -j
何百もの結果プロセスが発生しました。確かにそうです停止とディスクスラッシングの原因。つまり、インターネットを検索しても、これに対する警告を多く見つけることができませんでした。私はとても急いで結論を下すのだろうか?
make -j
本当に思ったほど危険ですか? もしそうなら、一体なぜそこにありますか?愚か者が使用しないようにするにはどうすればよいですか?
答え1
さまざまな想像力を発揮して自分の足に銃を撃つことができるツールがあります。これにより、他の人が「正常」であると考えるものに制限されず、想像力を使用して問題を解決できます。
小規模プロジェクトを実行するのはmake -j
合理的です。他のプロジェクトでは、パラメータ-j
なしで使用すると、システムの応答性が著しく損なわれる可能性があります。一部のプロジェクトでは、並列ビルドを使用しても-j2
ビルドが完全に中断されます(並列makeプロセスによって生成されたファイルは、時間が経つと他のプロセスには表示されません)。
個人的には、エイリアスを使用しませんmake
(make -j4
あなたの意見で述べたように)。私は機械に何をすべきかを明示的に伝えるのが最善だと思います。知るそれは何をしますか?数日後、私はこのエイリアスを忘れて、なぜ私が別のターミナルに構築した4つのプロジェクトのために私のシステムが反応しないのか疑問に思いました。
「危険」に関しては…その言葉は状況によって異なることを意味します。はい、システムが応答しなくなる可能性があるため、「危険」です。はい、ビルド中にビルドプロセスが中断される可能性が高いため、「危険」です。しかし、いいえ、ハードドライブの再フォーマットやランダムファイルの削除を開始するという点で「危険」はありません。
では、愚か者を予防する方法は?
以下は確実なステップバイステップガイドです。
- ツールの使い方を学びます。
また、-j
BSDフラグに注意してください。make
する引数が必要で、このフラグは非標準です(Unix POSIX標準ではこれを言及しません)。
答え2
以下を使用してmakeを制限することもできます-l
。
-l [load], --load-average[=load] 実行中の他のジョブがあり、ロード平均が load(float) 以上の場合、新しいジョブ (コマンド) が開始されないことを指定します。引数がない場合は、以前のロード制限を削除します。
しかし、次のように実行するのは役に立たないようですmake -j -l4
。
負荷平均が制限を超える前に、あまりにも多くの作業が開始されました(私の経験上)。たとえば、組み合わせが機能する可能性がありますmake -j8 -l4
。