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


91

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

これは、少量のRAMが搭載されたマシンを使用していて、不足しても問題が発生したくない場合に最適です。ただし、システムに16 GBまたは32 GBのRAMがあり、StackExchange用のMySQLデータベースを実行していない、またはLinuxで1080pのフルレングスムービーを編集していない場合、スワップパーティションを使用する必要がありますか?


16
@mikeservご存知のように、これらの2つの文字をコメディ効果のためだけの回答として受け入れたいと思います。
-IQAndreas

3
@Janis-費用がかかります。また、サウンドメモリ管理を実装すれば、1GBのマシンでもスワップなしで簡単に実行できます。スワップはパフォーマンスを犠牲にします-持っている場合、カーネルは必然的にそれを使用します。したがって、スワップパーティションを作成する1TBまたは任意のサイズのディスクでは、メモリページをRAMに保持したり完全に削除したりするのではなく、ディスクにメモリページを配置するようにカーネルに勧めます。16GBの場合、一般的なユーザーはそれをすべて使用することはありません。3GBの/tmp稼働時間の後 2GBのRAMを使用し、10GBをキャッシュします(急流をdl'dしたため
-mikeserv

5
@mikeserv、あなたは間違っているのではないかと心配しています。表示されるディスクメトリックを常に監視しています。空きメモリがある限り、スワップは使用されておらず、メモリがいっぱいになったときにのみスワップが開始されます。コンピューターの使用方法に依存すると思います。毎晩シャットダウンされるデスクトップシステムでは、メモリの問題が発生することはめったにありませんでしたが、私のシステムには数か月の稼働時間がありました。はい、スワップはパフォーマンスを犠牲にしますが、RAMスペースが残っていない場合、システムは引き続き動作します。選択肢は何ですか?おそらく、メモリ管理の議論について詳しく説明することができます。Linuxシステムを事前構成されたとおりに使用します。
ジャニス

40
@mikeserv 15文字より短いコメントをどのように投稿しましたか?
イミビス

11
12ある@immibis ゼロ幅のスペースがそこに
デイブ

回答:


98

はい。

あなたは、ほとんど間違いなく必要があり、常にスワップは非常に説得力のある、禁止の理由(のような、いないディスクでは、すべての、または唯一のネットワークディスクの存在)がある場合を除き、有効になっています。頻繁に推奨されるとんでもないサイズ(RAMの2倍など)の順序でスワップする必要がありますか?まあ、いいえ

その理由は、スワップは、アプリケーションが物理RAMよりも多くのメモリを消費する場合に役立つだけではないということです(実際、その場合、スワップはパフォーマンスに深刻な影響を与えるため、まったく役に立ちません)。最近のスワップの主な動機は、16GiBのRAMを魔法のように32 GiBに変えるのではなく、インストールされた利用可能なRAMをより効率的に使用することです。

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

オペレーティングシステムに新しいメモリページを要求するたびに、メモリマネージャは知識に基づいた決定を下す必要があります。

  1. バッファキャッシュからページを削除する
  2. マッピングからページを削除します(ほとんどのシステムで実質的に#1と同じです)
  3. 長時間アクセスされていない(できれば決して)ページをスワップに移動します(これは実際には、最後の瞬間ではなく、積極的に行われることもあります)
  4. プロセスを強制終了するか、ランダムプロセスを強制終了します(OOM)
  5. カーネルパニック

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

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

オプション#3を削除することにより、オペレーティングシステムを実質的に#1または#2のいずれかに制限しました。ディスクからページをリロードすることは、スワップからリロードすることと同じですが、通常はスワップからリロードする必要が少なくなります(適切なページング決定を行うため)。

つまり、スワップを無効にしても何も得られませんが、メモリリクエストを処理する際のオペレーティングシステムの有用なオプションの数は制限されます。それはそうではないかもしれませんが、非常に恐らく不利な可能性があります(そして、決して有利になることはありません)。

[編集]

mmap マンページ、特にの説明を注意深く読むとMAP_NORESERVE「十分な」物理メモリを備えたシステム上でもスワップが必要な別の理由がわかります。

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

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

ファイルをマップする場合、ファイルの内容に、プログラムのアドレス空間で何らかの方法で魔法のように直接アクセスできます。読み取り専用アクセスの場合、オペレーティングシステムは原則として、異なる仮想ページにアクセスするたびに異なるデータを再配置できる物理メモリの1ページのみを必要とます(効率上の理由から、もちろんそれは行われませんが、原則として、物理メモリの1ページでテラバイト相当のデータにアクセスできます)。さて、もしあなたファイルマッピングに書き込みますか?この場合、オペレーティングシステムには、書き込みページごとに物理ページ(またはスワップスペース)が用意されている必要があります。ダーティページライトバックプロセスが処理を完了するまで(数秒かかる場合があります)、データを保持する他の方法はありません。このため、OSはスワップスペースを予約します(必ずしもコミットする必要はありません)。したがって、未使用の物理ページが存在しないときにマッピングに書き込みを行う場合(これは非常に可能性の高い通常の状態)、再保証それはまだ動作すること。

スワップがない場合はどうなりますか?これはスワップを予​​約できないことを意味します(duh!)。これは、空き物理ページがなくなり、ページに書き込みを行うとすぐに、プロセスを受け取るという形で嬉しい驚きが得られることを意味します。セグメンテーションフォールト、おそらく殺されている。

[/編集]

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

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

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

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


7
完全に真実ではありません:特に仕様に合わせてOOMを構成している場合は、ディスクを使用しないことがカーネルにとって有利になる可能性があります。OOMキラーがクリーンアップを処理するように構成されている場合は、ディスクスペースを浪費してマシンの速度を落とすのではなく、クリーンアップを行うことが有利です。
mikeserv

22
8 GBのRAMと8 GBのスワップ、および16 GBのRAMとスワップなしの違いは何ですか?コンピュータが16.001 GBのメモリを必要とすると判断した場合、同じように物事のパージ/キルを開始しませんか(ただし、パフォーマンスは発生する前にクレーターになります)。
ニックT

5
@NickT:スワップは、RAMを増やすためではなく、何かがすぐに殺されることになる赤い旗ではありません。私は、目の前でプロセスが「ランダムに」消えるのではなく、殺す前に赤い旗を立てるのが好きです。
Mooingダック

10
-1この答えは意味がありません。なぜメモリが遅い(スワップ)の方が同量の高速なメモリ(RAM)よりもパフォーマンスが良いのでしょうか?ある時点で十分なRAMを認識しなければならないことを意味するため、スワップは不要です
。.-Mehrdad

14
@Mehrdad:確かに理にかなっています。低速のメモリ(スワップ)は、アクセスがほとんどまたはまったくないものに対して「低速」が重要でない限り、パフォーマンスを向上させます。スワップは、「コールド」データを移動することにより、「ホット」データに使用可能なメモリ量を効果的に増やします。1時間に1回だけ実行するデーモン、またはデフォルトでロードされているが使用されていないカーネルモジュールによって割り当てられたメモリは、その例です。それらを交換するか、キャッシュからページをドロップすることができます。どちらの方がよいですか?
デイモン

50

ここで述べられている意見のいくつかに反対します。特に実稼働環境では、私はまだSWAPパーティションを作成しています。自宅のマシンとVMでも同様です。

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

メモリが不足している場合は、スワップスペースを使用して、問題に対処するための少しの時間とクッションを与えます。

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

スワップ領域は部分的なカーネルダンプを保持できるため、次回の再起動時に復元できます。これは、今後のデバッグの緊急事態に役立つ場合があります。


16
+1。スワップがあるということは、メモリ不足でのパフォーマンスの低下とハードクラッシュの違いを意味します。
-Davidmh

6
@mikeservは、設定方法に関係なく、プログラムが使用可能なメモリよりも多くのメモリを割り当てようとした場合、何かがクラッシュするか、OSがそれらを強制終了します。
-Davidmh

6
@Davidmh:その理由から、スワップファイルは無限に大きくなければなりません。さもないと、プログラムはスワップファイルを使い果たしたときにクラッシュします。
Mehrdad

6
@Mehrdadしかしそれはまたより高価です。X GBのRAMがあることを考えると、余裕があるため、XのRAMとYのスワップを持つよりも、Yの妥当な値(使用量とサイズによって異なります)あなたのHD)。
-Davidmh

9
「スワップスペースは、問題に対処するための少しの時間とクッションを提供します」-また、メモリリークが「解決」するまで、応答しないマシンの前にずっと長く座っている必要があることも意味します。
ラファエル

23

多分:

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

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

次に、ワークスペースでターミナルを開き、free -hs 11秒ごとに使用状況を報告するコマンドを発行します。

オプションで、他のワークスペースに切り替えます。

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

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

スワップは必要ありません。たぶんあなたがします。見つけてみませんか?

サイジングスワップに関する限り、経験則は、使用ベースの質問であるため、一般的に過大評価されています。


2
だから、あなたのシステムが絶対にそれを必要とするときだけスワップが使われると言っているのですか?どちらの場合でも、スワップを有効にするとペナルティはありますか?他のコメントは、スワップの存在でさえパフォーマンスに悪影響を与える可能性があることを示唆しているようですか?
MrWhite

3
@ w3dいいえ、私はそれを言っていません。上記の出力からわかるように、必要ではない場合でもスワップが使用されます。これは、swapinessファクターで多少調整できます。スワップの有無の必要性について話している。
オタク長老

スクリプトこれは上向きにいつでもスワップをインクリメントすることができswap超える行くのfree
JFA

@JFAこれはまだ見たことがありません。個人的には、この目的のために不確定な量のスワップ領域を予約するという概念に苦労しています。理論的にはすべてのものが可能です。興味深いのは実装フェーズです。
オタク長老

17

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

多分!

過去に、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が残ります。

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

クラッシュしたボックスには、数十万の4kbと8kbのブロックがありましたが、他にはあまりありませんでした。

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


3
あなたのケースはhugepagesの割り当て/実装に適したもののようです。断片化の問題を回避します(特定のサイズのhugepageは、いったん割り当てられると、今後、そのサイズでのみ永久に再び割り当てられるため)
mikeserv

2
これが私が今まで読んだ中でスワップパーティションを使用することを支持した最高の理由です。私はクイック検索を試みましたが、それについての参照は見つかりませんでした。なぜこの機能がこれほど頻繁に文書化されないのでしょうか。
SE 마するために、

1
(非透明)hugepagesはアプリで使用できない場合があります。通常、大量のメモリを必要とするアプリはそれらを使用できます。たとえば、データベースサーバー、java jvm。これらは明示的に有効にする必要があり、他の目的に使用できない個別のメモリプールになります。これは、状況に応じて、良い場合も悪い場合もあります。また、透過的なhugepagesについても学びます。これらは、アプリが方法を知らなくても、(パフォーマンス向上のために)hugepagesを使用するように物事を移動しようとします。メモリが断片化されている場合、hugepage sweeperにはもっとやることがあるので、物事は南に行くことができます。
ダンプリッツ

1
あなたのフラッシュアプ​​ライアンスでの経験を疑うことはありません。あなたが提示した単一のユースケースはおそらくスワップが必要だと確信しているわけではありません。簡単にテストし、証明または反証できる興味深い質問が発生します。
オタク長老

1
フォローアップの質問。「メモリの断片化」とはどういう意味ですか?MMUは、一部の仮想アドレス空間で連続したページに使用される物理ページが連続しているかどうかを気にしません。物理ページは断片化されていますが、これは重要ではありません(単一クラスター物理マシン上の通常のアプリケーションメモリであり、周辺機器やハイパーバイザーが使用するメモリページなどではない限り)。プログラムが16kBを要求すると、4ページを取得します。これは、物理メモリ内のどこか近くにある場合とない場合があります。
ジル

15

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

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

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

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


9
4GBでもデスクトップには大きすぎます。何か問題が発生した場合に、その分のスワップがいっぱいになるのを待つ前に、OOMキラーをアクティブにしたいのです。(私がもっと必要な場合に遭遇した場合、私のマシンのRAMよりも多くの仮想メモリを必要とする巨大なジョブを実行する前に、スワップファイルをddおよびmkswapできました。つまり、Webブラウザを終了しても十分に解放されません...)
ピーターコーデス

@PeterCordesそれはおそらくあなたがどんな種類の仕事をしているかに依存していると私は完全に理解しています。個人的には、マシンの使用中にバックグラウンドで低優先度で長いコンパイルを行うことが多いため、高レベルのスワップの恩恵を受けることがわかります。とにかく)。それでも、私はそれが非常に個人的な作業負荷に基づいたものであることに同意します。決定する前に、常に自分の使用法について考える必要があります。
バリティ

