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


36

コンピューターに64 GBのRAMと240 GBのSSDがあり、これをメモリ集中型の計算(機械学習、データマイニングなど)に使用します。私がインターネットで見つけたアドバイスのほとんどは、2〜4 GBのRAMコンピューターについてであり、RAMスワップパーティションのサイズの2倍(つまり128 GB)を推奨しています。

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

物理RAMが不足した場合に、それを正しく理解できますか?

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

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

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

確かに十分なはずなので(たとえば、RedHatは4 GBを推奨しています)、16 GBのスワップを設定します。16GBのディスクスペースは実際には大したことではありません。


1
事前に作業セットのサイズを知っている場合、またはより低レベルのメモリ管理を行う場合は、スワップに明示的に依存する代わりに、使用mmapして作業セットページを割り当てることを検討してください。スワップの量は、プロセスに必要な量になります。
ふわふわ14

5
「RAMの2倍」を推奨するアドバイスは、コンピューターのRAMがほとんどなかった昔にさかのぼります。いくつかのドキュメントでは、主に2GB未満のRAMを搭載したコンピューターに適用できると述べています。その上で、スワップサイズは、マシンで実行していることにほとんど関連しています。
ジョンWHスミス14

このサーバーフォールトに関するQ&Aも参照してください-Java(および他のアプリ)を実行している場合は、メモリ割り当てを増やすために十分なスワップがあることを確認する必要があります。私は個人的にスワップパーティションのためのRAM + 2のRHELの標準に固執
ウォーレン

2
ここでのコメントのほとんどが削除されたのは残念です。追加:ちなみに、カーネルがサポートしている場合は、スワップパーティションをdiscardSSD にマウントすることをお勧めします。また(これは以下の回答で言及されました)、潜在的に管理を容易にするためにパーティションの代わりにファイルを使用できることを忘れないでください(断片化などによるSSDのパフォーマンスヒットなし)。
ジェイソンC 14

1
SVM学習などのメモリ集中型アプリケーションを使用していて、RAMが不足してスワップを開始すると、すべてが回復するのが遅くなりすぎて、利用可能な唯一の動きがプラグを引くことになります(これは数回起こりました) 。スワッピングを開始する場合は、おそらくプロセスをOOMで強制終了して、少なくとも何かを変更して再起動できるようにする必要があります。たぶん、SSDドライブではそれほど悪くないでしょう。私もOOMKの設定を確認します-それはUbuntuの上で私に起こったこと、時には処理しましたOOM-殺され、彼らは積極的に割り当てられているので、まだたくさんのRAMが残っていたとき
pqnet

回答:


36

おそらく、少量のスワップのみが必要です。コンピュータの典型的なワーキングセットに十分なRAMがある場合(これは確実に実行できます)、次の2つのことのためのスワップのみが必要です。

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

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

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

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


2
@wrwtスワップパーティションをドライブの最後(または少なくともデータパーティションの後に)に置くと、調整を選択した場合にサイズ変更がより速くなり、書き込みの負荷が少なくなります(具体的にはデータパーティションのサイズ変更になります)開始位置を移動する必要がないため、より簡単に対応できます)。機械式ドライブにあることがあるため、SSDの位置とパフォーマンスの間にはリンクがありません。
ジェイソンC 14

この答えはおそらくほとんどの愛好家には十分でしょうが、実際のサーバーには悪いアドバイスです。スワップ空間が不足するとメモリ不足のキラーが起動して終了するため、答えはアプリケーションの作成方法によって異なります。ランダムで処理(そう、あなたは正しいことを読んでいます;「ランダム」)
Soren 14

3
@Sorenこれはスーパーユーザーであり、サーバー障害ではありません。;)スワップスペースの設定が「実サーバー」に対して行う必要がある唯一の決定ではないことは確かに真実です。また、オーバーコミットなどについて決定する必要があります。OOMキラーを調整する必要がある場合もあります。(そして、ワーキングセットが物理RAMを超えると予想される場合、答えははるかに複雑になります。しかし、だれもそのようにマシンを操作することはほとんどありません。)
デビッドシュワルツ14

5
Linuxは、スワップが有効になっていない場合でもメモリをオーバーコミットします。実際に使用されるメモリが多すぎる場合、OOMKが処理します。したがって、答えの2番目のポイントは間違っています。
ルスラン14

1
@MaciejPiechotkaまたはファイルを使用します。
ジェイソンC 14

29

RedHat は、64 GBのマシンで4 GBを推奨しています。

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

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


12
最後の段落の+1。2倍の推奨は、通常の使用でスワッピングを回避するのに十分なRAMがほとんどのコンピューターになかったときにさかのぼります。主観的には、コンピューターを使用することから、2xの制限は、スワップがなくなる前にコンピューターが使用できなくなるほど遅くなるほど十分に大きい数として選択されているように見えます。
ダン・ニーリー

1
2Xは、システムに4GB / 8GBのRAMと数百ギガバイトのディスク容量がある場合にも正常に機能しました。確かに、それはおそらく必要以上のものでしたが、害は何でしたか?しかし、システムには16GB / 64GBのRAMと128GB / 256GB SSDが搭載されているため、その害は明らかです。
デビッドシュワルツ14

