Следуя из этот вопрос. Debian, если это важно.
Я понимаю, что часть памяти разделяется между разветвленными процессами. Как тогда я могу определить, сколько памяти используется процессом / набором разветвленных процессов?
Использование инструмента smem, рекомендованного в этот похожий вопрос, Я получаю такие значения:
Command Swap USS PSS RSS
/usr/sbin/spamd --create-pr 0 16820 24974 41628
spamd chil 0 19388 27581 44176
spamd chil 0 32328 40038 55708
Я понимаю столбец подкачки, а столбец RSS - это то, что обычно сообщается (например, в ps). Из прочтения документации smem кажется, что USS - это память специально для этого ребенка, а PSS - это часть памяти, совместно используемой между процессами. Однако добавление USS к PSS дает более высокие значения, чем RSS, и я думал, что совместное использование будет значить меньше (так что я, вероятно, неправильно интерпретирую).
Я не привязан к инструменту smem. Я просто хотел бы получить какой-то способ получить число «использования памяти», которое в некоторой степени точно отражает объем реальной памяти, которую использует процесс.
Пропорциональный размер набора, вероятно, лучший показатель использования памяти для каждого процесса, который у вас есть. Это уникальный размер набора + (общие страницы / количество общих процессов).
Таким образом, один процесс использовал 44176 страниц, из которых 19388 уникальных для этого процесса. Это означает, что 24788 доступны другим пользователям.
Рассмотрение PSS как USS + (общий вес). Вес в данном случае равен 8193, что соответствует доле страниц общей памяти (24788), относящихся к этому процессу. Чем больше у вас экземпляров приложения для совместного использования страниц, тем меньше вес для каждого процесса.
Вы можете суммировать PSS по нескольким процессам, и вы не будете считать общие страницы более одного раза. Однако вы не можете суммировать USS и PSS и ожидать RSS, потому что PSS уже включает USS.
Насколько я понимаю (но кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь), при ветвлении процесса используется только сегмент программы - сегменты данных становятся отдельными.
Таким образом, исполняемый файл (двоичный файл) и любые загруженные разделяемые библиотеки будут совместно использоваться процессами.
Каждый процесс получит свою собственную копию (*) любой памяти, которая была выделена до вилки, но любая память, выделенная впоследствии, будет уникальной для этого процесса.
(*) действительно умный O / S может избежать необходимости фактически выделить сегменты данных для дочерней копии с помощью копирование при записи алгоритм, так что память выделяется только в том случае, если какой-либо процесс пытается ее изменить. Видеть Вот.