1
面白い話:今日、4GBのRAM、0.5Gスワップ(SSD)を搭載したラップトップで、firefoxがOOMキラー(firefoxを選択)をトリガーしました。私は以前にそれを起こさなかった。(通常よりもラップトップを使用していましたが)。他にはほとんど何も実行されていません(xfceのgnome-terminalのみ)。だから私はそれでいいと思う、なぜならFirefoxはそんなに多くのRAMを結びつけるよりもよく知っているべきだから。しばらく前に、「仮想メモリサブシステムのストレステストを行うためのWebブラウザが存在する」などの発言がありました。Firefoxは、何日も使用されていないタブなどのキャッシュを解放するのがかなり苦手です。
Peter Cordes

3
Linuxが利用可能なスワップスペースを考慮する1つのケースは、大きなプロセスが子を起動しようとするときです:fork()+ exec()システムコールは、親の割り当てを大まかに複製することから始まります-カーネルは、新しい子が小さくなることを保証できません親より。通常、スワップ領域は使用されませんが、使用可能でない限りfork()は失敗する可能性があります。クライアントでの典型的な例は、プラグインを起動するブラウザー、または大きなアプリケーションコンテナーがヘルパープログラムを呼び出すときのサーバーです。通常、問題を解決するには、1/2または1GiBのスワップで十分です。Google「java execはメモリを割り当てることができません」
ジェームズ

