web-dev-qa-db-ja.com

swappinessがデフォルトで60に設定されているのはなぜですか?

Linuxでのスワップについていくつか読んだだけです。デフォルトが60に設定されている理由がわかりません。

私によると、スワップを減らすために、このパラメーターは10に設定する必要があります。スワップは私のハードドライブにあるので、私のメモリよりもはるかに遅いです。

なぜ彼らはそのようにカーネルを構成したのですか?

111
Hugo

カーネル2.6.28以降、Linuxは Split Least Recently Used (LRU)ページ置換戦略を使用しています。プログラムテキストや共有ライブラリなどのファイルシステムソースを含むページは、ファイルキャッシュに属します。ファイルシステムバッキングのないページは匿名ページと呼ばれ、アプリケーション用に予約されたスタックスペースなどの実行時データで構成されます。通常、ファイルキャッシュに属するページは、メモリから削除する方が安価です(必要なときにディスクから簡単に読み戻すことができるため)。 。匿名ページにはファイルシステムのバッキングがないため、それらを格納するためのスワップ領域がない限り、プログラムが必要とする限り、ページはメモリに残っている必要があります。

スワップパーティション が何らかの理由でシステムの速度を低下させることはよくある誤解です。スワップパーティションがないことは、カーネルがメモリからページを削除しないことを意味するのではなく、削除するページに関してカーネルが選択できる選択肢が少ないことを意味します。利用可能なスワップの量は、それが使用される量に影響を与えません。

デフォルトでは、カーネルメモリアカウンティングポリシーは overcommit memory であるため、Linuxはスワップスペースの欠如に対処できます。欠点は、物理メモリが使い果たされ、カーネルが匿名ページをディスクにスワップできない場合、 out-of-memory-killer (OOM-killer)メカニズムがメモリを浪費する「悪党」を殺し始めることです"他のプロセスのためにメモリを解放するプロセス。

vm.swappiness オプションは、匿名ページを優先してファイルキャッシュページをスワップアウトする間のバランスを変更する修飾子です。ファイルキャッシュには200の任意の優先度値が与えられ、そこからvm.swappiness修飾子が差し引かれます(file_prio=200-vm.swappiness)。匿名ページは、デフォルトでは60(anon_prio=vm.swappiness)で始まります。つまり、デフォルトでは、優先順位の重みは、匿名ページ(anon_prio=60file_prio=200-60=140)を優先して適度に高くなります。この動作は、カーネルソースツリーのmm/vmscan.cで定義されています。

vm.swappiness100の場合、優先度は(file_prio=200-100=100anon_prio=100)になります。これは、ファイルキャッシュからのページが匿名ページを優先して追い出されることが望まれない場合、I/O負荷の高いシステムにとって意味があります。

逆にvm.swappiness0に設定すると、カーネルが匿名ページを追い出し、ファイルキャッシュのページを優先します。これは、一部のデータベースの場合のように、プログラムがキャッシュの大部分を自分で行う場合に役立ちます。デスクトップシステムでは、これにより対話性が向上する可能性がありますが、I/Oパフォーマンスが低下する可能性があるという欠点があります。

デフォルト値は、これら2つの極端な値の間の近似的な中間値として選択されている可能性が高いです。他のパフォーマンスパラメータと同様に、vm.swappinessの調整は、単なる直感ではなく、実際のワークロードに匹敵するベンチマークデータに基づいている必要があります。

136
Thomas Nyman

問題は、すべてのニーズに対応するデフォルト値が1つないことです。 swappinessオプションを10に設定することは、デスクトップには適切な設定ですが、デフォルト値の60はサーバーに適しています。言い換えると、swappinessは、ユースケース(デスクトップvsサーバー、アプリケーションタイプなど)に応じて調整する必要があります。

さらに、Linuxカーネルはディスクキャッシュにメモリを使用します。それ以外の場合、RAMは使用されず、これは効率的でなく意図されたものではありません。ディスクデータをキャッシュに置くと、同じデータが再び必要になる場合があります。 、メモリから取得する可能性があります。そこからデータを取得する方が、ディスクから再度取得するよりもはるかに高速です。また、swappinessオプションは、Linuxカーネルがディスクキャッシュを縮小するよりもディスクにスワップアウトすることを好むメカニズムです。キャッシュから古いデータを削除するのか、それともいくつかのプログラムページをスワップアウトするのか?

この記事 は、このトピックにもいくつかの光を当てるかもしれません。特にスワッピング傾向の推定方法。

9
dsmsk80

上記の回答に詳細を追加します。
VMをどんどん使用しているため、Linuxホストはこれらのクラウド環境の1つでvmになる場合があります。例1と2の両方で、実行中のアプリケーションと、それらが消費するRAMの量を把握しています。 3ではあまりない

  • 例1
    高性能のプライベートクラウド(ほとんどの銀行が数百万ドルを支払うようなものだと考えてください)で、ディスクは非常に優れたIOを備えた非常に高価なストレージアレイによって提供されます。そのストレージの一部は、SSDディスクに支えられたRAM(ディスクアレイ内)にあり、スピンドルを持つ通常のディスクに支えられています。この状況では、VMが認識するディスクは、アクセスできるRAMよりも少しだけ遅くなる可能性があります。単一のvmの場合、swapとramの間に大きな違いはありません。
  • 例2
    例1と同じですが、単一のvmの代わりに、数百、数千、またはそれ以上があります。この状況では、サーバー(ハイパーバイザー)RAMは安価で豊富ですが、ストレージRAMは(比較的言えば)高価です。ハイパーバイザーRAMと、非常に高価なストレージアレイによって提供されるSWAPの間でRAM要件を分割すると、ストレージアレイ内のすべてのRAMをすぐに使用できることがわかります。その後、ブロックはSSDによって提供され、最後にスピンドルによって提供されます。突然、すべてが本当に遅くなり始めます。この場合、累積的な効果として、(ハイパーバイザーから)大量のRAMをVMに割り当て、swappinessを0(メモリ不足の状態を回避するためにのみスワップ)に設定します。これらすべてのVMのうち、ストレージのパフォーマンスに影響を与えます。現在、やり取りされていないアプリがすでに使用されているため、swappinessを高く設定すると、未使用のRAMが増えるため、パフォーマンスが向上する可能性があります。 (ほとんど)スワップアウト。
  • 例3 SSDを搭載した最新のラップトップまたはデスクトップ。メモリ要件は不明と見なされます。ユーザーが使用するブラウザー、開いているタブの数、ドキュメント、RAW画像、場合によってはビデオの編集も、すべてRAMを消費します。 swappinessを低い値に設定し、他のファイルシステムの調整を実行すると、SSDへの書き込みが少なくなり、より長く持続します。
5
Timothy c