How measure memory without copy-on-write pages?
I ended up writing my own utility for this: https://gist.github.com/Eugeny/04ccfe8accf4bc74b0ca
I ran it against init
(pid 1) for testing and the total reported roughly equals the physical ram usage (as per htop), so I guess it's somewhat correct.
Example use:
~ » pstree -ap 15897
zsh,15897
└─sudo,9783 make rundev
└─make,9784 rundev
└─sh,9785 -c cd ajenti-panel && ./ajenti-panel -v --autologin --plugins ../plugins --dev
└─python ./ajenti,9786
├─./ajenti-panel ,9834
├─./ajenti-panel ,9795
└─{python ./ajenti},9796
~ » sudo ./memuse.py 15897
PID Commandline Frames (+unique) VMEM
- 15897 (/usr/bin/zsh ): 1776 +1776 7104 KB
- 9783 (sudo make rundev ): 608 +408 2432 KB
- 9784 (make rundev ): 261 +98 1044 KB
- 9785 (/bin/sh -c cd ajenti-panel && ): 166 +48 664 KB
- 9786 (python ./ajenti-panel -v --aut): 9279 +8977 37116 KB
- 9795 (./ajenti-panel worker [restric): 7637 +1334 30548 KB
- 9834 (./ajenti-panel worker [session): 8972 +2639 35888 KB
----------------------------------------------------------------------------------------
TOTAL: 15280 61120 KB
There is no clearly defined way of determining in any tool I know of which processes share which maps without iterating through all the mappings and comparing addresses.
However, linux does offer reasonable estimate known as the Proportional set size. This is reported in /proc/[pid]>/maps.
This value is the size of the mapping divided by the number of siblings/parent processes with the same mapping open.
So, with a program that has a 1MiB mapping open, plus a 1MiB shared with 4 other processes, the proportional set size is 1MiB + (1Mib / 4) or 1.250 MiB. The RSS in this case would be 2MiB.
There is a patch for htop floating around which will use the PSS to calculate a 'good estimate' of actual memory in use.