13

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

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

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


2
これが最良の答えだと思います。スワップ領域が多すぎると、すべてのスワップのためにマシンが完全に応答しなくなる可能性があります。つまり、問題のプロセスを強制終了することはできません。スワップスペースを減らすと、OOMキラーが自動的に作業を行います。ファイルバッファキャッシングに関する他の回答の引数はまったく納得できません。カーネルがファイルバッファをスワップに移動できるようにスワップが必要です...ディスク上にありますか?お願いします。
Timmmm

私が見つけることができるスワップ空間に対する唯一の議論はこれです:「いくつかのプログラムはメモリをリークします」。そして?OOMキラーが保存しなかった重要なものを殺すと、効果的に作業を失います。つまり、この引数は完全に無関係になり、大量のメモリを使用し、頻繁にスワップアウトされる低優先度タスクの高いスワップスペースを確保しながら、マシンを強制的にシャットダウンしてまったく同じ効果を得ることができます。マシンがそのような状態でスタックした場合、それはあなた自身の責任です。私に起こったのは、作業メモリ全体を埋めるためのプログラムを自分で書いたときだけでした。
サハサエ

11

休止状態でスワップできるようにする場合のみ(この機能は「ディスクへのサスペンド」とも呼ばれ、RAMの内容全体を保存し、電源をオフにします)。通常、これはラップトップおよび他のモバイルデバイスでのみ使用されるため、依存します。


