Как измерить объем памяти, занимаемый набором разветвленных процессов?

Как измерить объем памяти, занимаемый набором разветвленных процессов?

Допустим, у меня есть процесс, использующий 200 МБ памяти, и он выполняет fork():

python -c "import os; data='x'*200000000; os.fork(); raw_input()"

Программы типа 'top' покажут, что каждый процесс использует 200 МБ, с очень небольшим количеством памяти SHRd, поэтому кажется, что процессы используют в общей сложности 400 МБ. Однако, поскольку fork() реализует копирование при записи (COW) для страниц памяти процесса, реальность такова, что процессы используют в общей сложности только 200 МБ.

Почему top не показывает, какая часть памяти COW? Есть ли способ заставить его это сделать? Или есть другая команда, которую я могу использовать вместо этого?

Примечание: 'top' на OSX, похоже, имеет столбец RSHRD, который делает то, что я ожидал. Мой вопрос касается Linux.

решение1

Такого рода информацию можно получить из /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:Сколько памяти на самом деле используют приложения?

Я не знаю общего инструмента, похожего на top, для отображения этой информации, и не думаю, что psу него есть опции, чтобы показать это, к сожалению. Статья указывает на репозиторий со скриптами python, который называетсяpagemapМэтта Макколла, который вы можете использовать или адаптировать.

Бесстыдная реклама: вы найдете несколько постов наЮникс и Линуксо PSS и smapsфайле, если вас это интересует.

Связанный контент