科学プログラミングのためにコンピューターを使用しています。健全な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
を使用してプロセスを監視し、時間内に強制終了してください。そうでない場合は、再起動後に表示されます。
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スクリプトがより多くのメモリを必要とするため、その列に合わせて大きくなります。
Cgroupsを使用すると、プロセスごとにメモリ使用量を制限できます。
https://en.wikipedia.org/wiki/Cgroups
http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt
科学計算はメモリ集中型であることが有名です。cgroupでアプリをサンドボックス化することにより、メモリのプレッシャーが軽減されるため、残りのプロセスが犠牲になることはありません。
代わりに、アプリは仮想マシンに委任されたメモリのみを使用できるため、もちろんパフォーマンスを犠牲にして、VMを一種のハード制限として使用することもできます。ただし、VMは、cgroupのセットアップと保守に比べて、未開始のユーザーに対して構成がはるかに簡単です。
決定決定:)がんばって!