回答:
私はこれのために自分のユーティリティを作成することになりました:https : //gist.github.com/Eugeny/04ccfe8accf4bc74b0ca
私はinit
テストのために(pid 1)に対してそれを実行し、報告された合計は物理的なRAM使用量(htopによる)にほぼ等しいので、いくぶん正しいと思います。
使用例:
~ » 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
すべてのマッピングを繰り返し処理してアドレスを比較することなく、どのプロセスがどのマップを共有するかを知るためのツールで明確に定義された方法はありません。
ただし、LinuxはProportional set sizeと呼ばれる合理的な見積もりを提供します。これは/ proc / [pid]> / mapsで報告されます。
この値は、マッピングのサイズを、同じマッピングが開いている兄弟/親プロセスの数で割った値です。
したがって、1MiBのマッピングが開いているプログラムに加えて、他の4つのプロセスと共有される1MiBの場合、比例セットのサイズは1MiB +(1Mib / 4)または1.250 MiBです。この場合のRSSは2MiBです。
使用中の実際のメモリの「適切な見積もり」を計算するためにPSSを使用する、htopの浮動小数点のパッチがあります。
/proc/*/map
ファイルをより深く分析することで可能になるはずですが、それを行うことができるツールを見つけたことはありません。主な問題は、従うべきデータ構造が見た目よりはるかに複雑であることです。ここで良い答えが得られない場合は、おそらくunix SEも試すことができます。