Мне нужен сценарий оболочки, который получит максимальное потребление памяти исполняемым файлом Linux. Исполняемый файл может порождать дочерние процессы, используя значительные объемы ОЗУ, которые должны быть включены в общий объем.
я пробовал /usr/bin/time -f "%M" /path/to/executable
, но это всегда дает 0
хотя используя ps
Я могу убедиться, что процесс действительно потребляет значительное количество оперативной памяти.
Почему time
давая мне 0
все время, и как мне получить номер, который я ищу?
думаю time -f %M
работает только в последних ядрах Linux (экспериментально не поддерживается в 2.6.26 / amd64 и поддерживается в 2.6.32 / i386).
Предыдущий тред на Stack Overflow не нашлось много.
Без поддержки ядра контролировать использование памяти довольно сложно. Есть несколько способов сделать это:
LD_PRELOAD
небольшая библиотека, которая перегружает mmap
, sbrk
и другие системные вызовы, выделяющие память (при условии, что вы не запускаете статические двоичные файлы).ptrace
процессы действительно наблюдают за распределением памяти и ее разветвлением./proc/
(работает только для одного процесса, и вы не знаете, что происходит между мерами).Все эти способы требуют некоторого программирования; Я не знаю ни одного существующего инструмента.
Я рекомендую использовать https://github.com/gsauthof/cgmemtime.
cgmemtime измеряет интенсивное использование памяти RSS + CACHE процессом и его дочерними процессами.
Для этого он помещает процесс в свою собственную контрольную группу.
Например, процесс A выделяет 10 МБ и разветвляет дочерний элемент B, который выделяет 20 МБ, и который разветвляет дочерний элемент C, который выделяет 30 МБ. Все три процесса разделяют временное окно, в котором их распределение приводит к соответствующему использованию памяти RSS (размер резидентного набора).
Теперь возникает вопрос: сколько памяти фактически используется в результате выполнения A?
Ответ: 60 МБ
cgmemtime - инструмент, чтобы ответить на такие вопросы.
pmap
показывает всю память, выделенную процессу, и даже дает вам общее количество. Обнаружить дочерние процессы сложнее, возможно, вы можете объединить его с strace
но я не могу придумать простой способ сделать это.
Команду ps можно использовать для измерения объема памяти, используемой каждым процессом.
% MEM показывает процент физической памяти, используемой процессом. Хотя это не всегда полная картина, он может идентифицировать процессы, которые отвечают за подкачку и подкачку системы.
SZ показывает приблизительный виртуальный размер процесса.
RSS - это размер резидентного набора и фактический объем памяти, который процесс использовал при запуске ps.
Проверьте свои человек пс страницу с вариантами для перечисления деревьев процессов.