
Допустим, у меня есть процесс, использующий 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
файле, если вас это интересует.