6

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


zRamは素晴らしい選択です。私はそれを小さなフラッシュドライブシステムと組み合わせて使用​​し、効果を上げました。
オタク長老

1
@ElderGeekネットワークブートなどのディスクレス環境でも使用しました。すばらしい仕事ですが、いくつかの注意事項があります。最初に、RAMだけでなく高速なRAMが必要です。低速で安価なramモジュールは、おそらく通常の古典的な場合に適していますが、問題を引き起こす可能性があります。CPUのフロントサイドバスも考慮する必要があります。CPU周波数を遅くすることはできても、FSB周波数を速くするとパフォーマンスが大幅に向上する場合でも。2番目の懸念は、zRamスワップパーティションの数です。1からCPUコア数までの数字を試してください。シングルコアシステムでは使用しないでください!
アレクセイ・ヴェズニン

有効なすべてのポイント。私はパフォーマンスオタクであり、常に独自のシステムを設計および構築しているので、個人的にそのような懸念
オタク長老

@ElderGeek私も:)はじめまして!また、zRamの動作に奇妙なことが1つあります。さまざまなカーネルバージョンおよび構成で表示および非表示になりますが、カーネルHZ 100および1000で非常に再現可能です。zRamは1,2,4で正常に動作しますが、それ以上のパーティションでは動作しません。ほぼアイドル状態のタスクのトップハードウェア上の8および16の物理コアでも。そのため、微調整をして遊んでください。ロシアからのご挨拶!
アレクセイ・ヴェズニン

