スワップは時代錯誤ですか?


43

私はかなり長い間unixを使ってきましたし、ここ数年、スワップは時代錯誤だと感じましたが、他の人々がどう思うか興味があります。

私の議論は大体これです(グローバルなulimitや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-beardsには、スワップを維持する説得力のある理由がありますか?

回答と分析の更新:

  • 確認済み?-fork()は、子プロセスに対して親と同じ量のメモリを必要とします

    Modern fork()はPOSIX(一般)の子供向けのコピーオンライトですが、特にLinuxFreeBSDであり、外挿によってOSXを想定しています。スワップが運ぶ時代錯誤的な荷物のこの部分を考えます。

    不思議なことに、このSolarisの記事は、Solarisがfork()でCopy-on-Writeを使用しているにもかかわらず、fork()が無駄にならないように、空き仮想メモリに少なくとも2x(!)中間。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であるかどうか、または、ramap()のようなファイルをramよりも大きくしてmmap()の遅延初期化に依存することができるかどうかはわかりません。おそらく最近スワップなしでSolarisを正常に実行できる可能性があります。他のPOSIXyオペレーティングシステムよりも使い勝手が悪いようです。

  • 逮捕!人気のあるLinux休止状態ツールはスワップに依存しているようです

    デフォルトでは、TuxOnIceは休止状態のスワップに依存しているように見えますが、他のバックエンドも存在します。ただし、休止状態にする必要のあるボックスを実行していない場合は、「Linuxでスワップは非名義的である」という声明を引き続き支持します。


un * xのひげはあまりありませんが(いくつかの髪はまだです;)、私の2セントは、スワップの「ビット」を持つことで、システムにある程度の堅牢性が与えられるということです。直接OOMの代わりに、システムの制限を少し超えている場合は、代わりにスワップに行きます。確かに、システムの制限を本当に超えると、システムは最終的にクラッシュ/停止/核そのもの/想像できるものは何でもクラッシュします。だから遊ぶために少しロープを与える;)
Ouki

1
RAMをオーバーコミットしないようにシステムを設定した場合、fork()についての事実は事実です(これはデフォルトではありません)。さて、なぜあなたはその設定が必要なのか、私には何の手がかりもありません。リアルタイム処理には役立ちません。
ジョシュア

@Jushua:オペレーティングシステムによっては、メモリのオーバーコミットがデフォルトにならない場合があります。
-jlliagre

8GBのRAMを搭載したNASサーバーがあり、最大2つのVMを実行します。私はスワップを入れませんでした。頻繁にスワップを開始する場合は、とにかくすでに死んでいます。したがって、それはあなたの議論を完全にサポートします。一方、さびたデスクトップはまだ1GBのRAMに制限されており、そこにはスパースメモリを処理するためのスワップがあります。少し遅くなりますが、Firefoxと他のアプリケーションを同時に開くことができます。
ホイヘンス

すべてのキャッシュが空になり、システムが遅くなった後にのみ、OOMキラートリガーが遅すぎます。システムの動作を維持するために、earlyoomまたはnohangを使用して同じジョブを実行しますが、それよりも前です!スワップの有無にかかわらず使用できます。
joeytwiddle

回答:


28

(ディスク領域としての)スワップと(RAMからディスクへおよび相互にメモリページを移動する方法として)スワップ(と)を混同しないでください。

過度のスワッピングはパフォーマンス上の理由で回避する必要がありますが、スワップ領域を持つことは必ずしも問題ではありません。

Linuxなどのシステムでメモリをオーバーコミットする、つまりプロセスが使用可能なメモリよりも多くのメモリを割り当てることができるシステムでは、状況を処理するのに十分なスワップがないとRAMが不足するとOOMキラーがトリガーされます。終了する「正しい」プロセスを選択するために使用されるアルゴリズムを信頼し、適切にシャットダウンする機会を与えられずに1つ以上のプロセスを強制終了することを受け入れる必要があります。ここに、OOMキラーがまったく良いアイデアではない理由を説明する有名な例えがあります。

Solarisのようなメモリをオーバーコミットしないシステム。つまり、RAMまたはディスク上で、メモリの予約が常に仮想メモリによって保証されていることを確認します。無駄に。


1
Solarisについてのポイントはまだ本当ですか?blogs.oracle.com/jimlaurent/entry/solaris_faq_myths_and_factsの状態:現在の仮想メモリは、物理RAMとディスク上のスワップスペースの合計で構成されています。Solarisでは、スワップスペースをまったく構成する必要はありません。このオプションを選択すると、RAMがいっぱいになると、新しいプロセスを開始できなくなります。私はあなたのポイントが何であるかを見ると思います-あなたがスワップできずに物理的なRAMよりも大きなものをmmapしたいなら、あなたはできませんでしたか?(mmapは遅延初期化子であるにもかかわらず)。
シンセサイザー

