
私はLinuxメモリキャッシュのこの動作のために非常に混乱しました。
total used free shared buffers cached
Mem: 15953 14188 1765 64 37 11504
-/+ buffers/cache: 2645 13308
Swap: 2047 1332 715
キャッシュされていないメモリがキャッシュより優先されるべきではありませんか?つまり、キャッシュを削除するのではなく、マシンがディスクに置き換えられるのはなぜですか?
この動作を変更できますか?それではどうですか?
答え1
Linuxスワップアルゴリズムは、「最近使用されたページ」という概念を使用します。仮想メモリの各ページには関連する寿命があります。ページを頻繁に訪問する場合は、ページの年齢はかなり若くなければならず、ページを訪問しないとページは年をとるようになります。ページが古くなるほど、置き換えられる可能性が高くなります。
したがって、カーネルがコンテンツを置き換える場合、これはそのページが(他のページと比較して)古いためです。すべてのページに十分な物理メモリがある場合、期間に関係なく何も交換されません。
カーネルは、メモリ、スワップなどのリソースを最も効率的な方法で処理するように構成されています。
私はあなたがこの行動を変えなければならないとは思わない。ただし、必要に応じてシステムの交換性を変更できます。 swappiness設定を0に設定すると、必要な場合(メモリ不足)でない限り、ディスクの使用を避けることができます。
~からカーネル文書価値についてswappiness
:
このコントロールは、カーネルがメモリページをどれだけ積極的に交換するかを定義します。値が高いほど攻撃性が増加し、値が低いほど交換量が減少します。値が 0 の場合、使用可能なページおよびファイル・サポート・ページの数が、その領域の最高水位表示よりも小さくなるまでスワップを開始しないようにカーネルに指示します。
Linuxカーネルソースコードのファイルvmscan.c
交換価値を処理します。面白い部分は次のとおりです。
2018 /*
2019 * With swappiness at 100, anonymous and file have the same priority.
2020 * This scanning priority is essentially the inverse of IO cost.
2021 */
2022 anon_prio = swappiness;
2023 file_prio = 200 - anon_prio;
- 匿名ページファイルやデバイスをサポートしていないメモリマップ。これは、プログラムがスタックやヒープなどで使用するためにオペレーティングシステムからメモリを割り当てる方法です。
- ファイルページ既存のファイルの内容をミラーリングします。
上記のソースコードの断片からわかるように、スワップファイルページはスワップ匿名ページよりも優先順位が高くなります(デフォルトは60)。ただし、100に設定すると、両方の値が同じ優先順位を持ちます。 0に設定すると、優先順位の差ができるだけ大きくなります。
次のように交換性を設定できます。
echo n >/proc/sys/vm/swappiness
… n
0~100の値はどこにありますか?