「dbを実行する場合は、RAMマウントに関係なく、いかなる種類のスワップも有効にしないでください」には同意しません。通常、スワップは、ランダムプロセスを強制終了するOOMキラーよりも望ましい方法です。はい、実行中のアプリケーションに十分なメモリが必要です。はい、大量のスワップを使用するとシステムが遅くなる可能性があります。理想の世界に住んでいるのがうらやましい。
アマダノン株式会社

5

スワップ領域が必要かどうかを知る方法はありません。知っている唯一のパラメータがインストールされているRAMの量である場合です。

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

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

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

カーネルは私のアプリケーションは殺す価値があると考えているため、作業の一部またはすべてを紛らわしく感じているため、常にケース2を好みます。さらに、平均ディスクの現在のサイズがTBの範囲にあるため、スワップのために数パーセントを予約することは問題になりません。


6
RAMが不足するのは暴走プログラムを持っているときだけなので、ケース1の方が好きです。OOMキラーは一般に暴走を識別するのに非常に優れており、数時間の激しいスワッピングの後ではなく、すぐに殺したいのです。
マーク

1
@Mark、それは有効なポイントです。私はまだ、最初にアルゴリズムにアルゴリズムを委任することを避けようとしていますが、後で考えます。
jlliagre

2
ケース2は、この状況について警告する何かがあり、システムがスワップを使い果たす前に手動で「何かをする」十分な時間がある場合にのみ有効です。ただし、同じ結果を得るために、代わりに使用済みRAMの割合を監視できます。
トーター

1
推論に基づいて、RAM使用量を監視するだけで十分です。
トーター

1
@Totorたくさんのファイルを処理してRAMを使い果たすバッチを起動したため、ラップトップの監視アプリで夜中に目覚めたくない。全体を中断するよりもRAMが小さくなっているために数時間かかるとしても、私は仕事をするのが好きです。
jlliagre

3

任意のシステムにスワップを適用するための私のルールは、これに対する答えを持つことです。

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

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


1

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

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

次に、スワップ領域は必要ありません。

しかし、あなたがあなたの質問に暗示するものにもかかわらず、ある時点であなたのプログラムはあなたのRAM(経験則)の半分(または3分の2)以上を言うと思うなら、他の「プロスワップ」を読んでください」と答えます。スワップは必要ありません、システムのパフォーマンスが向上する可能性があります。


スワップを使用すると、壊滅的なクラッシュを回避できますが、パフォーマンスが向上することはありません。パラシュートがフェラーリの速度を上げる以上です。;-)
オタク長老

@ElderGeekこれはエッジケースかもしれませんが、スワップが役立ちます。すべてに十分なRAMがある場合もありますが、RAMをより有効に使用するためにアイドルプログラムを交換することができます(たとえば、有用なディスクキャッシュ)。私は90年代後半にこれをよく見ました。これは、実際にはスワップスペースを必要とせずに、1 GB未満の空きRAM(ディスクキャッシュを含む)がある場合に表示されることがあります。
jbo5112

@ jbo5112あなたがそう言ったとしても、その可能性を完全に排除するつもりはありません。私の経験はこれまでのところそうではありませんでした。これは、システムがどのように使用されるかというケースが、ハードで高速なルール(誰もが求めているように見える)であるため、それほど驚くことではありません。
オタク長老

