Назад | Перейти на главную страницу

«Используемая» память в верхней части больше, чем размер VmSize всех процессов, перечисленных в / proc /?

Раньше я понимал, что определение «использования» памяти в top - это количество физических страниц, отображаемых на какие-либо процессы. Однако недавно я увидел то, что заставило меня думать иначе. Я действительно хочу, чтобы кто-нибудь объяснил.

В качестве примера того, что я ожидал, учитывая мое старое понимание, приведенный ниже общий размер vmsize из / proc / почти в три раза больше, чем «используемый» в верхнем (89916452KB, 32787948KB). Некоторые страницы отображаются более чем на один процесс, некоторые страницы отображаются на диск (и поэтому не должны учитываться сверху) и т. Д.

$ grep VmSize /proc/*/status | awk '{total += $2} END{print total}'
89916452
$ top
top - 09:39:34 up 5 days,  7:37,  9 users,  load average: 4.89, 4.14, 3.92
Tasks: 242 total,   2 running, 239 sleeping,   0 stopped,   1 zombie
Cpu(s): 69.0%us,  0.5%sy,  0.0%ni, 30.3%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:  32961916k total, 32787948k used,   173968k free,   248132k buffers
Swap: 16777208k total,  1584300k used, 15192908k free,  7659572k cached

Однако недавно я наткнулся на следующее. Общий размер vmsize меньше почти в 4 раза! Как такое могло быть? Даже если бы кто-то утверждал, что страницы ядра, отображаемые в каждый процесс, не учитываются в записи VmSize в / proc / * / status, все равно было бы сложно привести аргумент, что они учитывают любую значительную часть ~ 46 ГБ в использовании.

$ grep VmSize /proc/*/status | awk '{total += $2} END{print total}'
8519308
$ top
top - 09:43:55 up 291 days, 15:16,  8 users,  load average: 1.02, 1.08, 1.08
Tasks: 291 total,   1 running, 290 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  49324520k total, 46017056k used,  3307464k free,  5448168k buffers
Swap:  8388600k total,      228k used,  8388372k free, 36486236k cached

Пожалуйста, объясни.

topЧисло «Использовано» включает кеш файловой системы. Чтобы получить фактическое использование процесса, вам нужно будет вычесть 36486236k cached из 46017056k used. Не уверен, учитываются ли буферы в каждом процессе status файл, но вам, возможно, придется их вычесть.

В free команда показывает это со строкой «- / + buffers / cache:», показывая, что на самом деле «используется» и «бесплатно», когда вы их исключаете.