Расчет памяти процесса с использованием файловой системы Proc - PullRequest
1 голос
/ 25 ноября 2011

Я пишу небольшой скрипт монитора процессов на Perl, считывая значения из файловой системы Proc.Сейчас я могу выбрать количество потоков, состояние процесса, количество прочитанных и записанных байтов, используя / proc / [pid] / status и / proc / [pid] / io файлы.Теперь я хочу рассчитать использование памяти процессом.После поиска я узнал, что будет использоваться память / proc / [pid] / statm .Но я до сих пор не могу понять, какие поля необходимы из этого файла для расчета использования памяти.Может ли кто-нибудь помочь мне в этом?Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 26 ноября 2011

Чрезвычайно сложно понять, что такое «использование памяти» процессом.Размер ВМ и RSS являются известными измеримыми значениями.

Но то, что вы, вероятно, хотите, это что-то еще.На практике «размер виртуальной машины» кажется слишком высоким, а RSS часто кажется слишком низким.

Основные проблемы:

  • Несколько процессов могут совместно использовать одни и те же страницы.Вы можете добавить RSS всех запущенных процессов и получить гораздо больше, чем физическая память вашего компьютера (это до подсчета структур данных ядра)
  • Частные страницы, принадлежащие процессу, могут быть заменены,Или они еще не инициализированы.Они рассчитывают?
  • Как именно вы подсчитываете отображенные в памяти файловые страницы?Грязные?Чистые?MAP_SHARED или MAP_PRIVATE?

Так что вам действительно нужно подумать о том, что считать "использованием памяти".

Мне кажется, что логически:

  • Личные страницы, которые не используются другими процессами (примечание: частные страницы могут все-таки копироваться при записи!), Должны учитываться, даже если выгружены
  • Общие страницы должны учитываться, деленные на количество процессов, которые они 'например, общий доступ к странице, используемой двумя процессами, составляет половину
  • Резидентные страницы с файловой поддержкой могут считаться таким же образом
  • Нерезидентные страницы с файловой поддержкой можно игнорировать
  • Если одна и та же страница отображается более одного раза в адресное пространство одного и того же процесса, ее можно игнорировать во 2-й и последующий раз.Это означает, что если в proc 1 дважды сопоставлена ​​страница X, а в proc 2 однажды отображена страница X, то они оба «заряжены» на половину страницы.

Я не знаю ни одной утилиты, которая делаетэтот.Хотя это кажется нетривиальным и включает (по крайней мере) чтение / proc / pid / pagemap и, возможно, некоторые другие интерфейсы / proc, некоторые из которых предназначены только для root.

2 голосов
/ 25 ноября 2011

Вы, вероятно, хотите resident или size.From kernel.org .

  • размер общий размер программы
    • Это вся программа, включая все, что никогда не менялось в
  • размер резидентного резидентного набора
    • В данный момент в оперативной памяти (не включая выгруженные страницы)
1 голос
/ 25 ноября 2011

Другая (менее простая, но более точная) возможность - это анализ файла /proc/123/maps, возможно, с помощью утилиты pmap. Он дает вам информацию о «виртуальной памяти» (то есть адресном пространстве процесса).

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