web-dev-qa-db-ja.com

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

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

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

自宅実験*!

ターミナルを開き、pythonを起動し、numpyがインストールされている場合は、これを試してください。

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

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

32
Hooked

Shellビルトイン 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-hereを使用すると、pythonに少なくとも29MBのメモリ(VSZ列)が必要であることが確認されています。 RSSの制限は、pythonスクリプトがより多くのメモリを必要とするため、その列に合わせて大きくなります。

20
Lekensteyn

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

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

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

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

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

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

12
ppetraki