Linuxのメモリキャッシュのこの動作についてはかなり混乱しています。
total used free shared buffers cached
Mem: 15953 14188 1765 64 37 11504
-/+ buffers/cache: 2645 13308
Swap: 2047 1332 715
キャッシュに対して非キャッシュメモリの優先順位を設定するべきではありませんか?言い換えると、キャッシュをドロップするのではなく、マシンがディスクにスワップするのはなぜですか。
この動作を変更できますか?はいの場合、どのように?
Linuxスワッピングアルゴリズムは、「最近使用した最後のページ」の概念で機能します。仮想メモリの各ページには、年齢が関連付けられています。ページが頻繁にアクセスされている場合、そのページはかなり若いと考えられますが、ページがアクセスされていない場合、そのページは古くなります。ページが古くなるほど、スワップアウトされる可能性が高くなります。
したがって、カーネルがものを交換する場合、それはそれらのページの年齢が(他のページと比較して)古いためです。年齢に関係なく、すべてのページに十分な物理メモリがある場合、何も交換されません。
カーネルは、メモリやスワップなどのリソースを可能な限り最も効率的な方法で処理するように構成されています。
私はあなたがその振る舞いを変えるべきではないと思います。ただし、必要に応じて、システムのswappinessを変更できます。スワップピネスの設定を0にすると、どうしても必要な場合(メモリが不足する場合)を除いて、ディスクが回避されます。
カーネルドキュメント からswappiness
の値について:
このコントロールは、カーネルがメモリページをスワップする度合いを定義するために使用されます。値が大きいほど攻撃性が高くなり、値が小さいほどスワップの量が少なくなります。値0は、空きページとファイルバックアップページの量がゾーンの最高水準点より少なくなるまでスワップを開始しないようにカーネルに指示します。
Linuxカーネルのソースコードでは、ファイル vmscan.c
swappiness値を処理します。ここに興味深い部分があります:
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の値です。