web-dev-qa-db-ja.com

プロセスのメモリ消費に何らかのソフト制限を課すことは可能ですか?

これはそれほど珍しい問題ではないと思います。1つのプロセスが大量のメモリを割り当てます(メモリリークのバグが原因で、実行不可能なほど大きな入力ファイルを処理しようとしたためなど)。 RAMがいっぱいになり、ある時点でLinuxをスワップに切り替える必要があります。これが最後の手段である場合もあります。コストのかかる計算を行っている場合は、失いたくないです。終わりに向かってRAMが不足した場合のデータ。

ただし、(私の経験では)かなり頻繁に、メモリ消費は、不正な、おそらくバグのあるプロセスによって制限されません。つまり、最終的に緊急性の低いデータスワップに移動するだけでなく、OSは大量のデータをパニックにスワップすることを余儀なくされます。残念ながら、これは問題のあるプロセスを大幅に中断するだけでなく、システム全体をほぼ停止させる可能性があります(SSDを搭載したマシンではそれほど悪くはありませんが、OTOHではギガバイトとギガバイトのガベージデータを書き込む可能性があるかどうか心配になります長期的にはフラッシュセルに害を及ぼします)。
問題に気づき、手動でプロセスを強制終了するまで(仮想端末にログインするまでに実際には数分かかりました!)、実行中のセッションの半分がスワップになり、かなり待つ必要がありますシステムが再びスムーズに動作するまで。

この問題に対する1つの劇的な解決策があります。それは、ハードメモリ制限を適用することです。しかし、これをシステム全体で実行すると、まだ必要なプロセスが強制終了されることがあります。問題のあるプロセスを開始する前に手動でulimitする必要がある場合は、手遅れになるまで忘れることがよくあります。

私が幸せになる可能性のある解決策の種類:

  • いずれかのプロセスが特定のメモリ使用量を超えると、システムの残りの部分が応答し続けるように、人為的に抑制されます。
  • プロセスが特定のメモリ使用量を超える場合、それはSIGSTOPpedなので、次に何をすべきかを理解する時間があります。
  • プロセスがRAM制限に近づくと、警告が表示されます。すばらしいスワッピングが始まります。

そのような振る舞い、または同様の振る舞いを得る方法はありますか?

10
leftaroundabout

niceload --noswap yourprg まさにその状況のた​​めに作られています:それはスワッピング活動を調べます:

  • スワップアウトする場合:プロセスを実行させます
  • スワップインする場合:プロセスを実行させます
  • スワップインおよびスワップアウトの場合:スワッピングが停止するまでプロセスを一時停止し、スワッピングが停止したときにプロセスを再開します

スワッピングが開始される前にプロセスを一時停止することはありませんが、動作する前にスワッピングを1秒間実行します。

niceload --mem 1G yourprg同様に機能します:1GB未満が無料の場合、youprgは一時停止されます。 1GB以上が解放されると、yourprgが再開されます。

6
Ole Tange

はい。これは、事実上すべての最新のシェルで非常に簡単に実行できます。

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

ロックされたメモリ制限には-lオプションを使用できます。制限を超えると、プロセスに通知されます。

0
mikeserv