他の質問で提起されたトピックに続いて、信じるLinuxカーネルは、物理RAMを解放しようとしたときにディスクキャッシュのページを削除するのか、別のページをスワップ領域にフラッシュするのかを決定します。 私はこれについて確信していません。おそらくメカニズムを完全に誤解しているようです。
それにもかかわらず、次の間に相乗効果があります。
- カーネルは独自の内部ディスクキャッシュを保持します。
- プログラムメモリマッピングファイル
- 「一般」アプリケーションメモリはスワップファイルに配置されます。
3つの方法はすべて物理RAMを取得するために使用でき、3つすべてが「ダーティ」ページをディスクに書き込むか、単にこれらのページがディスクにきれいにコピーされたことを知っており、物理RAM割り当てから削除する方法に依存します。
スワップスペースを使用すると、個々のスワップパーティションとファイルに優先順位を付けることで、遅いデバイスよりも高速なデバイスを使用できます。切り替えられていない他のデバイスのこれらの設定は不明です。
私の質問は:カーネルはどのメモリを解放するかをどのように決定しますか?
- 純粋に過去の訪問に基づいていますか?
- カーネルは上記の3つすべてを同じように使用しますか?
- これら(および個々のディスク)の間に優先順位がありますか?
- 構成できますか?
この質問は、次のような経験から来ました。これしかし、私はこの質問が特定の問題を解決するのではなく、基本的なメカニズムに焦点を当てたいと思います。
答え1
メモリの物理ページを解放するジョブ全体の名前は次のとおりです。リサイクル、これには多くのタスクが含まれます。校正は主にページ割り当てに基づいて行われ、緊急度はさまざまです。オフロードされたシステムでは、ページ割り当てが容易に満たされ、回収はトリガされません。適切にロードされたシステムでは、ページ割り当てはすぐに満たすことができますが、kswapd
バックグラウンド再生を実行するためのスリープモードの解除も発生します。ページ割り当てがすぐに満たされないロードされたシステムでは、校正は同期的に実行されます。
リサイクル可能ページは、他の場所で見つけることができるまたは使用できるコンテンツを保存するページです。ここで、一般的なバランス操作が始まります。つまり、コンテンツがファイルにある(または最終的にファイルでなければならない)メモリ、v。コンテンツがファイルにない(および交換する必要がある)メモリ。前者はページキャッシュに格納され、後者はそうではありません。これは、バランシングの説明で一般的にページキャッシュとスワッピングについて話す理由です。
一方を他方よりも優先する決定は、カーネルのある場所で行われる。get_scan_count
、設定によって制御されるstruct scan_control
。この機能の目的については後述する。
匿名およびファイルLRUのリストをどの程度積極的に調べるかを決定します。各LRUリストセットの相対値は、削除するのではなくアクティブリストに戻すスキャンされたページの割合を確認することによって決定されます。
驚くべきことに、関数の場合、get_...
戻り値を使用せずにポインタが指す配列を匿名unsigned long *nr
非アクティブページ(サポートされていない、最近使用されていないページ)、匿名アクティブページ(サポートされていない、最近使用されたページ)、ファイル非アクティブページ(最近使用されていないページキャッシュのページ)とファイルアクティブページ(最近使用されていないページキャッシュのページ)。
get_scan_count
まず、次から適切な「スワップ」値を取得します。mem_cgroup_swappiness
。現在のメモリcgroupが有効な非root v1 cgroupの場合、対応するスワップ設定が使用されます。/proc/sys/vm/swappiness
。両方の設定を共有同じ目的;彼らはカーネルに話す
置き換えられた匿名ページの再インポートとファイルシステムページの再ロードにかかる相対IOコスト
ただし、実際に値を使用する前にget_scan_count
適用する必要がある全体的な戦略を決定してください。
- 交流や匿名ページがない場合元に戻せない現在のコンテキストでは、ファイルでサポートされているページのみを追跡します。
- メモリcgroupがスワップを完全に無効にすると、ファイルがサポートするページのみが処理されます。
- swappinessが無効にされず(0に設定されている)、システムにメモリが不足している場合は、すべてのページを同じように処理します。
- システムにファイルページがほとんどない場合は、匿名ページのみが処理されます。
- キャッシュされた非アクティブページが十分な場合は、ファイルでサポートされているページのみを見つけます。
- 他のすべてのケースでは、対応するI / Oコストに基づいて各LRUに付与された「重み」を調整します。
ポリシーが決定されたら、削除可能なすべてのLRU(非アクティブ匿名、アクティブ匿名、非アクティブファイルサポート、アクティブファイルサポート順序)を繰り返して、各LRUをスキャンする必要があるページ数を決定します。 v1 cgroup を無視します。
- ポリシーが「すべてのページを同じに検索」すると、すべてのLRUのすべてのページを検索でき、最大サイズは
scan_control
移動priority
引数によって決まります。 - ポリシーが「ファイルサポートページのみ追跡」または「匿名ページのみ追跡」の場合、そのLRUのすべてのページは候補ページであり(もう一度移動をタップ)、
priority
他のLRUにはページがありません。 - それ以外の場合は、交換性に基づいて値を調整します。
実際のページスキャンは次のように実行されます。shrink_lruvec
、上記で決定したスキャン長を使用して繰り返します。縮小目標に達するまで、さまざまな方法で目標を調整する(LRU)この操作が完了すると、アクティブ/非アクティブLRUが再調整されます。
質問に戻る:
- ページキャッシュとメモリマッピングファイルは同じように扱われます。
- ページのリサイクルは純粋に最後のアクセスだけに基づいていません。 (LRUの使用方法や再調整の仕組みについては説明していません。お読みください。Mel Gormanの該当する章Linux仮想メモリマネージャについてもっと学ぶ);
- カーネルはそれを同じように使用せず、状況に応じて優先順位が異なり、設定できます。渡す多くの制御(
swappiness
、cgroups、低い透かししきい値...)。
スワップ優先順位は、ページがスワップアウトされることを決定した後にページが移動される場所のみを決定します。 (ところで、swappiness
上記のドキュメントと説明では、I / Oコストが混在したZRAM /ディスクスワップ設定をうまく処理するのに十分なほど詳細ではないことを明確にする必要があります...)
scan_control
まだ設定方法をはじめ説明することが多いですが、すでに長すぎたようです!リサイクルコストを追跡するには、以下で追跡できます。作業遅延会計(あなたも見ることができますstruct taskstats
)。