Как измерить память без копирования при записи?

8

Как можно измерить общий объем памяти RSS, занятой набором (разветвленных) процессов, без двойного учета общих страниц и страниц, копируемых при записи?

Евгений Панков
источник
1
Очень интересный вопрос, +1 - это должно быть возможно при более глубоком анализе /proc/*/mapфайлов, несмотря на то, что я никогда не находил инструмент, который мог бы сделать это. Основная проблема заключается в том, что структуры данных, которым нужно следовать, намного сложнее, чем кажется. Если вы не получили хорошего ответа, возможно, вам стоит попробовать и Unix SE.
Петер - Восстановить Монику

Ответы:

4

Я написал свою собственную утилиту для этого: https://gist.github.com/Eugeny/04ccfe8accf4bc74b0ca

Я проверил его init(pid 1) для тестирования, и общее количество сообщений примерно соответствует физическому использованию оперативной памяти (согласно htop), так что я думаю, что это несколько правильно.

Пример использования:

~ » pstree -ap 15897
zsh,15897
  └─sudo,9783 make rundev
      └─make,9784 rundev
          └─sh,9785 -c cd ajenti-panel && ./ajenti-panel -v --autologin --plugins ../plugins --dev
              └─python ./ajenti,9786
                  ├─./ajenti-panel ,9834                              
                  ├─./ajenti-panel ,9795                     
                  └─{python ./ajenti},9796

~ » sudo ./memuse.py 15897
PID                 Commandline                          Frames (+unique)           VMEM
 - 15897            (/usr/bin/zsh                  ):      1776  +1776           7104 KB
  -  9783           (sudo make rundev              ):       608  +408            2432 KB
   -  9784          (make rundev                   ):       261  +98             1044 KB
    -  9785         (/bin/sh -c cd ajenti-panel && ):       166  +48              664 KB
     -  9786        (python ./ajenti-panel -v --aut):      9279  +8977          37116 KB
      -  9795       (./ajenti-panel worker [restric):      7637  +1334          30548 KB
      -  9834       (./ajenti-panel worker [session):      8972  +2639          35888 KB
----------------------------------------------------------------------------------------
TOTAL:                                                    15280                 61120 KB
Евгений Панков
источник
2

Нет какого-либо четко определенного способа определения в каком-либо инструменте, который я знаю, каких процессов совместно использовать какие карты, без перебора всех отображений и сравнения адресов.

Тем не менее, Linux предлагает разумную оценку, известную как размер пропорционального набора . Об этом сообщается в / proc / [pid]> / maps.

Это значение представляет собой размер отображения, деленный на число дочерних / родительских процессов с одним и тем же открытым отображением.

Таким образом, с программой, в которой открыто отображение 1 МБ, плюс 1 МБ, совместно используемое с 4 другими процессами, размер пропорционального набора составляет 1 МБ + (1 МБ / 4) или 1,250 МБ. RSS в этом случае будет 2MiB.

Существует патч для htop, который использует PSS для вычисления «правильной оценки» фактической используемой памяти.

Мэтью Ифе
источник