12

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. メモリが利用できないときにLinuxをハードに失敗させる方法、つまり、これらのsysctlエントリの値を操作する方法があります。

    vm.overcommit_memory
    vm.overcommit_ratio
    

2
カーネル構成パラメーターを実際に参照するための+1-キーは質問の一部にありますIf I have no swap, I get an 'out of memory' error-つまりfalse-スワップスペースが不足すると、メモリ不足のキラーが起動して強制終了しますスペースを解放するためのランダムプロセス-必要なスワップスペースの量は、アプリケーションの記述方法によって異なります。
ソレン14

@SorenほとんどのRAMが実際のデータで満たされる可能性が高いため、メモリ不足のキラーは大きな違いをもたらさないでしょう。とにかく「真実」のThx。
wrwt 14

3

さらに考慮事項があります。動作するためにサスペンドが必要/必要な場合は、少なくともRAMのサイズが必要で、それからいくらか必要です。ただし、主に計算作業用の馬を作成しているように見えるため、必要とは思えません。

この場合、パーティションの代わりにスワップファイルの使用を検討してください。サイズ変更について心配する必要はありません。後で削除したり追加したりするために、再パーティション化は必要ありません。パーティション上のファイルを使用した場合のパフォーマンスの低下はありません(顕著な)。必要な場合は、サイズを確認してください。これにより、良いヒントも得られます。


1
@Kazあなたはkasteとは違う何かについて話していると思います。kasteは、コンピューターをサスペンド/休止状態にして、電源を切り、後で中断した場所から再開できるようにするには、すべてのRAMを保存するのに十分なスワップスペースが必要だと言います(それ以外はどこに行きますか?)
アマロイ14

@amalloyスワップ領域にRAMを格納した場合、スワップはどこに行きますか(スワップはメモリとして扱われることを思い出してください-失われた場合はRAMを失うことと同じです)。
NPSF3000 14

2

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

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

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

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


2

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

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

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


1

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

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

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


3
SSDにスワップしない場合は+1、そのように使用した場合に寿命が非常に短いコンポーネントにスワップする場合は-1。
Aviator45003 14

1
@TCは正しい、ArmanX-フラッシュ(SSD)の使用を避けようとしている場合、USBでフラッシュを使用する理由は何ですか?それは不合理です。
ウォーレン14

2
@TC:メディアを使い古したためにスワップにSSDを使用しないことは、不当な都市伝説です。スワップは「常に」発生するわけではありませんが、まれに発生します。また、これはWin7のリリース後にMicrosoftで広範に調査された結果であり、その結果、スワッピングの一般的なアクセスパターンはSSD(UbuntuではなくWindowsですが、Linuxのパフォーマンスはそれほど悪くない可能性が高い)で十分に受け入れられます。誰も読んでいない(通常はすべての行を同期する)愚かなログファイルのために、SSDを使い果たす書き込み操作は100倍(または1000倍)あります。
デイモン14

ロジックに欠陥があります:サムドライブが実際にSSDと同じくらい速い場合、なぜ安いのですか?
Agent_L 14

それはバランスです。一方では、スワップファイルを用意することをお勧めします。一方、スワップファイルがSSDを使い果たした場合(そうですね、おそらく問題ではないでしょう)、安価な交換品を使用することをお勧めします。20ドルのフラッシュドライブは、 100ドル以上のSSD。
ArmanX

1

1GiB(そしておそらくそれ以下)のスワップでも問題ありません。私の職場のコンピューターは、通常140〜150 MiBしか使用しません。ギガバイトはそのための過剰なプロビジョニングです。
数百ギガバイトのデータセットを必要とするタスクを計算し(これは重要です!)データに多かれ少なかれ一度アクセスする方法でアクセスしない限り、それよりもはるかに大きなスワップは決して望まないでしょう。ただし、この場合も、データファイルのメモリマッピングだけで同じように機能します。

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

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

理論的には、すべてのユーザーの99.9%がスワップなしで64GiBマシン(または8 + GiBマシン)を使用することさえでき、ほとんどの場合、何かが欠けていることに気付くことはありません。ただし、これはお勧めできません。
まず、オペレーティングシステムが物理メモリを使い果たしたときに破棄できるものの選択肢が少ないため、最適ではありません。できることは2つあります。使用されていないものをスワップアウトするか、バッファキャッシュからページを破棄します。スワップがない場合、できることは1つだけです。バッファキャッシュからページを破棄することは無害ですが、パフォーマンスに著しく影響する場合があります。
第二に、スワップがない場合、プライベート匿名マッピングは単に失敗する可能性があります。ことは、通常は発生しませんが、最終的にすべてのそれらを満たすために利用できる十分な物理メモリがないとき、そして何のスワップはありません、オペレーティングシステムは除いて...、いずれか一方のみこの選択肢を持っている
第三に、恐ろしいOOMキラーはで蹴ること。これは、ほぼランダムなプロセスが強制終了されることを意味します。いいえ、結構です。これはあなたが起こしたいものではありません。

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

OSが古いものをページアウトできるように、簡単に余裕のある合理的な量のスワップ(たとえば、ギガバイト)を用意する必要があります。そうすれば、もう少しメモリを要求しても世界はすぐに終了しません。しかし、それだけです。

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