スワップアウト-どうなりますか?


8

512 MBのRAMと348 MBのスワップを備えたDebian VMマシンで、1 GBのファイルをエディターで開いてメモリが不足するとどうなりますか?

システムをクラッシュさせますか?そうでない場合、Linuxはこれをどのように処理しますか?

Swapspaceをインストールして、必要に応じて自動的かつ動的に十分なスワップを作成するのは賢明ではないでしょうか?

sudo apt-get install swapspace

スワップを増やしてみませんか?
guntbert 2014年

HDDスペースは私のVMで高価です
rubo77

1
一部のエディターはファイルをmem-mapし、すべてを事前にロードしないことに注意してください。これにより、ソースファイル自体を「スワップ」として使用するため、問題が完全に修正されます。
Vality 2014年

回答:


17

これは、実行している設定、特にメモリのオーバーコミット(/proc/sys/vm/overcommit_memory;詳細はman 5 procを参照)によって異なります。

メモリーのオーバーコミットが無効になっている場合、エディター(およびおそらく他のプログラムが同時に試行)はメモリーの割り当てに失敗します。システムコールから失敗の結果が返されます。これを処理するのは各プログラム次第ですが、残念ながら一般的な結果はプログラムがクラッシュすることです。エディタは、たとえば、ファイルを開くことを拒否する場合もあります。

メモリのオーバーコミットが有効になっている場合、メモリを要求するシステムコールは成功する可能性があります。その場合、メモリが実際にアクセスされると、カーネルはメモリ不足を認識し、プロセスを強制終了してメモリを解放します。そのプロセスは編集者である場合とそうでない場合があります。選択は、システム上の各プロセスの(oom_scoreいくつかのカーネルヒューリスティックの結果)およびoom_score_adj(構成された)によって制御されます。それらは、そのproc(5)マンページにもあります。


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


1
+1自分でテストする簡単な方法を提案するための+1
rubo77

1
2番目の質問「動的スワップ割り当てを使用することは良い考えですか」に答えます。
gena2x 2014年

@ gena2xはい、それは非常に良いアイデアです。なぜなら、システムを過負荷状態で次々に殺すのではなく、システムの応答性を高めるからです。-1。大きな固定スワップパーティションがある場合に最適ですが、別の原因があります(スワップフラグメンテーションの減少)。
peterh-モニカを2014年

大きな固定スワップがある場合、システムはアクティブなタスクをディスクにスワップアウトしようとし、それらを永久にスワップバックするため、応答しなくなります。
gena2x
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.