512 MBのRAMと348 MBのスワップを備えたDebian VMマシンで、1 GBのファイルをエディターで開いてメモリが不足するとどうなりますか?
システムをクラッシュさせますか?そうでない場合、Linuxはこれをどのように処理しますか?
Swapspaceをインストールして、必要に応じて自動的かつ動的に十分なスワップを作成するのは賢明ではないでしょうか?
sudo apt-get install swapspace
512 MBのRAMと348 MBのスワップを備えたDebian VMマシンで、1 GBのファイルをエディターで開いてメモリが不足するとどうなりますか?
システムをクラッシュさせますか?そうでない場合、Linuxはこれをどのように処理しますか?
Swapspaceをインストールして、必要に応じて自動的かつ動的に十分なスワップを作成するのは賢明ではないでしょうか?
sudo apt-get install swapspace
回答:
これは、実行している設定、特にメモリのオーバーコミット(/proc/sys/vm/overcommit_memory
;詳細はman 5 proc
を参照)によって異なります。
メモリーのオーバーコミットが無効になっている場合、エディター(およびおそらく他のプログラムが同時に試行)はメモリーの割り当てに失敗します。システムコールから失敗の結果が返されます。これを処理するのは各プログラム次第ですが、残念ながら一般的な結果はプログラムがクラッシュすることです。エディタは、たとえば、ファイルを開くことを拒否する場合もあります。
メモリのオーバーコミットが有効になっている場合、メモリを要求するシステムコールは成功する可能性があります。その場合、メモリが実際にアクセスされると、カーネルはメモリ不足を認識し、プロセスを強制終了してメモリを解放します。そのプロセスは編集者である場合とそうでない場合があります。選択は、システム上の各プロセスの(oom_score
いくつかのカーネルヒューリスティックの結果)およびoom_score_adj
(構成された)によって制御されます。それらは、そのproc(5)マンページにもあります。
この場合、メモリ不足の状態に近づくと、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状態は、ソフトウェアのバグ(メモリリーク)、または「この10 GBファイルをエディターにロードする」または「グラフィックファイルのサイズ変更を並行して実行する」などの問題が原因で発生することに注意してください。結論:スワップが必要かどうか。