web-dev-qa-db-ja.com

64 GBのパーティションサイズをスワップRAMメモリを集中的に使用するコンピュータ

私のコンピューターには64 GB RAMおよび240 GB [〜#〜] ssd [〜#〜] があり、これはメモリを集中的に使用するために使用します計算(機械学習、データマイニングなど)。インターネットで見つけたアドバイスのほとんどは、約2-4-8 GB RAMコンピュータであり、 RAMスワップパーティション(したがって128 GB)。

128 GBのスワップパーティションを作成するのは妥当ですか。巨大なスワップパーティションを作成するとどのような利点がありますか?

物理RAMが不足した場合に備えて、正しく理解していますか?

  1. スワップがない場合、「メモリ不足」エラーが発生します
  2. スワップがある場合は、RAMページの一部がスワップパーティションにコピーされ、プログラムの実行は続行されますが、速度は遅くなります)。

一部の人々は、読み取り/書き込みサイクルの量が限られているため、SSDでスワップを行うことは悪い考えだと言います。スワップをどれだけ速く使用すると、SSDの読み取り/書き込みサイクルが使い尽くされますか(私の知る限り、書き込みIOPSは約50000です)?

Linuxを使用しています( buntu 14.04 (Trusty Tahr))。

確かに十分なはずです(たとえば、RedHatは4 GBを推奨します)。16GBのディスク容量は実際には大した問題ではないので、今は16 GBのスワップを設定します。

37
wrwt

おそらく少量のスワップだけが必要です。コンピュータの通常のワーキングセットに十分なRAM=がある場合、それを実行すると確信していますが、スワップする必要があるのは次の2つだけです。

  1. RAMからアクセスできなくなる可能性が高い情報を取得するためにスワップが必要です。ディスクキャッシュ用により多くのスペースを解放します。多くのアプリケーションはシステムの起動時に実行され、二度とアクセスされません。)汚れたページをRAM=永久にスタックさせておきたいので、それらを保持するにはスワップが必要です。

  2. 決して埋められない割り当てをカバーするためにスワップが必要です。このスペースは、使用されない場合でも、利用可能である必要があります。それがなければ、システムは十分な空き物理RAMがある場合でもメモリの割り当てを拒否する必要があります。これは、すべての割り当てを一度に使用するのに十分なバッキングストアがないためです。

これらはどちらも大量のスワップを必要としません。たとえば、16GBで十分です。目的は、速度を犠牲にしてより大きなワーキングセットを実行できるようにすることではありません。目的は、64 GBを効果的に使用し、ジャンクで詰まったり、決して発生しないEdgeケースのために予約したりする必要がないようにすることです。

(私はバートに同意します。4GBで十分である可能性が高いです。)

37
David Schwartz

RedHat 64 GBのマシンで4 GBを推奨

ただし、スワップのサイジングは、科学というよりは芸術です。これは、マシンの使用目的、使用しているディスク容量とメモリの量、およびその他の要因によって異なります。 後でいつでもスワップを追加できることに注意してください。

2X物理メモリルールの使用は、最近のシステムのメモリ容量では時代遅れです。ただし、何をしているのかを理解していない限り、ゼロスワップで実行することはお勧めしません。 4 GBの推奨は、出発点として適しています。

30
Bert

Linuxでは、使用可能な仮想メモリの合計(RAM + SWAP)が、一度に実行するすべてのプロセスとそれらの最大仮想フットプリントに対して十分であるように、十分なスワップが必要です。

スワップがこれより少ないか、スワップがまったくない場合、次の状況が発生します。システムがページを割り当てようとしてメモリ不足になりました。ただし、システムには空き領域を作るために削除できる「犠牲者」ページがたくさんあるため、スワップはありませんが、これは依然としてソフトエラーです。つまり、実行可能ファイルなど、ファイルを使用するすべてのメモリマッピングのページそして共有ライブラリ!

システムがデータ(スワップアウトできない)のためにますます多くのスペースを要求するにつれて、実行可能コード(共有ライブラリーと実行可能ファイル)をますます退避させ、ワーキングセットがより厳格なセットにトリミングされるため、ひどいスラッシングを引き起こしますページ。

