RAMが512MBでスワップスペースが348MBのDebian VMシステムでエディタで1GBファイルを開いたときにメモリが不足するとどうなりますか?
システムのクラッシュを引き起こしますか?それともそうでなければ、Linuxはこれをどのように処理しますか?
インストールは賢明な対策ではありません。スワップスペースそれでは、必要に応じて十分なスワップスペースが自動的に動的に作成されますか?
sudo apt-get install swapspace
答え1
これはランタイム設定、特にメモリオーバーコミット(詳細について/proc/sys/vm/overcommit_memory
はman 5 proc
参照)によって異なります。
メモリオーバーコミットが無効になると、エディタ(および同時に試行する他のプログラム)のメモリ割り当て試行は失敗します。彼らはシステムコールから失敗の結果を得るでしょう。これを処理することは各プログラムに依存しますが、残念ながら一般的な結果はプログラムがクラッシュすることです。たとえば、編集者は単にファイルを開くことを拒否することができます。
メモリオーバーコミットが有効になると、メモリを要求するシステムコールが成功する可能性が高くなります。この場合、実際にメモリにアクセスすると、カーネルはメモリ不足を認識し、メモリを回復するためにプロセスを終了します。プロセスは編集者でも、そうでない場合もあります。選択は、システムの各プロセスoom_score
(複数のカーネル経験的方法の結果)と(構成)によって異なります。oom_score_adj
これはproc(5)マンページにもあります。
答え2
この場合、Linuxには大きな問題があります。メモリ不足の状況に近づくと、システム全体が過度にスワップを開始しても完全に応答しなくなることがわかります。マウスカーソルも「遅すぎる」端末を起動できず、問題のあるメモリを捕獲するプロセスを手動で終了することはできません。これは、過度のディスク操作が原因で発生します。
これを防ぐために、私は通常スワップを完全に無効にし、Linuxカーネルが常に応答し、最悪の場合、メモリ不足(OOM)キラーがいくつかのプロセスを終了します。 OOMによってプロセスが終了するロジックは、カーネルのバージョンによって異なります。
したがって、答えは「いいえ」です。動的スワップ割り当てを有効にしないでください。機械が停止します。
ループ内でいくつかのメモリを割り当て続けるプログラムを使って試してみるのは簡単です。このプログラムをテキストファイルに保存しますmemeater.c
。
#include <stdlib.h>
int main() {
for (;;) {char* mem=malloc(4096); mem[0]=1;};
}
その後、コンパイルします。
$ gcc memeater.c -o memeater
そして、以下を実行してください:
$ ./memeater
スワップを使用せず、動的スワップ割り当てを試してください。
また、ほとんどの場合、このOOMの状況は、ソフトウェアのバグ(メモリリーク)が原因で発生したり、「この10GBファイルをエディタからロード」や「並列実行でサイズを変更するには、あまりにも多くのグラフィックファイルを実行する」などの誤った操作行ったために発生することに注意してください。 「次の結論を行います。スワップが必要ですか?