Как бесплатно рассчитать используемую память? - PullRequest
3 голосов
/ 02 декабря 2009

Как free вычисляет используемую память и почему она отличается от того, что сообщает / proc?

# cat /proc/*/status | grep VmSize | awk '{sum += $2} END {print sum}'
281260

Но бесплатно говорит:

# free
             total       used       free     shared    buffers     cached
Mem:        524288     326488     197800          0          0          0

Кто прав? Используется ли память 281260 КБ или 326488 КБ?

Ответы [ 2 ]

6 голосов
/ 02 декабря 2009

Заголовок спрашивает: «Как бесплатно вычислять используемую память?»

Ответ: Он запрашивает ОС, которая должна отслеживать это, чтобы выполнить свою работу.

Более конкретно, он запрашивает подсистему управления памятью. Как отмечает sheepsimulator в комментариях, ядро ​​Linux предоставляет все виды данных, поддерживаемых ОС, в виртуальной файловой системе /proc, но каждая полнофункциональная ОС должна отслеживать данные такого рода, поэтому предоставление API для этого является небольшим вопросом. free использовать.

Вопрос задается: «Почему это отличается от суммирования VmSize, сообщаемого для всех процессов?»

Ответ: По крайней мере, здесь что-то происходит

  1. Linux обещает память программе без ее фактического распределения. Когда вы делаете char *p=new(1024
1024*sizeof(char));, ядро ​​не дает вам сразу гигабайт. Если он просто скажет «ОК» и поймет, что он схватит его, когда вы начнете его использовать. Таким образом, необходимость печально известного OOM убийца . Динамические библиотеки являются общими, и одна страница реальной памяти может быть отображена в виртуальное адресное пространство более чем одного процесса. *1024*

Кроме того, ваш проход через файловую систему proc не является атомарным.

В результате вывод free более точно отражает использование физической памяти вашей машины в данный момент.

1 голос
/ 02 декабря 2009

Результат от 'free' является более точным, чем сложение размера виртуальной памяти каждого процесса (который, в конце концов, всего лишь виртуальная память, может даже добавить больше памяти, чем физически присутствует!)

/ proc / meminfo предоставит вам больше деталей, чем 'free'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...