web-dev-qa-db-ja.com

十分な量のRAMがある場合、スワップ領域が必要ですか?

Linuxのswapパーティションの目的は、私が理解していることから、RAMそしてそれをハードドライブの特定のパーティションに移動し(読み取りまたは書き込みを遅くすることを犠牲にして)、基本的にアクティブなアプリケーションにより多くの「高速メモリ」を許可します。

これは、RAMの量が少ないマシンを使用していて、実行時に問題が発生したくない場合に最適です。ただし、システムに16 GBまたは2 GBのRAM、およびStackExchangeのMySQLデータベースを実行していない、またはLinuxで1080pのフルの長さの映画を編集していないと仮定すると、スワップパーティションを使用する必要がありますか?

95
IQAndreas

はい。

always は、非常に説得力のある、禁止されている理由(ディスクがまったくない、ネットワークディスクだけが存在するなど)がある場合を除いて、常に有効にする必要があります。頻繁に推奨されるとんでもないサイズ(RAMの量の2倍など)を交換する必要がありますか?さて、no

その理由は、アプリケーションが物理メモリよりも多くのメモリを消費する場合にスワップが役立つだけではないからですRAM(実際、その場合、スワップはあまり役に立たないパフォーマンスに深刻な影響を与えるためです。現在のスワップの主なインセンティブはnotです。RAMの16GiBを32 GiBに魔法のように変換しますが、インストールされているものをより効率的に使用します、利用可能なRAM。

最近のコンピューターでは、RAMは未使用になりません。未使用RAMは、代わりにお金を購入して節約できなかったものです。したがって、あなたがロードしたもの、またはその他の方法でメモリマップされたもの、[可能性=後でいつでも誰でも再利用できるもの(セキュリティ制約により制限されます)がキャッシュされます。マシンが起動した直後、すべての物理RAMは何かに使用されます。

オペレーティングシステムから新しいメモリページを要求するときはいつでも、メモリマネージャは適切な判断を行わなければなりません。

  1. バッファキャッシュからページを削除する
  2. マッピングからページをパージします(ほとんどのシステムで事実上#1と同じです)
  3. 長期間アクセスされていない、できれば絶対にアクセスしないページをスワップに移動します(これは実際にはプロアクティブに発生することもあり、必ずしも最後の瞬間に発生するわけではありません)。
  4. プロセスを強制終了するか、ランダムプロセスを強制終了します(OOM)
  5. Kernel panic

オプション#4と#5は非常に望ましくないであり、オペレーティングシステムに他に選択肢がない場合にのみ発生します。オプション#1と#2は、すぐにまた必要になる可能性があるものを捨てることを意味します。これはパフォーマンスに悪影響を及ぼします。

オプション#3は、(おそらく)必要のないものをすぐに低速のストレージに移動することを意味します。 必要が高速RAMを使用できるようになったため、これで問題ありません。

オプション#3を削除することで、オペレーティングシステムを効果的に#1または#2のいずれかに制限できます。ディスクからのページの再読み込みは、スワップからの再読み込みと同じですが、通常はスワップからの再読み込みが必要になる可能性が低くなります(ページングを適切に決定するため)。

言い換えると、スワップを無効にしても何も得られませんが、メモリ要求を処理するためのオペレーティングシステムの有用なオプションの数が制限されます。 ではないかもしれない、しかしおそらくかもしれない欠点(そして利点になることは決してない)。

[編集]

mmapmanpage の注意深い読者、特にMAP_NORESERVEの説明は、「十分な」システムでもスワップが必要になる別の理由に気づくでしょう。物理メモリ:

"スワップスペースが予約されていない場合、使用可能な物理メモリがないと、書き込み時にSIGSEGVを取得する可能性があります。"

-ちょっと待ってください、それはどういう意味ですか?

ファイルをマップすると、まるでファイルがプログラムのアドレス空間で魔法のように何らかの形であるかのように、ファイルの内容に直接アクセスできます。読み取り専用アクセスの場合、オペレーティングシステムには原則として物理メモリの1ページ以下が必要です。これは、異なる仮想ページにアクセスするたびに異なるデータで再生成できる(効率上の理由から、もちろん、何が行われるかではありませんが、原則として、1ページの物理メモリでテラバイト相当のデータにアクセスできます。 []ファイルマッピングに書き込む場合はどうでしょうか。この場合、オペレーティングシステムには、書き込まれるすべてのページの準備ができている物理ページまたはスワップスペースが必要です。ダーティページの書き戻しプロセスが処理を完了するまで(数秒かかる場合があります)、データを保持する方法は他にありません。このため、OSはスワップスペースを予約します(ただし、必ずしもコミットする必要はありません)。そのため、未使用の物理ページがない場合にマッピングに書き込んでいる場合(これはかなり可能であり、通常の状態です)、 re guaranteed引き続き機能します。

スワップがない場合はどうなりますか?これは、スワップを予​​約できないことを意味します(そうです!)。つまり、空き物理ページがなくなってページに書き込んでいると、プロセス受信の形にうれしい驚きが生じます。セグメンテーション違反、そしておそらく殺されています。

[/編集]

ただし、RAMの2倍のサイズのスワップを作成するという従来の推奨事項は無意味です。ディスク容量は安価ですが、それほど多くのスワップを割り当てることは意味がありません。安価なものを無駄にしても無駄です、そしてあなたは絶対に望まない数百メガバイト(またはそれ以上)のサイズのワーキングセットを絶えずスワップインおよびスワップアウトします。

単一の"correct"スワップサイズはありません(ユーザーと意見の数だけ「正しい」サイズがあります)。 RAM=サイズに関係なく、私は通常、固定の512MiBを割り当てます。これは私にとって非常にうまく機能します。512MiBはあなたができるものだという理由ですalways今日は余裕があります、小さなディスクでも、数ギガバイトのスワップを追加するのはあまり良いことではありません。何か深刻な問題が発生している場合を除いて、それらを使用することはありません。

SSDでも、スワップはRAM(バスの帯域幅とレイテンシのため))よりも桁違いに遅く、それが非常に許容可能で、何かを移動してスワップするおそらく再び必要になることはありません(つまり、再度スワップインすることはほとんどないため、利用可能なページのプールは事実上無料で拡大されます)。本当に必要スワップの量(つまり、50GiBデータセットなどを使用するアプリケーションがある場合)は、ほとんど失われます。

コンピューターがギガバイトに相当するページのスワップインとスワップアウトを開始すると、すべてがクロールされます。したがって、ほとんどの人(私を含む)にとってこれは選択肢ではなく、そのため、そのように多くのスワップがあることは意味がありません。

101
Damon

ここで述べたいくつかの意見には同意しません。特に本番環境では、まだSWAPパーティションを作成しています。自宅のマシンとVMにも同じように使用しています。

最近では、メモリのサイズを約1〜1.5倍にしています。経験則では、2倍のメモリが使用されていました。スワップディスクは、バックアップまたは保護する必要がないという点で「安価」です。

メモリが不足した場合、スワップスペースにより、問題に対処するための時間と余裕が少し得られます。

/ tmpのようなものがスワップ空間に常駐できることを理解してください。

スワップ領域は部分的なカーネルダンプを保持できるため、次回の再起動時に復元できます。これは、あなたがするように呼ばれる将来のデバッグの緊急事態にとっては素晴らしいかもしれません。

50
mdpc

たぶん:

私はこのトピックについて多くのことを考えましたが、私が数えることができるよりも多くの回数、議論の両側に意見が出てきました。私のアプローチは、調べる方法を開発することでした。

十分なサイズであると思われるアクティブなスワップパーティションから始めます。

次に、ワークスペースでターミナルを開き、コマンドfree -hs 1を発行します。これにより、使用状況が毎秒報告されます。

必要に応じて、他のワークスペースに切り替えます。

あなたがする可能性が高いすべてのことを行ってから、さらにいくつかを行います。すべての一般的なアプリを一度に実行し、複数のタブを参照して、システムに実際のワークアウトを必死に試します。これは、コンパイル操作を実行し、電子メールまたはその他を確認しながら、1/2ダースのビデオを再エンコードすることを意味します。事実に直面しましょう。これは、あなたがシステムをどのように使用するかについてのすべてです。

システムに高い負荷がかかっていると感じたとき(または、システムに負荷がかかる可能性があり、その後、負荷が高くなる可能性があるとき)、ターミナルを見て、結果を調べます。または、コマンドに>output.txtを追加して出力をファイルにリダイレクトし、完全な実行を確認できるようにします。 使用したスワップがMem freeを超えない場合、スワップは必要ありません。もしそうなら、あなたはそうします。 free.png

スワップは必要ありません。多分あなたはそうします。調べてみませんか?

サイズ変更のスワップに関する限り、これは使用に基づく質問であるため、経験則は通常、過大評価されています。

23
Elder Geek

注:これは、特定の異常な状況で発生しました。問題のトラブルシューティングを行う場合、これが役立つことがあります。私は、すべてのマシンがスワップしなければならないという意味ではありません。

多分!

Linuxを実行して構築した「アプライアンス」で過去に問題に遭遇しました-コンパクトフラッシュデバイスで実行していて、スワップを使用してCFを使いたくなく、アプリケーションに十分なメモリがありました。

これらのアプライアンスのほとんどは正常に動作しましたが、特に忙しいボックスで、私は問題に遭遇しました:

メモリの断片化

スワップスペースがないと、メモリは次第に断片化し、特に長時間実行されているプロセスでは(多くの空きメモリがあったとしても、すべて非常に小さなビットでした)。スワップスペースを入れて、必要がない限り使用しないようにLinuxに指示しました。これで問題は完全に解決しました。

他のすべてに加えて、スワップスペースを使用すると、メモリを移動して断片化を解消できます。断片化されたメモリがあり、単一の大きなチャンクが必要な場合、フラグメントはスワップアウトされます。スワップインされると、効果的にデフラグされます。

/ proc/buddyinfoをチェックしてください-私は今このように見えます:

Node 0, zone      DMA      9      5      3      4      2      3      2      2      3      3      1 
Node 0, zone    DMA32  33901   1149      0      0      0      0      0      0      0      0      1 
Node 0, zone   Normal   2414   1632    259     22      3      0      2      0      1      1      0 

数字は異なるサイズのブロックを表しています。各サイズは、左側の4MBブロックから右側の4KBまでの次のブロックの半分のサイズです(つまり、4MB、2MB、1MBなど)。新しく起動したマシンでは、左側にすべてのブロックがあり、右側にはほとんどありません(=断片化されていません)。同じ量のメモリ(4mbなど)が列全体で異なる数として表されることにも注意してください-左端の列に1ブロック、右端の列に1024です。

メモリは、できるだけ適切なプールから割り当てられます。例えばプログラムが(一度に)12kbのメモリを必要とする場合、16kb列からそれを取得します。残りは4kb列に表示されます。 16kbブロックがない場合は、32kbブロックから取得され、16kbと4kbが残ります。

十分な大きさのメモリブロックがなく、スワップスペースがある場合は、 16kbのメモリが必要な場合は、16kbの最も使用されていないブロック(たとえば、4kbの使用済みブロック、4kbの使用可能なブロック、さらに2つの使用済み4kbブロックが含まれている可能性があります)を見つけ、USED部分をスワップのみに移動します。解放されたメモリを新しいアプリケーションに割り当てます。

クラッシュしたボックスには、何十万もの4kbおよび8kbブロックがあり、それ以外はあまりありませんでした。

(クラッシュしたマシンのせいで!)カーネルがメモリからスワップ、メモリからスワップに移動しても、メモリからメモリに移動することはありません。

18
AMADANON Inc.

スワップパーティションには、実行時に余分なRAMとして機能するだけでなく、それ以上の重要な価値があります。

1つは、Linuxは可能な限り多くのメモリを使用してファイルとIO操作をキャッシュするためです。スワップがある場合、より多くのメモリがキャッシュに入ることがわかりますIO一部のプログラムが割り当てたデータを保持するのではなく(ディスクアクセスを最小限に抑え、SSDの摩耗を減らすことで)高速化しますが、一部のデーモンでは、12時間に1回しか使用しません。

さらに、Linuxはオプティミスティックなメモリ割り当て戦略を使用しています。これにより、ページを埋めるための実際のメモリがあるかどうかわからない場合でも、ページを名目上割り当てることができます。これは、適切なチェックを実行してすべての割り当てをマップするよりも効率的で、通常は問題を引き起こしません。ただし、カーネルが割り当てを許可するかどうかを判断するために使用するヒューリスティックには、システムで使用可能なスワップのレベルが含まれるため、システムが十分に使用されていなくても、システムに十分なスワップがある場合は、割り当てが高速になる場合があります。

これらの要因により、ほとんどすべての通常のシステムでスワップを行う方が良いと個人的に信じていますが、大きなRAMサイズの場合、RAM * 2ルールを無視して、スワップを4-8GBに制限します(ディスクのサイズによって異なります) )。

15
Vality

カーネルがスワップイン/スワップアウトするのを待つのに耐えられる最大サイズよりも大きなスワップは決してすべきではありません。それ以外の場合は、システムの新しい障害モードを作成しているだけです(スワッピングで回復不能な動きがなくなる)。最近のドライブはGB /秒のオーダーで転送できますが、Linuxは通常、1秒あたり数百kB、またはせいぜい数MBのラインに沿った速度でのみスワップを移動できます。そのため、巨大なスワップにより、システムが数分、数時間、さらには数日間使用できなくなる可能性があります。

実行していることに対して十分な物理メモリがある場合、スワップの理想的なサイズは、プロセスが維持しているが使用していない「ジャンクデータ」の量とそれを一致させることです。これはおそらく数メガバイトから数百メガバイトの範囲です。この戦略により、すべての物理メモリを、二度と使用されない可能性のあるデータの永続的なストアとしてではなく、有用な情報をキャッシュするために利用できます。

十分な物理メモリがない場合は、大量のスワッピングによる深刻なスローダウンを許容できるかどうかを評価する必要があります。その場合は、最大1〜2 GBのスワップ可能性がありますが理にかなっており、非常に高速なドライブを使用している場合は、おそらく最大4 GBです。ただし、それ以上の場合はシステムの障害モードが悪化するだけなので、代わりにRAMを購入することを検討してください。

スワップにハイバネートできるようにする場合のみ(この機能は「ディスクへのサスペンド」とも呼ばれ、RAMの内容全体を保存して電源をオフにすることを含みます)。通常、これはラップトップやその他のモバイルデバイスで使用されるため、状況によって異なります。

11
hanetzer

実行しようとしているタスクに依存するため、普遍的で明確な答えはありません。 DB、HTTP、仮想化、またはキャッシュサーバーを実行する場合は、RAMの量に関係なく、いかなる種類のスワップも有効にしないでください。デスクトップまたは混合タスクのホストがあり、16 GB以上の高速メモリがある場合RAM-こちらをご覧ください: zRam

6
Alexey Vesnin

インストールされているRAMの量)だけがわかっている場合、スワップ領域が必要かどうかを判断する方法はありません。

いずれの場合も、スワップスペースがあるとシステムのパフォーマンスに悪影響を与えるという一般的な誤解があります。これは誤りです。十分なRAMがある限り、サイズに関係なくスワップ領域があってもパフォーマンスはまったく損なわれません。パフォーマンスに影響するのは、RAMで不足しており、スワップスペースを効果的に使用していることです。

  • ケース1:スワップスペースがなく、RAMが不足している場合、Linuxカーネルは、候補として適切であると思われる1つ以上のプロセスを選択して強制終了します。

  • ケース2:スワップスペースがあり、RAMが不足している場合、カーネルは使用されていないメモリページを選択し、スワップ領域に配置してRAMを解放します。これによりシステムの速度が低下しますが、アプリケーションは影響を受けません。

カーネルが私のアプリケーションを殺す価値があると思っているので、私は常にケース2を好んでいます。さらに、平均的なディスクの現在のサイズがTB=の範囲内にあるため、スワップ用に数パーセントを予約することは問題になりません。

5
jlliagre

どんなシステムでもスワップを適用する私のルールは、これに対する答えを持つことです:

  • システムの目的は何ですか?
  • アプリケーションはどのくらいのメモリを消費しますか?
  • これは重要なシステムですか?
  • ファイル転送のために一時的なディスク領域が必要ですか?
  • アプリケーションの予測成長率?

この情報に対する回答が得られたら、それに応じてシステムのサイズを決定します。過去数年間、私はSun Microsystemからの経験則を行っていました。最大16 GB 2倍RAM、16 GBから同じ量。ただし、十分なRAMアプリでSWAPを強制的に使用しない場合は、スワップを省略できます。必要な場合は、新しいディスクを挿入するか、LUNを構成してSWAPを構成するだけです。Sunのルールが適用されたのは、Solarisでは「カーネルパニック」が発生したためです。メモリは完全にダンプされ、さらに分析するためにスワップされます。

3
BitsOfNix

短い答え:

はい、あなたは常にsome swapを必要とします。アプリケーションがメモリをマッピングすることすらしなくても、仮想メモリを直接マッピングするというまれなケースです。

スワップファイルを次のように設定します。

  • RAM+round(sqrt(RAM))休止状態を使用する場合
  • round(sqrt(RAM))しない場合

デスクトップでswappinessを10に設定しますただしサーバーではありません!

長い答え:

過去には:

過去25年間に使用されている経験則は最小1xRAM、最大2xRAMでしたので、これは常に引用されるものです。

その最小値は石器時代に戻った 私がティーンエイジャーで恐竜がまだ地球を歩き回っていたとき RAMは高すぎるため、あなたは何かを実行できるように、そのスワップ領域が絶対に必要でした。

最大値は当時のリターンの低下のために設定されました。HDDアクセスはRAMの1000分の1の速度であるため、大量のメモリをスワップする必要があるのは遅すぎるだけです。緊急時には有効ですが、毎日の使用にはあまり適していません。当時、スワップスペースが足りなくなったときは、RAMを追加するときがきました。 (これは今日でも当てはまります)。

現在:

  1. 休止状態を使用せず、メモリが1GByteを超える場合、新しい経験則はround(sqrt(RAM))です。ここで、RAMは、明らかにGB単位のサイズRAMサイズ)です。およびsqrt平方根:-)

  2. 休止状態を使用する場合は、RAMの全量+既にスワップされているRAM=ディスクにスワップできる必要があるため、式は次のようになります。RAM+round(sqrt(RAM))

  3. 収益を減少させるルールは今日でも最大に保たれますが、実際の使用量をテストしない限り、2xRAMを使用することはディスク領域の無駄遣いですなので、最大値を使用しないでください他の方法を使用してスワップ領域を使い果たす

