
Я запускаю несколько программ на *nix внутри контейнера и пытаюсь точно рассчитать объем оперативной памяти, используемый моим процессом. Насколько я понимаю, эта информация должна быть под /proc/#{pid}/smaps
. Я пробовал суммировать все PSS всех smaps
файлов в системе с помощью этого скрипта Ruby:https://gist.github.com/schneems/10025798
Однако я вижу, что использование памяти сообщается ниже, чем сообщает мой контейнер. Если я переключаюсь на использование RSS, то значение становится намного выше (гораздо выше того, что сообщает мой контейнер). Я почти уверен, что вся необходимая мне информация доступна в /proc
, я просто не знаю, как она сообщается, чтобы получить точное измерение. Мой вопрос заключается в следующем: какие значения в мне smaps
следует суммировать, поскольку PSS сам по себе не является хорошим индикатором? Есть ли лучший или более точный способ получить эту информацию из машины Linux?
решение1
RSS — это размер резидентного набора, другими словами, глобальная память, используемая процессом, включая каждую загруженную во время выполнения библиотеку. Одна библиотека может использоваться несколько раз (например, представьте себе разветвления процессов Apache, каждый подпроцесс может использовать одни и те же библиотеки). Согласно модели виртуальной памяти, каждый процесс видит эту память как используемую им самим. В действительности ядро сопоставляет адреса виртуальной памяти с уникальным адресом памяти библиотеки.
С другой стороны, PSS суммирует каждый USS (Unshared set size) для процесса. Подумайте об этом как о памяти, которую процесс немедленно освободит, если мы его убьём. Он не учитывает общую память, а только память, которую процесс использует уникально.
Как следствие, значение RSS переоценивает эффективную используемую память. PSS более точен, если вы обязательно учитываете размер памяти загруженных библиотек.
Подробнеездесь, особенно в последнем абзаце.