スワップスペースは、匿名の(ファイルがマップされていない)ページをスワップアウトする場所を提供することでこの問題を緩和します。ページはメモリ割り当てに使用され、実行可能コードがメモリ内にとどまることができます。

それでも、メモリを集中的に使用するタスクを頻繁に実行しない場合は、ほとんどの場合スワップレスの実行を回避でき、必要に応じて(専用パーティションではなく)スワップファイルを手動で構成できます。オンザフライでスワップファイルを作成するには、rootになって次のようにします。

dd if=/dev/zero of=/path/to/swapfile size=$((1024 * 1024)) count=32768  # 32 Gb.
mkswap /path/to/swapfile
swapon /path/to/swapfile

不要になったとき:

swapoff /path/to/swapfile
rm /path/to/swapfile

ノート:

  1. 少なくとも、RAMがあるのと同じくらい多くのスワップを構成する必要はありません。この経験則は、スワッピングの設計方法のためにハード要件であったオペレーティングシステムにさかのぼります。

  2. メモリが利用できない場合、つまりこれらのsysctlエントリの値を操作することにより、Linuxを強制的に失敗させる方法があります。

    vm.overcommit_memory
    vm.overcommit_ratio
    
13
Kaz

さらに考慮事項があります。サスペンドが機能する必要がある場合は、少なくともRAMのサイズが必要で、次にいくつかのサイズが必要です。ただし、主に計算の働き馬を構築しているように思われる場合、必要になるとは思われません。

この場合、パーティションの代わりにスワップファイルを使用することを検討してください。サイズ設定について心配する必要はありません。後で削除したり追加したりするときに、パーティションを再設定する必要はありません。パーティションを介してファイルを使用すると、(注目に値する)パフォーマンスの低下はありません。万が一それが必要になった場合は、サイズを確認してください。これにより、ヒントも得られます。

3
kaste

マシンに適用するワークロードは、実行するために特定の量のメモリを必要とし(ピーク負荷を処理するために方程式に十分な量を追加することを忘れないでください)、少なくともそれを搭載するようにコンピューターを構成する必要があります。

最新のオペレーティングシステムは、物理メモリとスワップスペースの組み合わせとして仮想メモリを提供するため、マシンが利用できるよりも多くのメモリが必要な場合は、必要があります十分なスワップを追加します隙間を埋めるスペース。つまり最大80 GBが必要で、マシンに64 GBがある場合は、16 GBのスワップが必要です。

通常、オペレーティングシステムのインストーラーは初期スワップ領域を作成するように要求します(これが最も簡単で、小さなコンピューターでもインストールできるため)。通常のUnix操作の経験則では、仮想メモリのサイズを物理メモリの3倍なので、通常これをお勧めします。ただし、使用パターンについて詳しく知っているため、必要に応じてこれを変更できます。

メモリのプレッシャーが常に低い場合、スワップスペースなしで作業しても問題はありません。 Linuxは、未使用のメモリをディスクキャッシュとして透過的に使用します。

「大量のスワップ」よりもはるかに優れたアイデアは、ワーキングセットがメモリに収まるように作業を(再)編成し、ファイルシステムを使用して、実行した作業を保存および取得することです。つまり、メモリ使用パターンが何であるかをOSに推測させる代わりに、問題について知っていることを使用してメモリ使用パターンを制御します。

今年の夏に私に直接関連するランダムな例として...二次ふるいを実装する場合、マークアップするために大きな(見かけ上)連続した配列が必要です(この例では実際には詳細が重要ではない複雑なアルゴリズムが必要です)。配列は〜100ギガエントリである必要があるため、1 TBの範囲で簡単に割り当てることができます。それを割り当てるふりをして、OSに驚くほどの非効率なスワッピングを行わせて、ページを取得し、 RAMのうち、配列を介したすべての順次書き込みをサポートします。骨の折れる何かを行う代わりに、メモリにぴったり収まる非常に小さな配列を割り当て、その小さな配列を再利用して残りの大きな配列を繰り返しスライスでカバーします。また、OSを取り除き、実行中のサービスセットを取り除き、シェルを置き換え、メモリアロケータの2つのレイヤーをカスタマイズして、可能な限り多くのアドレス空間を維持するようにカスタマイズしました。私のプロセスに可能な限り隣接したプロセスに。

