質問: 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の増分/減分によってどれだけ変更されますか(式はニースになります)? それとも、アクセス頻度に基づいてページを交換しますか? または、他の何か?
回答: カーネルバージョン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_をゼロに設定すると、カーネルが匿名ページをファイルキャッシュからのページを優先して追い出すのを防ぎます。