5
はい、Solarisについての私の主張はまだ正しいと確信しています。Jim Laurentの引用が正しい、つまりSolarisがスワップを要求しない場合でも、スワップがないと、割り当てられたメモリの一部が使用されていない場合でも、すべてのメモリ予約(つまりmalloc)をRAMでバックアップする必要があります。これは、大きなmmapやtmpfsとは関係ありませんが、tmpfsは、Solaris(およびその点でもLinux)とのスワップを希望する理由でもあります。
jlliagre

1
Linux向けの更新:オーバーコミットをオフにしたり、OOMアルゴリズムを変更したり、cgroupを使用して独自のOOMハンドラーを作成したりすることもできます。
ペテルフ

1
@peterph Linuxでオーバーコミットをオフにすると、スワップは時代遅れになります。オーバーコミットしない場合は、すべての予約をバックアップするのに十分なスワップ領域があることを確認する必要があります。
jlliagre

1
フォークによって予約される仮想メモリは、それを行うプログラムのサイズによって異なります。2 GBのメモリフォークを使用するJava VMがあるとしましょう。一時的に2 GB以上必要になります。使用可能な2 GB未満または同時に複数回使用しているときにこれが発生すると、1つ以上のフォークが失敗します。これは、OSがオーバーコミットしていない場合や、Linuxでもオーバーコミットが無効になっている場合の一般的な状況です。これは、スワップ領域を十分に大きくすることで簡単に修正できますが、IMHOはメモリのオーバーコミットよりもはるかに優れたソリューションです。
jlliagre

3

スワップを維持する1つの理由を知っています。システム用に構成する余裕があるだけのメモリを消費するアプリがあります。Hadoopを使用します。これは、処理の一部でforkとexecを実行して単一のunixコマンドを実行します(「uname」または「user」、またはJavaに相当するものが見つからなかったと思います)。javaは、ネイティブアプリケーションのように、コピーオンライトセマンティクスでvforkを実行しないようです。4GbのRAMを使用してアプリを起動した場合、フォークすると、フォークは別の4GbのRAMを使用しますが、すぐに解放します。交換するHadoopの4G​​bのスワップがない場合、アプリ用に4Gbを使用するためだけに8GbのRAMを支払う必要があります。


これは素晴らしい点ですが、現代のfork()の反映ではありません-LinuxおよびFreeBSD(および、表面上はOSX?)では、コピーオンライトページを使用してfork()が実装されます。コピーオンライト(またはCOW)は、データのコピーを遅延させるか、完全に防止する手法です。プロセスのアドレス空間を複製するのではなく、親と子は単一のコピーを共有できます。ただし、データは、書き込まれると複製が作成され、各プロセスが一意のコピーを受け取るようにマークされます。引用:forums.freebsd.org/showthread.php?t=26355およびfork()のLinuxマンページ
シンセサイザー

本当ですが、COWとマークできないページがいくつかあります。たとえば、新しい子プロセスのカーネルスタックに使用されるページや、内部データ構造(the files_struct、the struct signals、the task_struct、およびその他)に使用されるページ。また、多くの実行可能ページは位置依存コード(PIC)ではないため、ダイナミックローダー(ld-linux.so)によって変更された実行可能コードのページには、すぐにスワップスペースに何も書き込まれない場合でも、スワップスペースを予約する必要があります。だからLinuxが大好きです。スワップをオフにしてもシステムは実行されます。:)
アズレイ

3

技術的に議論に追加することはできませんが、いくつかの例を挙げることができます。私の古いノートブック(2GB RAM kunbuntu lucid)は通常、0のスワップで実行されます。100の接続をまとめて使用できる多数のトレントで送信(ビットトレントクライアント)を実行すると、スワップが大きくなります。1GBの実メモリを使用するXP vmを実行していると、さらに悪化します。

他の人は、グラフィックレンダリングのようなメモリを集中的に使用するプロセスもスワップに陥る可能性があるとコメントしています。たまにそれを行うだけであれば、それは問題ではありません。

OOMの問題に関する限り、swapは実際に命の恩人になる可能性があります。これは、問題を特定してから南に進むまでの時間を節約できるからです。多くのことはほとんどすべてのメモリを使用するため、それに注意を払うことはありませんが、スワップが実行され始めると、それに気づき、問題を探し始めます-それが噛み付く前に。