SSDは高速かもしれませんが、スワップを停止することなく同じ操作のセットを実行するように計算を整理するほど高速ではありません。

2
Eric Towers

1GiB(そしておそらくそれより少ない)のスワップでも問題ありません。私の仕事用コンピュータは通常140-150 MiB以下を使用します。ギガバイトは、そのための過剰なプロビジョニングです。
数百ギガバイト単位のデータセットを必要とする計算タスクを実行しない限りand(これは重要です!)データは1回のアクセスで多少アクセスされますが、それよりもはるかに大きなスワップが必要です。しかし、繰り返しになりますが、データファイルのメモリマッピングは、そのアプリケーションに対して同様に機能します。

しかし、より多くのスワップはより多くを助けますよね?何よりも常に優れています!

たとえば、16GiBのスワップがどのような違いをもたらすかを検討してください(または64GiBについて考えてください)。これらの16GiBを決して使用しない場合は、そもそもそれらを脇に置いておくことはできません。しかし、使用する場合を使用すると、どうなりますか?メインメモリと比較して、ディスクは非常に遅いです。 SATA-600 SSDを使用する場合でも、16GiBの転送には30〜40秒かかり、他の構成では2〜4倍の時間がかかります。
これで、16GiBではなく、ダース程度の4kiBページをページインまたはページアウトしていることに誰かが必然的に反対するでしょう。それは事実ですが、それでも重要な点があります。数ページのスワップインとスワップアウトだけが必要な場合は、16GiBのスワップは必要ありませんが、16GiBのスワップが必要な場合は、それらも転送します(何らかの方法で)。

理論的には、すべてのユーザーの99.9%がスワップなしで64GiBマシン(または任意の8 + GiBマシン)を使用することさえでき、おそらく何かが欠けていることに気付くことはありません。ただし、これはお勧めできません。
まず、オペレーティングシステムの物理メモリが不足したときに破棄できるものの選択肢が少ないため、最適ではありません。できることは2つあります。使用されていないものを交換するか、バッファキャッシュからページを破棄します。スワップがない場合、できることは1つだけです。バッファキャッシュからページを破棄しても問題はありませんが、パフォーマンスに著しく影響する可能性があります。
2番目に、スワップがない場合、プライベートな匿名マッピングは単に失敗する可能性があります。通常、それは起こりませんが、最終的にそれらすべてを満たすために十分な物理メモリが利用できず、スワップがない場合、オペレーティングシステムにはこの選択肢しかありませんが、...
3番目に、恐ろしいOOMキラーが侵入する可能性があります。これは、多かれ少なかれランダムなプロセスが殺されることを意味します。いいえ、結構です。これはあなたが起こしたいことではありません。

とはいえ、交換がX回必要であるなどのアドバイスは、RAMインストールされている量は、聞いたことを繰り返している(そして理解していなかった!) (そして理解できなかった!)数十年前。
「2XのRAMを使用する」ルールは、1980年代と1990年代には覚えやすい経験則であり、「黄金の真実」(ほとんどのユーザーにとっては問題なく機能するもの)になることはありませんでした。今日ではまったく適用されません。

OSが古いものなどをページアウトできるように、妥当なスワップの量が容易に(たとえば、ギガバイト)確保できるはずです。もう少しメモリを要求しても、世界はすぐには終わりません。しかし、それだけです。

1
Damon

他の人が述べたように、RAMが十分にある場合でも、スワップパーティションは良い考えです。 SSDに置くことはお勧めできません。スワップパーティションの頻繁な書き込みは、最終的にドライブを使い果たします。

予備のUSB 3.0ポートがある場合は、スワップスペースにフラッシュドライブを使用することをお勧めします。 SSDと同じくらい高速ですが、はるかに安価な高速フラッシュドライブがたくさんあります-故障し始めた場合に交換できるほど安価です。 Amazonで簡単に検索すると、20ドル未満のまともな16 GB USB 3.0フラッシュドライブ、さらには60ドル未満の64 GBドライブもあることがわかります。

フラッシュドライブ全体をスワップスペースとしてパーティション化すると、必要に応じてスワップスペースが確保され、繰り返し書き込まれるメモリは簡単に(しかも安価に)交換できるので安心です。

1
ArmanX