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


10

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

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

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

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

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

そのような動作または類似のものを取得する方法はありますか?


2
cgroupsを使用すると、プロセスまたはプロセスのグループが使用するRAMの量を制限できます。stackoverflow.com/questions/3043709/...
マーク・Plotnick

2
これは文字通り正確なことulimitです。
DopeGhoti 2015年

1
Ulimit -mは、Linuxで2.4.30以降機能せず、それ以前の特定の状況でのみ機能することを除いて、使用するものです。 unix.stackexchange.com/questions/129587/…–
Mark Plotnick、

niceload --noswap yourprg
Ole

回答:


6

niceload --noswap yourprgは、まさにその状況のた​​めに作られています。それはスワッピングアクティビティを調べます。

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

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

niceload --mem 1G yourprg同様に動作します:1GB未満の空き容量がある場合、youprgは一時停止されます。1GBを超えると、yourprgが再開されます。


0

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

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

-lロックされたメモリ制限のオプションを使用できます。制限を超えると、プロセスにシグナルが送信されます。


-1

キャッシュをクリアするCronjob:Linuxでメモリキャッシュをクリアする方法

私は実際に同様の問題を抱えています。私は自分のカスタムスクリプトを実行するユーザーがたくさんいます。時々、スクリプトが利用可能なメモリをすべて消費し、redhatサーバーをダウンさせます。RAMを大量に消費する理由は、スクリプトがイベントを待つだけで数日間実行される可能性があり、実際には何も使用していないときにリソースを消費するためです。だから私がしたことは単にcronjobでキャッシュを強制的にクリアするだけで、それ以来問題はありませんでした。

シンプルで怠惰。


うーん。興味深い提案ですが、私が経験している問題のほとんどは何もしません。私の主な問題は、多くのギガバイトのメモリを迅速に割り当てることができる単一のプロセス(科学的アプリケーション)にあります。
-leftaround約

キャッシュをクリアすると、通常、パフォーマンスの問題が発生します。まれに、パフォーマンスの問題を解決します。ただし、メモリがない場合でもメモリが使用可能になることはありません。
Gilles「SO-邪悪なことをやめよう」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.