Назад | Перейти на главную страницу

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

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

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

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

Почему сверху не отображается, какая часть памяти занимает КОРОВА? Есть ли способ сделать это? Или я могу использовать другую команду?

Примечание. «Top» в OSX, кажется, имеет столбец RSHRD, который делает то, что я ожидал. У меня вопрос по Linux.

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

Бесстыдная вилка: вы найдете несколько сообщений на Unix и Linux о PSS и smaps файл, если вам это интересно.