スワップ性を10〜20に減らすことをほとんどの人が推奨するのはなぜですか?


65

私はいくつかのサイトで、パフォーマンスを向上させるために交換可能性を10〜20に減らすことを推奨しています。

それは神話かどうか?これは一般的なルールですか?4GBのRAMと128GBのSSDを搭載したラップトップを持っていますが、私の交換にはどのような価値がありますか?

ありがとう。


5
リストしたサイトは、デフォルトの変更を推奨している理由を説明していません。複雑な問題に関するこのトリッキーな選択については、ここでの答えははるかに優れています。
nealmcb

回答:


88

ほとんどの人は、スワッピング=悪いと信じており、swappinessを減らさないと、本当に必要のないときにシステムがスワップするからです。どちらも本当ではありません。しかし、それは主にスワップだ-人々は、彼らのシステムが泥沼なっている時代にスワップ関連付けるためのシステムが逆ではない、動きが取れなくなっています。システムがスワップするときは、スワップの決定にパフォーマンスコストを既に考慮しており、そうしないとシステムのパフォーマンスまたは安定性に大きなペナルティが生じると判断しました。

全体的にデフォルト設定により、全体的なパフォーマンスと安定性が良好になります。デフォルトのままにしておくことをお勧めします。Linuxのメモリ管理を改善していくつかのエッジケースを解決する手段はさらにありますが、概して、swapinessコントロールは良い回避策ではありません。一方向に調整すると、1つの問題を修正し、他の問題を作成できます。可能な場合は、物理RAMを増設するだけで(スワップ性はそのままにして)、他のすべての救済策を覆します。

LinuxがRAMを使用する方法

アプリケーションで使用されていないRAMは、「キャッシュ」として使用できます。キャッシュは、高速でスムーズに実行されるシステムにとって重要であり、ディスクへの読み取りと書き込みの両方を高速化します。

アプリケーションのメモリ使用量がほぼすべてのRAMを使用するまで増加すると、キャッシュが縮小し、結果としてディスク操作が平均的に遅くなります。最近のキャッシュでは、数十メガバイト以下で十分ではありません。

スワップスペースがないと仮定して、アプリケーションのメモリ使用量がさらに増加すると、キャッシュ用のスペースがなくなるだけでなく、最終的にメモリが不足し、システムは実行中のプロセスを強制終了する必要があります。プロセスを強制終了すると、システムが不安定で予測不能になるため、速度低下よりも悪化します。

Linuxでのスワップの使用方法

これらの問題の両方に対処するために、システムは、めったに使用されないアプリケーションメモリをディスク上のスワップ領域に再割り当てして、RAMを解放できます。RAMを追加すると、メモリ不足によるプロセスの停止を防ぐことができます。また、ディスク操作をよりスムーズに実行できるように、少量のキャッシュを再利用できます。

ただし、この再割り当ては、明確なカットオフに従っては行われません。Linuxがスワッピングを開始するまで、割り当ての特定の割合に到達しません。「ファジー」アルゴリズムがあります。それは多くのことを考慮に入れていますが、これは「メモリ割り当てにどれほどのプレッシャーがあるか」で最もよく説明できます。新しいメモリを割り当てるための「プレッシャー」がたくさんある場合、より多くのスペースを確保するためにスワップされる可能性が高くなります。「プレッシャー」が少ない場合、これらの可能性は減少します。

システムには「スワップ」設定があり、この「圧力」の計算方法を微調整できます。多くの場合、「RAMの割合」として誤って表されますが、そうではなく、単に式の一部として使用される値です。40から60前後の値が推奨される正気値で、現在は60がデフォルトです。

大量のRAMが搭載されている場合でも、システムを必要なときにスワップさせることは、全体的に非常に良いことです。必要に応じてシステムを交換すると、一時的にでも(多くのメモリを使用する短いプロセスを実行中に)低メモリ状態に陥った場合に、システムがすべてを実行し続けるチャンスを得ることができます。スワップを完全に無効にする場合、メモリを割り当てられないためにプロセスが強制終了される危険があります。

システムが行き詰まり、頻繁に交換されるとどうなりますか?

スワップは低速でコストのかかる操作なので、システムはキャッシュパフォーマンスのトレードオフが全体を補うと計算しない限り、またはプロセスの強制終了を回避する必要がある場合は回避します。

多くの場合、人々はディスクをひどくスラッシングしているシステムを見て、多くのスワップスペースを使用し、それを交換することを非難します。それは取るべき間違ったアプローチです。スワッピングがこの極端に達する場合、スワッピングはシステムがメモリ不足の問題に対処しようとするものであり、問​​題の原因ではなく、実行中のプロセスをスワップしないとランダムに停止することを意味します。