これらすべてをまとめると、次の表が得られます:(スワップスペースを示す最後の3列)

    RAM   No hibernation    With Hibernation    Maximum
    1GB              1GB                 2GB        2GB
    2GB              1GB                 3GB        4GB
    3GB              2GB                 5GB        6GB
    4GB              2GB                 6GB        8GB
    5GB              2GB                 7GB       10GB
    6GB              2GB                 8GB       12GB
    8GB              3GB                11GB       16GB
   12GB              3GB                15GB       24GB
   16GB              4GB                20GB       32GB
   24GB              5GB                29GB       48GB
   32GB              6GB                38GB       64GB
   64GB              8GB                72GB      128GB
  128GB             11GB               139GB      256GB
  256GB             16GB               272GB      512GB
  512GB             23GB               535GB        1TB
    1TB             32GB              1056GB        2TB
    2TB             46GB              2094GB        4TB
    4TB             64GB              4160GB        8TB
    8TB             91GB              8283GB       16TB

上記はちょうど経験則です]それは重力の法則ではありません!
あなたcan特定のユースケースが異なる場合、(重力の法則とは異なり)このルールに違反します!

プロのヒント:ヘッドはディスクの内側で移動する必要が少ないため、常にHDDの先頭にSWAPを割り当てます。
はい: SSDでは、ヘッドを移動する代わりに量子トンネリングを使用し、最新のSSDがすべてのメモリセル(未割り当て領域を含む)を使用するため、スワップ領域をどこに配置しても問題はありません。 )量子劣化を防ぐため。

