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

Как определить объем памяти, используемый разветвленным процессом (Linux)?

Следуя из этот вопрос. 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 может избежать необходимости фактически выделить сегменты данных для дочерней копии с помощью копирование при записи алгоритм, так что память выделяется только в том случае, если какой-либо процесс пытается ее изменить. Видеть Вот.