OSをクラッシュさせる可能性のある貪欲なアプリケーション向けのメモリ制限ソリューション?


32

科学プログラミングのためにコンピューターを使用しています。正常な8GBRAMと12GBスワップ領域があります。多くの場合、問題が大きくなるにつれて、使用可能なRAMをすべて超過します。クラッシュするよりも(これが望ましい)、UbuntuはUnityや開いているターミナルを含むすべてをスワップにロードし始めているようです。時間内に暴走したプログラムをキャッチしなければ、待つしかありません-コマンドプロンプトに切り替えるには4〜5分かかります。Ctrl-Alt-F2問題のプロセスを殺すことができます。

私自身の愚かさはこのフォーラムの範囲外であるため、単一の問題のあるプログラムから利用可能なメモリをすべて使い切ったときに、スラッシングによってUbuntuがクラッシュするのを防ぐにどうすればよいですか?

自宅実験*!

ターミナルを開いて起動しpythonnumpyインストールしている場合はこれを試してください:

>>> import numpy
>>> [numpy.zeros((10**4, 10**4)) for _ in xrange(50)]

*警告:悪影響を及ぼしiotopたり、プロセスを監視したりtop、時間内に強制終了したりする場合があります。そうでない場合は、再起動後に表示されます。

回答:


21

組み込みのシェルをulimit使用すると、リソースを制限できます。あなたの場合、シェル(およびその子)でのメモリ使用を制限するには、を使用しますulimit -v

100 MB(100000 KB)のメモリ制限を設定するデモ:

$ ulimit -v
unlimited
$ python -c '[ "x" * 100000000 ]'
$ ulimit -v 100000
$ python -c '[ "x" * 100000000 ]'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
MemoryError

ps uww -C script-name-herepython を使用すると、少なくとも29MBのメモリ(VSZ列)が必要であることが確認されています。Pythonスクリプトがより多くのメモリを必要とするため、RSSの制限が大きくなるため、その列を調整します。


1
残念なことに、実際のアプリの外観がわかりません。示されているulimitは、そのシェルの子であるすべてのプロセスに影響します。デーモンとして実行されるのか、それとも事態をさらに複雑にする多くの子が存在するのかさえわかりません。coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/…を
ppetraki

1
ulimitとcgroups のユーザーフレンドリーなフロントエンドはありませんか?Windowsでは、OSがRAMを使い果たしそうになると、警告ポップアップによって常にシステムのフリーズを回避できました。Ubuntuでは、常にメモリ使用量に注意する必要がありますか?
ダンダスカレスク

1
@DanDascalescuスワップファイルを設定している場合、遅延は長くなりますが、それでも機能します。スワッピングの開始に気付いたら、システムモニタでRAMの使用状況を確認できます。システムが実際にメモリ不足になると、メモリ不足(OOM)キラーが呼び出され、最高の「不良」スコアを持つプロセス(通常、ほとんどのメモリを消費するプロセス)を強制終了します。
-Lekensteyn

12

Cgroupsを使用すると、プロセスごとにメモリ使用量を制限できます。

https://en.wikipedia.org/wiki/Cgroups

http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt

科学計算はメモリ集約型であることが有名です。cgroupでアプリをサンドボックス化することで、メモリのプレッシャーが軽減されるため、残りのプロセスが犠牲になることはありません。

または、VMはもちろんパフォーマンスを犠牲にして、仮想マシンに委任されたメモリのみを使用できるため、VMを一種のハード制限として使用することもできます。ただし、cgroupのセットアップと保守に比べて、VMを未開始のユーザー向けに構成する方がはるかに簡単です。

決定決定:)がんばって!


1
ulimitとcgroupsの使いやすいフロントエンドはありませんか?Windowsでは、OSがRAMを使い果たしそうになると、警告ポップアップによってシステムのフリーズを回避できるようになりました。Ubuntuでは、常にメモリ使用量に注意する必要がありますか?
ダンダスカレスク

いや。また、OSもフリーズしてはいけません。これは別の問題です。表示されるウィンドウは、最初は単なる絆創膏です。大量のメモリを使用している場合は、その理由を調査する必要がありますか?たとえば、最新のブラウザでSanboxを使用すると、1タブあたり70〜150Mを簡単に消費できます。これをオフにするかチューニングすると、エンドユーザーが定期的に使用するかなりのメモリを解放できます。スケジューラーはめったに使用されないプログラムをスワップアウトしてスペースを節約することになっていますが、必要以上に目覚めた場合は修正する必要があります。または、主なタスクがメモリ集中型(Web)の場合は、より多くのRAMが必要です。
ペペラキ

8
メモリを消費するものは知っています-Chrome。しかし、OSは、それでもなお動作するアプリケーションからその安定性を保護する必要があります。
ダンダスカレスク

1
ユーザーとしてどこから来たのか理解しています。ただし、求めているのは、一般的なコンピューティングプラットフォームをアプライアンスに変えることです。オペレーティングシステムエンジニアがこれらのセーフガードを提供するために実装する必要がある最も複雑な(エラーが発生しやすい)方法として、コンピューター全体の実行方法について劇的に意見を述べる決定を行うことです。通常、エンドユーザーの柔軟性が犠牲になります。この例をタブレットコンピューティングで確認できます。ただし、デスクトップでは柔軟性が維持されます。
ペペラキ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.