スワップの使用が「一般的な」ルールと異なるかどうかをテストする方法:

ただ実行する:

for szFile in /proc/*/status ; do 
  awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' $szFile 
done | sort --key 2 --numeric --reverse | more

これにより、スワップアウトされた実行中のすべてのプログラムのリストが表示されます(一番上のスワップ領域を最も多く使用しているプログラム)

数KB以上を使用している場合:最小値よりも大きいサイズに変更します。それ以外の場合は、気にしないでください...

サーバーを使用している場合は、今すぐ読み進めないでください。これで準備は完了です。


デスクトップ/ラップトップクライアント(サーバーではない)を使用している場合は、GUIの応答性をできるだけ高くし、本当に必要なときにのみスワップするにする必要があります。 Ubuntuはサーバーで使用するために早期にスワップするように最適化されていますしかし、クライアントでgimpにある巨大な250メガピクセルの生の画像を高速に編集したいなので、swappiness to 10を指定すると、スワップが早すぎないようにし、スワップが遅すぎないようにします。

sysctl.confファイル、

Sudo nano /etc/sysctl.conf

OR

sysctl.dディレクトリがありませんがsysctl.confファイル、新しいファイルを作成:

Sudo nano /etc/sysctl.d/35_swap.conf 

どちらの場合も追加:

# change "swappiness" from default 60 to 10 
# (theoretically only swap when RAM usage reaches around 80 or 90 percent)
vm.swappiness = 10

ファイルの最後に、ファイルを保存します(Ctrl+XY+Enter nanoの場合)、次を実行します:

sysctl --system

パラメータをリロードするか、Window $アプローチを使用して再起動するには...:-)

1
Fabby

スワップは必要十分なRAMがない場合すべてのプログラムを実行します。

大量のRAMを必要とすることは何もしていないと言います。したがって、十分なRAMがあります。

次に、あなたはneedスワップ領域を使用しません。

しかし、あなたが質問に示唆していることにかかわらず、ある時点であなたのプログラムはあなたのRAM =(経験則)、他の「交換前」の回答を読んでください必要交換しませんが、[強化システムのパフォーマンスは向上します。

1
Totor