smapsみてみる

Linuxのメモリ周りをみていて、手元でもsmapsの内容を見てみました。 環境はkernel 3.10.0-229.el7.x86_64(バージョンアップしなきゃ。。)

実行したテストプログラムは以下のブログから丸々コピーさせてもらいました。

Linux のプロセスが Copy on Write で共有しているメモリのサイズを調べる - naoyaのはてなダイアリー

1回目がforkするだけのテストプログラムを動かした結果で、 2回目が、ブログにあるとおり、コメントアウトを外して、fork & 書き込みまでおこなった結果です。 ほぼ参考にさせて頂いたブログにあるとおりの結果になっていました。

# 1回目
00602000-067aa000 rw-p 00000000 00:00 0
Size:             100000 kB
Rss:              100000 kB
Pss:               50000 kB
Shared_Clean:          0 kB
Shared_Dirty:     100000 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:       100000 kB
Anonymous:        100000 kB
AnonHugePages:     96256 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
#2回目
00602000-067aa000 rw-p 00000000 00:00 0
Size:             100000 kB
Rss:              100000 kB
Pss:               75596 kB
Shared_Clean:          0 kB
Shared_Dirty:      48808 kB
Private_Clean:         0 kB
Private_Dirty:     51192 kB
Referenced:       100000 kB
Anonymous:        100000 kB
AnonHugePages:     96256 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac

このPssなる項目は、proportional set sizeというものらしいです。 以下のサイトに例がのっていてなんとなくわかったような気になりました。(実際はメモリ周りの扱いがわかっていないので、わかっていない。。。)

The "proportional set size" (PSS) of a process is the count of pages it has
in memory, where each page is divided by the number of processes sharing it.
So if a process has 1000 pages all to itself, and 1000 shared with one other
process, its PSS will be 1500.

https://www.kernel.org/doc/Documentation/filesystems/proc.txt

今回のテストの場合もprivateとsharedが1:1なので、PSSの値もほぼ上記の例と同じ比率になっているような気がします。

詳しくはまたどこかで調べてみます。