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

8

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

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

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

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

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

Дастин Босвелл
источник

Ответы:

5

Вы можете получить такую ​​информацию из /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-скриптами, которое называется pagemapMatt Mackall, которое вы можете использовать или адаптировать.

Бесстыдный плагин: вы найдете несколько постов в Unix & Linux о PSS и smapsфайле, если вы заинтересованы в этом.

Мат
источник