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