Чрезвычайно сложно понять, что такое «использование памяти» процессом.Размер ВМ и RSS являются известными измеримыми значениями.
Но то, что вы, вероятно, хотите, это что-то еще.На практике «размер виртуальной машины» кажется слишком высоким, а RSS часто кажется слишком низким.
Основные проблемы:
- Несколько процессов могут совместно использовать одни и те же страницы.Вы можете добавить RSS всех запущенных процессов и получить гораздо больше, чем физическая память вашего компьютера (это до подсчета структур данных ядра)
- Частные страницы, принадлежащие процессу, могут быть заменены,Или они еще не инициализированы.Они рассчитывают?
- Как именно вы подсчитываете отображенные в памяти файловые страницы?Грязные?Чистые?MAP_SHARED или MAP_PRIVATE?
Так что вам действительно нужно подумать о том, что считать "использованием памяти".
Мне кажется, что логически:
- Личные страницы, которые не используются другими процессами (примечание: частные страницы могут все-таки копироваться при записи!), Должны учитываться, даже если выгружены
- Общие страницы должны учитываться, деленные на количество процессов, которые они 'например, общий доступ к странице, используемой двумя процессами, составляет половину
- Резидентные страницы с файловой поддержкой могут считаться таким же образом
- Нерезидентные страницы с файловой поддержкой можно игнорировать
- Если одна и та же страница отображается более одного раза в адресное пространство одного и того же процесса, ее можно игнорировать во 2-й и последующий раз.Это означает, что если в proc 1 дважды сопоставлена страница X, а в proc 2 однажды отображена страница X, то они оба «заряжены» на половину страницы.
Я не знаю ни одной утилиты, которая делаетэтот.Хотя это кажется нетривиальным и включает (по крайней мере) чтение / proc / pid / pagemap и, возможно, некоторые другие интерфейсы / proc, некоторые из которых предназначены только для root.