ええ、レガシーシステムはスワップを有効にしなければ大したことはできません。256MBのRAMを搭載した古いサブノートブックがまだあります。ほとんどのプログラムを起動するにはスワップが必要です。しかし、この質問は現代のシステムを対象にしていると思います。
ドミトリーグリゴリエフ

3

スワップスペースには非常に優れたアプリケーションが1つあります。RAMを使用するストレージデバイスにスワップスペースを配置して、インストール可能なシステムRAMの制限を克服するRAM拡張

このガジェットをご覧くださいhttp://techreport.com/articles.x/16255 基本的にはS-ATAからDDR2-RAMへのインターフェースです。最大64GBのRAMをそれらに入れることができます。それらの1つにスワップスペースを配置すると、かなりの追加RAMが得られます。もちろん、通常のシステムRAMほど高速ではありません。しかし、システムRAMを一種の追加キャッシュレイヤーに変えます。


1
64GBのRAMをサポートするメインボードに 100ドルを投資することは、その価格(549ドル)を考慮するとより効率的ではないでしょうか?
ドミトリーグリゴリエフ

1
@DmitryGrigoryev:もちろんです。しかし、時にはあなたが(理由の理由のために、ハードウェアの特定の種類を使用するように強制しているの医療システム認証)だけでなく、非常に少しの時間で生産途方もなく大規模なデータセットに対処する必要があります(断層撮影スキャナ、データレートを考える> 3GiB /秒)。
datenwolf

その場合、RAMドライブを医療機器としても認定する必要はありませんか?;)しかし、ええ、私はポイントを得ました。
ドミトリーグリゴリエフ

1
@DmitryGrigoryev:確かにあなたはそれをしなければなりません。ただし、このようなS-ATA RAMディスクデバイスの認証は、メインボード全体の認証よりもはるかに簡単です。医療機器で使用されるコンピューターの調達時には、通常、可能な限り認定された市販のコンポーネントを購入します。すぐに利用できる認定のないものについては、必要なテストと認定を自分で行います。特に、患者の安全に重点が置かれ、治療計画にデータが使用されていない研究で作業する場合、これは最も費用効果が高く、最も迅速なソリューションです。BT; DT。
datenwolf

3

4Gb以上のノートブック/デスクトップで、スワップなしでLinux およびWindowsを実行しています(Windowsの命名法では、ページングファイル)。メモリの枯渇が発生する場合がいくつかありますが、私はそれらに対処します。私はこのシステムがこのようにきびきびしていると感じています。ただし、ワークロードに特別な要件はありません。

私が学んだこと:

  • Windowsは時間とともにメモリを「失います」。稼働時間は約20〜30日で、リブートするだけになります。これが起こる理由はわかりません。何らかのドライバのリークかアンチウイルスのどちらかであると推測しています。ページングファイルがある場合、このリークしたメモリをページングファイルに配置できると考えているため、通常のWindowsシステムではこの問題に気付くことは困難です。
  • Firefoxは、Chromeよりも少ないメモリでより良い処理を行います。Firefoxは警告を発し、それでも実行されますが、Chromeはただクラッシュします。

2

あなたの議論は、パフォーマンスが重要なサーバーに対して非常に有効であり、次にどのアプリが動作するかを知ることは予測できないかもしれません。

しかし、デスクトップの場合、タスクをプッシュおよびポップするときにスワップが便利だと思います。

たとえば、アプリAを使用してタスクに取り組んでいるときにB、何か(サブタスクまたは中断)にアプリを使用する必要があることがわかった場合、作業A中にディスクにスワップすることは精神的に簡単ですB比べて閉じAた後、後で再びそれを起動することを忘れないでください。

これは、A再起動時に復元されない未保存の状態を保持している場合に特に当てはまります。

Aスワップへのプッシュとスワップからのプルの高速化、またはスワップのクローズと再起動の高速化は、アプリによって異なります。(一部の人は、スタートアップは遅いが、住宅のサイズは小さい。)

ただし、生産性を向上させるためのより良いソリューションは、追加のRAMをインストールすることであることに同意します。


更新:この答えを書いた後、大量のRAMと低速のハードドライブを搭載したラップトップを所有しました。その場合、私のアドバイスは逆転しました!ここに賛否両論の要約があります。
joeytwiddle

1

私のシステムでは、RAMを大量に消費すると/ tmpがあふれてスワップします。

これは、/ tmpに実際のファイルシステムを使用するよりもはるかに高速です。


