私はUNIXをかなり長い間使用しており、ここ数年、スワップは時代錯誤だと感じていましたが、他の人々がどう思っているのか興味があります。
私の議論は大まかにこれです(グローバルな制限やOOM設定の調整がないと仮定します):
There is little value in swap because if you need to swap out to disk,
odds are it's going to be a vicious cycle where an app will continue
to eat not only real memory, but swap as well until it gets OOM
reaped (_if_ it gets OOM reaped).
If you have swap enabled, it will only prolong this death march to
the detriment of other processes - and in the worst case where the
process is not OOM reaped in a timely manner, grind the system to
a halt.
Without swap, it will probably get OOM reaped sooner (if at all)
パフォーマンスを調整するサービスの場合、リソース使用量の上限を理解することが、最初にサービスを調整するための鍵になると思います。その場合、必要な量がわかります。
実行中のプロセスを一時停止し、他のもののためのスペースを空けるためにスワップアウトする可能性がある多くの状況(一部ですが、多くはありません)を想像することはできませんが、それを行うとソケットが失われるため、 gccを介したコアダンプまたは手動でメモリをコピーすることは、機能的に同等です。
組み込みシステムでスワップしたくないのは間違いありません(使用可能なRAMが小さい場合でも)。RAMが不足した場合は、セクターあたり100万書き込みのフラッシュメモリを破棄するよりも、プロセスを停止させたいと思います。セクターをナブまでウェアレベリングして週末をドライブします。
そこにあるUNIXのひげには、スワップを続けるやむを得ない理由がありますか?
回答の更新&&分析:
-
確認済み? – fork()は、子プロセスに親と同じ量のメモリを必要とします
最新のfork()は、POSIX(一般的に)の子供向けのコピーオンライトですが、特にLinuxとFreeBSDであり、外挿によってOSXを想定しています。スワップが運ぶ時代錯誤的な荷物のこの部分を考えます。
不思議なことに、このSolarisの記事では、Solarisがfork()でコピーオンライトを使用している場合でも、少なくとも 2x(!)が必要であると主張しています。 fork()が途中でクラップアウトしないようにするための空き仮想メモリの親プロセスサイズ。 Solaris要素はやや スワップは時代錯誤であるという議論を覆します。十分なオペレーティングシステムがCoWを正しく実装しているため、スワップのさらなる正当化としてマークするよりも、神話を払拭することが重要だと思います。以来。それに直面しよう。この時点で、実際にSolarisを使用しているのは、おそらくOracleの人たちだけです。不快なSolarisはありません!
-
確認済み – tmpfs / ramfsがいっぱいになると、tmpfs/ramfsファイルをコンビニエンスとしてスワップに移動できます
無制限のtmpfs/ramfsを使用しないでください。 tmpfs/ramfsで使用するRAMの量を常に明示的に定義してください。
-
もっともらしい –「万が一に備えて」少し交換してください
私の昔の上司の一人は、「知らないことはわからない」と言っていました。基本的に、まだ持っていない情報に基づいて決定を下すことはできません。ただし、これは私にとってスワップのもっともらしい議論です。アプリケーションがスワップアウトしているかどうかを検出するために行うことの種類は、malloc()が成功するかどうかを確認したり、からの例外をキャッチしたりするよりも重いと思います。失敗したnew()。
これは、デスクトップを実行していて、ランダムなことがたくさん起こっている場合に役立つことがありますが、それでも、何かがうまくいかない場合は、スワップ地獄に飛び込むよりも、OOMを刈り取ってください。それは私だけです。
-
無効になりました! – Solarisの場合 、スワップは いくつかの理由で重要です
tmpfs –状態 tmpfsで使用可能な空き領域の量は、システム内の未割り当てのスワップ領域の量によって異なります。 tmpfsファイルシステムのサイズは、それに書き込まれるファイルに対応するために大きくなりますが、tmpfsのヘビーユーザーにはいくつかの固有のトレードオフがあります。 Tmpfsは、実行中のプログラムのデータおよびスタックセグメントとリソースを共有します。 tmpfsファイルシステムが最大許容サイズに近い場合、非常に大きなプログラムの実行に影響を与える可能性があります。 Tmpfsは、システムのスワップスペースの4MBを除くすべてを自由に割り当てることができます。
スワップに関するSolarisの事実と神話–状態今日の仮想メモリは、物理RAMとディスク上のスワップスペースの合計で構成されています。 Solarisでは、スワップスペースを構成する必要はまったくありません。このオプションを選択すると、RAMがいっぱいになると、新しいプロセスを開始できなくなります。 。
これが、作成できる最大の仮想マップが ram + swapであることを意味するかどうかはわかりません 、またはramよりも大きいファイルでmmap()のようなことを実行でき、mmap()の遅延初期化に依存できる場合..最近はスワップなしでSolarisを正常に実行できる可能性がありますが、それよりも使い勝手が悪いようです。その他のPOSIXyオペレーティングシステム。
-
無効になりました! 人気のあるLinuxハイバネーションツールはスワップに依存しているようです
デフォルトでは、TuxOnIceは休止状態のスワップに依存しているように見えますが、他のバックエンドは存在します。ただし、休止状態にする必要のあるボックスを実行していない場合でも、「スワップはLinuxではアナクロニスティックです」というステートメントの後ろに立っています
承認された回答:
スワップ(ディスク領域として)とスワップ(メモリページをRAMからディスクに相互に移動する方法として)を混同しないでください。
過度のスワッピングはパフォーマンス上の理由から避けるべきものですが、スワップ領域があることは必ずしも問題ではありません。
Linuxのように、メモリをオーバーコミットするシステム、つまり、プロセスが使用可能なメモリよりも多くのメモリを割り当てることができるシステムでは、状況を処理するのに十分なスワップがない状態でRAMが不足すると、OOMキラーがトリガーされます。強制終了する「適切な」プロセスを選択するために使用されるアルゴリズムを信頼し、適切にシャットダウンする機会を与えられずに、強制終了する1つ以上のプロセスを受け入れる必要があります。これは、OOMキラーがまったく良い考えではない理由を説明する有名な例えです。
メモリをオーバーコミットしないSolarisのようなシステムでは、つまり、RAM内であろうとディスク上であろうと、メモリ予約が常に仮想メモリによってバックアップされるようにするためには、十分なスワップ領域が絶対に必要です。そうしないと、RAMの潜在的に重要な部分が必要になります。無駄になりました。
関連:Linux –パーティションサイズを4GB RAMに交換しますか?