web-dev-qa-db-ja.com

vm.swappinessパラメーターは実際に何を制御しますか?

カーネルのドキュメントによると:

This control is used to define how aggressive the kernel will swap
memory pages.  Higher values will increase aggressiveness, lower values
decrease the amount of swap.

ただし、これはあいまいです。パラメータが最終的に制御するものを正確に把握しようとしています。カーネルがページをスワップアウトしようとする積極性を調整することは知っていますが、カーネルコードのどの意思決定プロセスが影響を及ぼしますか?

カーネルがページをスワップアウトする前に、ページにアクセスする必要がある期間を調整しますか?もしそうなら、デフォルト値の60は何を表していますか?そして、1の増分/減分によってどれだけ変更されますか(式はニースになります)?
それとも、アクセス頻度に基づいてページを交換しますか?
または、他の何か?

37
Patrick

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

_vm.swappiness_ オプションは、_mm/vmscan.c_で定義されているget_scan_count()で機能します。 get_scan_count()は、削除するページを探すときに、匿名LRUリストとファイルLRUリストをどの程度積極的にスキャンするかを決定します。各ケースの値は、最近ローテーションされた比率と最近スキャンされた比率の変動平均によって決定されます。システムのワークロードの変化を考慮に入れるため、最近の参照は古い参照よりも重みが大きくなっています。

_vm.swappiness_は、匿名ページを優先してファイルキャッシュページをスワップアウトする際のバランスを変更する修飾子です。 _vm.swappiness_は匿名ページに与えられる優先度の値です デフォルトでは60に設定されています 。ファイルキャッシュには200の優先度値が与えられ、そこから_vm.swappiness_修飾子が差し引かれます(_file_prio=200-anon_prio_)。つまり、デフォルトでは、優先度の重みは匿名のページ(_anon_prio=60_、_file_prio=200-60=140_)を優先して適度に高くなります。ただし、システムが メモリ不足状態 に近い場合、_vm.swappiness_がゼロに設定されていない限り、匿名LRUリストとファイルLRUリストの両方が等しくスキャンされます。

_vm.swappiness_が100に設定されている場合、優先度は(_anon_prio=100_、_file_prio=200-100=100_)になります。 _vm.swappiness_をゼロに設定すると、カーネルが匿名ページをファイルキャッシュからのページを優先して追い出すのを防ぎます。

27
Thomas Nyman

どのページがスワップされるかを計算するために使用される式があります。 vmscan.cこのアルゴリズムを見ることができます:

スワップ傾向= mapped_ratio/2 + distress + vm_swappiness

ここでswappinessがスケールであることがわかります。これはいくつかのアルゴリズムで追加され、このパラメーターによって、カーネルがスワップする必要がある場合のカーネルの動作を制御できます。一部の非アクティブなメモリページがスワップされる確率の割合として計算できます。 swappinessを100に設定した場合、確率はありませんが、スワップすることが保証され、0に設定した場合、カーネルは、空のメモリがある限り、まったくスワップしないようにします。

13
Jan Marek

エレベーターの「CLOSE DOOR」ボタンが壊れているか、そもそも何にも接続されていないことがよくあると言われています(私はNorman 1986と思います)。これにより、ersatzはエレベーターを操作する方法ではなく、急いでいるライダーを落ち着かせる方法を制御します。

同様に、swappinessは、カーネル述語の明確に定義された決定論的な制御とは関係のない効果をもたらします。 @ neon_overlord on askubuntu.com によって指摘されたように

ほとんどの人は、スワッピング=悪いと考えており、スワッピングを削減しない場合、システムは実際にスワップする必要がない場合にスワップを実行します。どちらも本当ではありません。スワップとは、システムが停滞している時間を指しますが、システムが停滞しているためではなく、ほとんどの場合スワップです。スワッピングが顕著なペナルティをもたらす可能性がある特定の場合があることは事実ですが、その場合のスワッピングを減らすと、後で顕著になる可能性のある他の方法でシステム全体のパフォーマンスまたは安定性が低下する可能性があります…

それでそれは本当に制御するのでしょうか?有効な回答の1つは、既に提供されている細かい回答に加えて、システムをより詳細に制御できるという期待を変え、ノブを回すと、意味のある方法でその制御を実行できるようになるということです。

6
msw