デスクトップシステムはどうですか?彼らは別のアプローチを必要としませんか?

実際、デスクトップシステムのユーザーは、アプリケーションを開くなど、ユーザーが開始したアクションに応答してシステムが「応答性を感じる」ことを期待しています。

一部の人々がこれを微調整しようとする1つの方法は、swappinessパラメータを減らすことです。これにより、メモリを使用し、キャッシュスペースが不足しているアプリケーションに対するシステムの許容範囲が増加します。

ただし、これはゴールポストを変えるだけです。最初のアプリケーションはスワップ操作なしでロードできるようになりましたが、ロードする次のアプリケーションのスラックが少なくなります。代わりにアプリケーションを次に開くときに、同じスワッピングが後で発生する場合があります。それまでの間、システムのパフォーマンスは、キャッシュサイズの削減により全体的に低下します。そのため、swapiness設定を減らすことによる利点は測定が難しく、一部の時点でスワッピングの遅延は減少しますが、他の時点ではパフォーマンスが低下する可能性があります。何をしているのかわかっていれば、swappinessを少し減らすことは正当化されるかもしれませんが、10%にまで減らすと、システムが非常に低いキャッシュサイズに耐えられるようになり、システムがすぐにスワップしなければならなくなる可能性が高くなります。

プロセスがクラッシュしたり強制終了したりする可能性があるメモリ不足状態に対する追加の保護が失われるため、スワップを完全に無効にすることは避けてください。

最も効果的な解決策は、余裕がある場合はより多くのRAMをインストールすることです。

とにかく大量のRAMを搭載したシステムでスワップを無効にできますか?

アプリケーションに必要と思われるよりもはるかに多くのRAMがある場合、スワップはほとんど必要ありません。スワップを無効にしても、ほとんどの場合、おそらく違いはありません。ただし、RAMが十分にある場合、システムは必要のないときにスワップしないので、スワップを有効にしたままにしてもペナルティはありません。

違い生む唯一の状況は、システムがメモリ不足に陥り、その結果キャッシュシステムが妨げられているという、ありそうもない状況であり、このタイプの状況で最もスワップが必要な状況です。したがって、十分なメモリがある場合にマイナスの影響を与えることなく、安心して通常の設定でスワップを安全に残すことができます。

しかし、どうすればスワップでシステムを高速化できますか?スワップの速度が遅くなりませんか?

RAMからスワップにデータを転送する動作は遅い動作ですが、適切なキャッシュサイズを維持することの結果としての全体的なメリットがこれを上回るとカーネルが確信している場合にのみ行われます。

データがスワップされると、いつ再びデータが出ますか?

メモリの特定の部分は、使用されるとすぐにスワップから復帰します-読み取りまたは書き込み。ただし、通常、スワップされるメモリは、長時間アクセスされておらず、すぐに必要になるとは予想されないメモリです。

スワップからデータを転送するには、そこにデータを入れるのと同じくらい時間がかかります。必要のないカーネルは、カーネルからデータを削除しません。データがスワップであり、使用されていないが、それは他のもののためのより多くのメモリ残さ使用されて、多くのシステムキャッシュを。

swappinessを減らすことが適切な場合はありますか?

はい。システムキャッシュの恩恵を受けない特定のサーバーアプリケーション専用のサーバーを実行している場合。Oracleサーバーなどの一部のデータベースサーバー、MySQL / MariaDBは、これらのデータベースエンジンが独自のキャッシュを使用するため、swappinessを1〜10に減らすことを推奨する場合があります。

これは、システムがその1つのタスク専用である場合にのみ当てはまることに注意してください。MySQL/ MariaDBの場合は、MyISAMやAriaなどではなく、純粋にInnoDBまたはXtraDBを使用している場合のみです。


詳しい説明をありがとうございます。私の場合(4GB Ramと128GB SSDハード)と私の使用(Java EE開発とvitualボックスのいくつかのOS)では、swapiness = 20が適切だと思います。どう思いますか?
サイードザリンファム

私の意見では、デフォルトの60が最適だと思います。
-thomasrutter

4
@BlancaHigginsはコメントした投稿を読みましたか?あなたのコメントは、swapinessが実際に行うことを説明していないようです。
thomasrutter 14年

1
これは素晴らしい答えです。このような素晴らしい説明をありがとうございました。
ダン・バロン

