web-dev-qa-db-ja.com

Linux:キャッシュされた量に占めるプロセスメモリ

私はubuntuサーバーのメモリ使用量の非常に奇妙なケースがあります。 1つのプロセス(sphinxsearchから検索)は、使用可能なほぼすべてのメモリを割り当て、そのVSize、RSS、およびSHRはほぼ同じです(約18GB)。しかし、私が本当に驚いたのは、コマンドfreeがこのメモリの大部分を「キャッシュ」として処理することです。これは常に「カーネル所有」だと思っていました。つまり、特定のプロセスにバインドされていません。また、同時に「共有」としてマークされますが、これほどメモリ使用量の多いプロセスは他にありません。

したがって、無料の-hは次のことを示しています。

root@st3:/proc/31633# free -h
             total       used       free     shared    buffers     cached
Mem:           23G        22G       649M        18G        62M        18G
-/+ buffers/cache:       4.4G        19G
Swap:           0B         0B         0B

しかし、検索されたプロセスについては、次のようになります。

VmPeak: 20451512 kB
VmSize: 20413352 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:  20325488 kB
VmRSS:  20287332 kB
VmData:  1344768 kB
VmStk:       136 kB
VmExe:      4268 kB
VmLib:     16204 kB
VmPTE:     39924 kB
VmSwap:        0 kB

したがって、ここで実際の使用法が何であるかを本当に理解することはできません-メモリのほとんどはキャッシュにのみ使用されているようですので、心配する必要はありません。OTOHは、単純なフォークの「メモリを割り当てることができません」ですでにいくつかの障害に遭遇しました。だから私はそれを理解しようとしています。

さらに必要な場合は、 これがそのマシンからの完全なmeminfoです 、および これがsearchdプロセスのメモリマッピングの完全なリストです

そして最後のものを見ると、私はたくさん見ます:

7f7c905b7000-7f7c90713000 rw-s 00000000 00:05 226801755                  /dev/zero (deleted)
7f7c90713000-7f7c91fff000 rw-s 00000000 00:05 225400928                  /dev/zero (deleted)
7f7c92055000-7f7c921c7000 rw-s 00000000 00:05 226767567                  /dev/zero (deleted)
7f7c921da000-7f7c92338000 rw-s 00000000 00:05 226774289                  /dev/zero (deleted)

...だから私はこれがポイントである可能性があると推測することができます、searchedはメモリを保持するためにいくつかの巧妙なトリックを行っていますが、同じポイントで必要なときにシステムでそれを利用できます。そして多分それは期待通りに完全に機能しません。しかし、それは私の大げさな推測に過ぎず、ここでは完全に間違っている可能性があります。

2
kompas

「キャッシュ」エントリは、「共有」としてマークされたページの数をカウントしています。指定されたマッピングは共有としてマークされます。

カーネルは、共有フラグで設定されたメモリと、オペレーティングシステムによって単純にキャットされ、キャッシュに格納されたファイルの違いを内部的に認識しません(キャッシュ内のすべてのファイルは事実上共有マッピングです)。

これが/ dev/zeroに裏打ちされているという事実は重要ではありません。それらが共有される理由は、ほぼ確実に、データを変更するすべての子プロセスで同じメモリデータを使用できるようにする必要があるためです。

セマンティクスの観点からは、ページを削除できる使用可能なファイルが実際にはなく(/ dev/zeroは実際には保存できるファイルではない)、ページが移動される場合、通常割り当てられているメモリ(または匿名メモリ)のように動作します。それらが使用されていなかった場合は交換してください。

したがって、紛らわしいことに、データは「キャッシュ」としてアカウントされますが、実際には匿名でバックアップされたメモリのように扱われます。

これは、meminfoの場合とまったく同じであることがわかります。

root@st3:/proc/31633# cat /proc/meminfo 
MemTotal:       24690512 kB
...
Cached:         19504260 kB
...
Active(anon):    3734376 kB
Inactive(anon): 18973184 kB
Active(file):     227128 kB
Inactive(file):   365828 kB
...
Mapped:         19237684 kB
Shmem:          18985464 kB
...

IPC共有メモリも使用している場合も、同じ動作が発生します。

'file'は、実際にはファイルが裏付けられているものであり、 'anon'は、マッピングのように、ファイルが裏付けられていないものです。

1
Matthew Ife