私のDebian VM 512 MBのマシンRAMおよび348 MBのスワップで、エディタで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ファイルをエディターでロードする」または「グラフィックファイルのサイズ変更を並行して実行する」などの問題が原因で発生することに注意してください。結論:スワップが必要かどうか。