2
そのSwapFaqの情報の一部は、私の意見では誤解を招く可能性があります。100に設定すると、「積極的に」スワップされます。これは非常に慎重でプロアクティブな設定であり、利用可能なメモリまたはキャッシュが少しでも少なくなっているという最初の兆候でスワップすると言う方が正確だと思います。10のような低い設定は、より危険でスリルを求める設定であり、使用可能なメモリが非常に少なくなり、キャッシュが完全になくなるまでスワッピングを避け、システムに余地を残さないようにします。
thomasrutter

14

通常のデスクトップでは、メモリの50〜60%を消費する4〜5個のアクティブなタスクがあります。swappinessを60に設定すると、アクティブなタスクページの約1/4〜1/3がスワップアウトされます。つまり、タスクの変更ごと、開いた新しいタブごと、JSの実行ごとに、スワッププロセスが発生します。

解決策は、swappinessを10に設定することです。実際の観察では、これによりシステムはディスクioキャッシュを放棄します(読み取り/書き込みキャッシュは事実上まったく使用されないため、デスクトップではほとんど役割を果たしません。ファイル)何もスワップにプッシュする代わりに。実際には、システムがページのスワップを拒否し、使用済みメモリの90%に達しない限り、代わりにioキャッシュをカットします。そしてそれは、スムーズでスワップレスで高速なデスクトップエクスペリエンスを意味します。

ただし、ファイルサーバーでは、swappinessを60以上に設定します。サーバーには、メモリ全体に保持する必要がある巨大なアクティブフォアグラウンドタスクがなく、むしろ動作中またはスリープ中の小さなプロセスが多数あるためです。実際にすぐに状態を変更するわけではありません。代わりに、サーバーは多くの場合、まったく同じデータをクライアントに提供(恩赦)し、ディスクioキャッシュをより価値のあるものにします。そのため、サーバーでは、スリーププロセスをスワップアウトして、ディスクキャッシュリクエスト用のメモリスペースを解放する方がはるかに優れています。

ただし、デスクトップでは、この正確な設定により、このデータをほぼ絶えず変更またはアクセスするREALアプリケーションのメモリブロックがスワップアウトされます。

奇妙なことに、ブラウザは頻繁に大きなメモリチャンクを予約し、常に変更します。そのようなチャンクがスワップアウトされると、それらが戻されるように要求された場合、しばらく時間がかかります。同時に、ブラウザーはキャッシュを更新し始めます。これは非常に大きな遅延を引き起こします。実際には、新しいタブの単一のWebページがロードされるまで2分間待機します。

デスクトップは、データの大きな部分を繰り返しキャッシュ可能に読み書きすることはめったにないので、実際にはdisk ioを気にしません。スワップを可能な限り防止するためにディスクioをカットすることは、デスクトップの場合、30%のRAM(アクティブに使用されるアプリケーションに属するブロックでいっぱい)をディスクキャッシュ用に予約するよりもはるかに有利です。

htopを起動し、ブラウザ、GIMP、LibreOfficeを開いて、そこにいくつかのドキュメントをロードしてから、数時間ブラウズします。本当に簡単です。


3
サーバーとデスクトップの違いの説明に+1。サーバーのディスクキャッシュは、ディスクフィールドで実行できます。
ディー14

この場合、Ubuntuのサーバーバージョンとデスクトップバージョンの両方がデフォルトで60のスワップピネスになっているのはなぜですか?あなたが述べていることが真実であれば、デスクトップバージョンがデフォルトの20または10でさえ提供されることはより理にかなっていますが、そうではありません。
JAB

1
swappinessはスワップされるRAMの直接的な割合であるという意味のリファレンスですか?私はそれがそのように働くとは思わない。
Xen2050

1
そうではありません。SwappinessはRAMの割合とは関係ありません。これは、特定の問題の状況で多かれ少なかれスワップする可能性に向かってファジーアルゴリズムを微調整するノブです。また、この回答のサーバーとデスクトップのワークロードの説明は、常に当てはまるわけではない多くの仮定をしていると思います。
トーマスラッター

9

LinuxシステムでJavaサーバーを実行する場合は、swappinessをデフォルト値の60から大幅に減らすことを実際に検討する必要があります。したがって、実際には20が良いスタートです。スワップは、毎回コレクションがプロセスメモリの大部分に触れる必要があるため、ガベージコレクションプロセスにとって致命的です。OSには、そのようなプロセスを検出し、それらに適したものにする手段がありません。生産的なアプリケーションサーバーで可能な限りスワッピングを避けることをお勧めします。