@ElderGeek私のディスクは10年前のものであり、キャッシュを必死に必要としているので、私は今それを見るだけかもしれません。通常、swappinessがほとんどの場合に非常に高く設定されるという追加の問題があり、これによりスワップスペースがあまりにも積極的に使用されます。60から10に値をドロップすることは、一般的な推奨事項のようです。さらに低くすることもできますが、ある時点で大量のディスクキャッシュをダンプし、スワップ中に余分なI / Oを大量に発生させます。
jbo5112

@ jbo5112良い点。それは常に異なるサブシステム間のバランスをとる行為です。Seagate ST225およびST238ドライブを備えた80286システムのパフォーマンスを最大にするために、ハードディスクインターリーブやRAMリフレッシュレートなどの調整を調整したことを思い出します。最大限のパフォーマンスと信頼性を引き出すために、常にケースバイケースでアプローチする必要があります。おめでとうございます!私が最後にドライブから10年を絞ることができたのは、総計600MBのマイクロポリスでした。
オタク長老

0

短い答え:

はい、アプリケーションがメモリのマッピングさえもせず、仮想メモリを直接マッピングするという、ありそうもないケースでは、常にスワップが必要です。

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

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

swappinessデスクトップではyour を10に設定しますが、サーバーでは設定しません!

長い答え:

過去には:

過去25年間に使用されていた経験則は、最小1xRAMと最大2xRAMであったため、常に引用されています。

私がティーンエイジャーであり、恐竜がまだ地球を歩き回っていたとき、そして RAMがあまりにも高価であり、あなたが何かを達成するためにそのスワップスペース絶対に必要だったのでその最小値は石器時代後退しました

最大値はその時の戻り値の減少のために設定されました:HDDアクセスはRAMよりも1000倍遅いので、あまりにも多くのメモリをスワップするのは遅すぎます:緊急時には良いですが、日常の使用にはあまり良くありません!当時、スワップ領域を使い果たしたときは、RAMを追加する必要がありました。(これは今日でも真実です)。

現在:

  1. 休止状態を使用せず、メモリが1Gバイトを超える場合、新しい経験則はround(sqrt(RAM))RAM明らかにRAMのサイズ(GB)です。

  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

上記は単なる経験則です。 重力の法則ではありません!特定のユースケースが異なる場合は、(重力の法則とは異なり)この規則破る
ことができます!

プロのヒント: ヘッドはディスクの内側を移動する必要が少ないため、常に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はサーバーで使用するために早めにスワップするように最適化されていますが、クライアントでは、その巨大な250メガピクセルの生の画像をgimp高速編集したいのでswappiness、10に設定すると、カーネルが早すぎるスワッピングを防ぎながら、 tスワップが遅すぎる:

sudo nano /etc/sysctl.conf

追加します:

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

ファイルの最後まで、ファイルを保存し(nanoではCtrl+ XY+ Enter)、次を実行します。

sysctl --system

パラメータを再読み込みするか、昔のことだけのために、Window $アプローチを使用して再起動します... :-)


-1

妥協の答え:それは「すべき」の意味に依存します。

説明した動作条件下でスワップパーティションがないと、悪いことが起きるという意味で、スワップパーティションが必要ですか?番号。

メモリブタの軍隊を誤ってスポーンした場合に備えて、スワップパーティションを用意するのが賢明です。OOMキラーが作動する前に、それらを殺すチャンスがありますか。はい。

物理RAMが、常に同時に実行するすべてのプログラムのデータメモリ使用量を「大幅に」超える場合、スワップを使用してもパフォーマンス上の利点はありません。「大幅に」ではないが超過した場合、OSがめったに使用されないメモリをスワップアウトして、より頻繁にアクセスされる-ファイルデータ-をメモリに保持できると、パフォーマンスが向上する可能性があります。

要約すると、16GBのRAMがあるのは素晴らしいことです。しかし、1TBのディスクもある場合、16GBをスワップ用に予約することはできませんか?ディスクのわずか1.5%です。

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