それはかなり危険です-ramfsが必要な場合は、fstab(またはオプション)でサイズを明示的に設定するように指定します。プログラムが/ tmpにファイルの作成を開始するのと同じくらい、メモリ割り当てで狂気に陥る可能性があります。スワップは、ramfsファイルを表示するのに悪い場所です(特にramfsの速度に依存している場合)
シンセサイザー

2
頻繁にRAMサイズを超えています。スワップによってバックアップされたtmpfsは、スピルした場合でもext2よりも大幅に高速です。
ジョシュア

/ tmpのtmpfs / ramfsのプロキシによってRAMがいっぱいになるアプリケーションについては、まだ知っていると思いますし、おそらく今後の調査項目になるでしょう。それは私にヒッピージービーを与えます!
シンセサイザー

次に、制限=スワップのサイズを設定します。
ジョシュア

ちなみに、これはramfsとtmpfsの違いです。tmpfsはあふれてスワップできますが、ramfsはできません。
ジョシュア

1

スワップを使用する場合、多くの理由があります。

通常、システムに十分な物理メモリがない場合、カーネルは一部のアプリケーション(実際には、アプリケーションを実行していないことによって使用されるメモリの一部)をスワップすることができます。

後で、これらのアプリケーションが何らかの処理を行う必要がある場合(たとえば、一部のデータがソケットに到着したり、タイマーが作動したりする)-カーネルは他のアプリケーションをスワップさせます。

スワップの使用の別の例は、ディスクへのサスペンドです。

組み込みデバイスに関しては、それらはすべて(少なくとも)2つの大きなグループに分けることができます。

  1. Linux / Windowsまたは同様の非RTOS(リアルタイムOS)を実行します。または
  2. RTOSを実行します。

もちろん、いくつかのコード(ある種のマイクロコントローラー)だけを実行しているデバイスもあります。そのようなデバイスにはOSがないため、それらのデバイスについては説明しません。

(一部のOSを実行している)組み込みデバイスの最初のグループは、スワップを使用できます(通常は使用します)。そして一般的に、そのようなデバイスはデスクトップやサーバーと同じ方法でスワップを使用します。

RTOSにはイベントで応答する時間に制限があるため、2番目のグループのデバイス(RTOSを実行している)はスワップをまったく使用しません。

  • スワップからの読み取りには予測できない時間がかかる場合があります
  • デバイスには、(コンパイル時に)スワップする必要のないタスクの数が事前に定義されています

ところで、Linuxはスワップを使用する方法の説明がたくさんあり、それらの一つがある http://distilledb.com/blog/archives/date/2009/02/22/swap-files-in-linux.page
、Windowsの使用は、同様のアプローチ。


また、TuxOnIceなどを使用している場合を除き、休止状態(ディスクへのサスペンド)にはスワップが必要です。
レナン

1

それは私には思われる休止状態およびLinux上でハイブリッドスリープニーズのスワップ領域の両方

ハイブリッドスリープを使用する必要に直面するまで、Linuxでスワップスペース/パーティションを使用しませんでした-シャットダウン、休止状態、ハイブリッドのいずれかのみを選択するUpowerによって処理されるため、システムでクリティカルバッテリーレベルのスリープが利用できなかったため-睡眠。(詳細はこちら


0

私が見たいくつかの良い用途は、多くのメモリを使用するプロセスですが、パフォーマンスは重要ではありません。1つのケースは、メモリリークが悪かった古代のFirefoxでした。RAMが一杯になり、スワップオーバーして悪影響を与えることはありません。もう1つは、再帰DNSサーバー(めったに使用されない巨大なキャッシュを急速に構築する)でした。

私が見たスワップについての他の説明は、「SWAP = 2 * RAMを常に構成するように言われます。これは完全なナンセンスです。RAMとスワップの間に関係はありません。スワップは、メモリ使用量のスパイクに対応することです」 、ほとんどの場合、負荷がRAMに収まるように十分なメモリを追加する必要があります。負荷が安定している場合は、スワップは必要ありません。負荷が非常に変動する場合は、スパイクに十分なスワップが必要です。全体的にパフォーマンスに大きな影響を与えないように、swapが使用されることはほとんどありません。要約すると、負荷の急上昇が分からないため、ディスクはRAMよりもはるかに安いため、SWAP = 2 * RAMを構成します。

Solarisのいくつかの古いバージョンは、少なくともRAMと同じくらいのスワップがない限りスワップをまったく使用できませんでした(RAMを終了するために固定スワップスペースを割り当てたことを思い出します)。値。しかし、それは私たちの大きなマシンが64 MiBのRAMと1 GiBのディスクを搭載していた昔のことです...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.