システムキャッシュ(データベースサーバーなど)の恩恵を受けないことがわかっている特殊なワークロードに専用サーバーを使用する場合、swappinessを減らすことが理にかなっているのは事実です。しかし、ガベージコレクションが十分に専門化されたケースだとは思いません。メモリが頻繁にアクセスされる場合、スワップされることはなく、物理RAMに保持されます。これが当てはまらないのは、深刻なメモリ不足の状況がある場合だけです。スワッピングには責任がありません。
トーマスラッター

4

システムモニターを開いてマシンの負荷を正確に確認しながらいくつかの実験を行うことをお勧めします。また、4GBのメモリと128GB SSDで実行しているため、swapiness値を10に変更しました。ボーナスとして、書き込みが少なくなるため、SSDドライブの寿命も長くなります。

これを行う方法に関する簡単なビデオチュートリアルについては、以下のYouTubeビデオを参照してください。

http://youtu.be/i6WihsFKJ7Q


1
あなたが作成した素晴らしいビデオですが、ビデオは実際に質問に直接答えていません。スワップピネスの変更に関するハウツーです。
jmunsch 14年

SSDは、システムが可能な限り読み取り専用であり、残りがメモリ内にあり、現在のデスクトップPCのメモリは通常大きな問題ではない場合、SSDのヒントとして+1が最適です。
ディー

3

ビッグデータパフォーマンスエンジニアの視点を追加して、2017年のテクノロジーの背景を他の人に伝えたいと思います。

私の個人的な経験では、通常、システムが最大速度で実行されることを保証するためにスワッピングを無効にしていますが、特定の問題のためにワークステーションで、1と10のスワッピングがフリーズ(永久)と長い一時停止につながることがわかりました。この特定のアプリケーションの80のSwappinessは、デフォルト(60)よりもはるかに優れたパフォーマンスと短い休止時間をもたらします。8GBのRAMと1つのHDDでバックアップされた4x 256GBのスワップがあることに注意してください。私は通常、ベンチマークと完全なハードウェア仕様に見られる正確な統計情報を述べますが、私はまだ何もしておらず、ここでは重要ではない最近のローエンドのデスクトップです。

以前の会社に戻って、[500GBから4TB] x [10-100]ノードのSparkサーバーでスワップ可能性を有効にしなかった理由は、データパイプラインとデータ構造をより効率的に再設計するための兆候としてパフォーマンスが低かったためですマナー。また、HDD / SSDのベンチマークも行いたくありませんでした。また、その量のRAMをスワップするには、ディスクアクセス時間を最小限に抑えるために、ノードごとに並列書き込みで10〜30個のディスクが必要になります。

今日、20年前と20年先の未来においても、RAMにとっては問題が大きすぎるという問題が残っています。無限の時間とお金で、より多くのハードウェアを購入/リースしたり、任意のプロセスを再設計してパフォーマンスを望ましいレベルにすることができます。スワッピングは、実際の問題を無視できるようにするためのハックにすぎません(十分なRAMがなく、より多くのお金を使いたくありません)。

高い交換性は悪いアドバイスだと思う人のために、ここに少しの視点があります。過去には、HDには数KBのキャッシュしかありませんでした。インターフェースはIDE / Parallel ATAでした。CPUバスも、RAMやその他の多くの要素とともに非常に低速でした。つまり、システムはあらゆる点で非常に低速でした(今日に比べて)。数年前、HDDはSATA3を使用していました。今日、彼らはNVMeプロトコルを使用していますが、これには大幅なレイテンシの改善があります。HDには多くのMBのキャッシュがあります。そして、最も興味深い部分は、スワップストレージとしてNVMeまたはPCIeを備えた最新のSSD(はるかに安定した読み取り/書き込み耐久性とパフォーマンス)を使用する場合です。コストとパフォーマンスの最適な妥協点です。安価または古いSSDでこれを試さないでください。

Swap + SSD!高性能の揮発性ストレージでは、高い交換可能性の値を試すことを強くお勧めします。これは主に、メモリアクセスパターン(すべてのメモリへのランダムアクセスとほとんどアクセスしないこと)、メモリ使用量、ディスク帯域幅が既に飽和している場合、およびスラッシングの実際のコストに依存します。


1

起動時またはプログラムを開いたときに認識されるスワッピング動作の多くは、Linuxがディスクから構成ファイルなどを読み取ることです。そのため、ハードドライブへのアクセスがスワッピングによるものであると想定する前に、システムモニタプログラムを使用して確認するのが最善です。

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