web-dev-qa-db-ja.com

LinuxはFSキャッシュをドロップしません。代わりに、メモリがスワッピングを開始します

Linuxのメモリキャッシュのこの動作についてはかなり混乱しています。

             total       used       free     shared    buffers     cached
Mem:         15953      14188       1765         64         37      11504
-/+ buffers/cache:       2645      13308
Swap:         2047       1332        715

キャッシュに対して非キャッシュメモリの優先順位を設定するべきではありませんか?言い換えると、キャッシュをドロップするのではなく、マシンがディスクにスワップするのはなぜですか。

この動作を変更できますか?はいの場合、どのように?

5
noqqe

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の値です。

9
chaos