Вы можете получить такую информацию из /proc/<pid>/smaps
файла для каждого процесса в форме Pss
записи (сокращение от «Размер пропорциональной доли»).
В приведенном выше примере с 200 МБ, «разделенными» между двумя процессами, каждый процесс будет показывать 100 МБ в записи PSS для этого сопоставления, то есть память распределяется равномерно между процессами, которые разделяют ее (до тех пор, пока она не будет скопирована и не будет использована всеми процессами).
Вот выдержка из того, что вы запустили:
$ top
...
30986 me 20 0 790m 769m 2200 S 0 4.8 0:00.48 python3.2
30987 me 20 0 790m 767m 224 S 0 4.8 0:00.00 python3.2
$ cat /proc/30986/smaps
...
0119a000-015b7000 rw-p 00000000 00:00 0 [heap]
Size: 4212 kB
Rss: 3924 kB
Pss: 1992 kB
...
7fa06b020000-7fa09ab11000 rw-p 00000000 00:00 0
Size: 781252 kB
Rss: 781252 kB
Pss: 390626 kB
...
7fff8e45a000-7fff8e489000 rw-p 00000000 00:00 0 [stack]
Size: 192 kB
Rss: 160 kB
Pss: 82 kB
...
(В этих файлах содержится много материала, включая сопоставления для разделяемых библиотек, которые потенциально могут использоваться многими процессами, и, таким образом, каждый процесс получает только небольшую часть, учитываемую в его записи PSS.)
Вот хорошая статья об этом: ELC: сколько памяти реально используют приложения?
Я не знаю ни одного распространенного инструмента для отображения этой информации, и ps
, к сожалению, не думаю, что у него есть варианты показать это. В статье указывается на хранилище с Python-скриптами, которое называется pagemap
Matt Mackall, которое вы можете использовать или адаптировать.
Бесстыдный плагин: вы найдете несколько постов в Unix & Linux о PSS и smaps
файле, если вы заинтересованы в этом.