Как измерить в Linux пиковую память приложения после того, как она закончилась

11

Как измерить пиковую память приложения, работающего в Linux?

Я запускаю это приложение в пакетном режиме, поэтому я не могу использовать RSS, так как он сообщает о текущей памяти. Мне нужна максимальная память, о которой приложение сообщало в конце.

VmPeak также не является решением, поскольку он сообщает о выделенной памяти, а также рассчитывает не по реальному ОЗУ, а также по жесткому диску.

des_user
источник
На какой ОС вы запускаете приложение?
CVn
Я работаю над Linux
des_user
Эта ветка должна быть вам полезна
Джейкоб Коулман

Ответы:

13

Вот 2 метода для отслеживания пикового использования памяти процессами.

липкий

Я не использовал этот инструмент, но он звучит как то, что вы ищете. Это называется сиропы .

Описание

Syrupy - это сценарий Python, который регулярно делает снимки памяти и загрузки ЦП одного или нескольких запущенных процессов, чтобы динамически формировать профиль использования ими системных ресурсов.

пример

$ syrupy.py myprog

  PID DATE        TIME     ELAPSED  CPU   MEM    RSS   VSIZE
14634 2008-10-10  20:45:25   00:00  0.0   0.0   2996    6680
14634 2008-10-10  20:45:26   00:01  105   0.2   7804   12592
14634 2008-10-10  20:45:27   00:02  103   0.2   8996   13776
14634 2008-10-10  20:45:28   00:03  103   0.2  10468   15348
14634 2008-10-10  20:45:29   00:04  103   0.3  11412   16396
14634 2008-10-10  20:45:30   00:05  104   0.3  12492   17444

/usr/bin/time -v

Да, как ни странно, команда времени GNU может дать вам пиковое использование памяти процессом. Он сообщает пиковую память так: Maximum resident set size (kbytes).

пример

$ /usr/bin/time -v ~/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000
...

    Command being timed: "/home/saml/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000"
    User time (seconds): 1.12
    System time (seconds): 0.05
    Percent of CPU this job got: 54%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.19
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 79304
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 20014
    Voluntary context switches: 83
    Involuntary context switches: 274
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Ссылки

SLM
источник
3

Несмотря на то, что тема довольно старая, я хочу поделиться другим проектом, появившимся в ядре Linux cgroups.

https://github.com/gsauthof/cgmemtime :

cgmemtime измеряет интенсивное использование памяти RSS + CACHE для процесса и его дочерних процессов.

Чтобы иметь возможность сделать это, он помещает процесс в свою собственную группу.

Например, процесс A выделяет 10 МБ и разветвляет дочерний элемент B, который выделяет 20 МБ, и разветвляет дочерний элемент C, который выделяет 30 МБ. Все три процесса совместно используют временное окно, в котором их выделения приводят к соответствующему использованию памяти RSS (резидентного набора).

Теперь возникает вопрос: сколько памяти фактически используется в результате запуска A?

Ответ: 60 МиБ

cgmemtime - это инструмент для ответа на такие вопросы.

Примеры использования будут:

$ sudo ./cgmemtime --setup -g <myusergroup> --perm 775

$ ./cgmemtime ./testa x 10 20 30
Parent PID is 27189
Allocating 10 MiBs
New Child: 27193
Allocating 20 MiBs
New Child: 27194
Allocating 30 MiBs
Child user:    0.000 s
Child sys :    0.005 s
Child wall:    6.006 s
Child high-water RSS                    :      11648 KiB
Recursive and acc. high-water RSS+CACHE :      61840 KiB

$ ./cgmemtime python -c 'print range(100000)[48517]'
48517
Child user:    0.014 s
Child sys :    0.014 s
Child wall:    0.029 s
Child high-water RSS                    :       9948 KiB
Recursive and acc. high-water RSS+CACHE :       5724 KiB
Влад Фролов
источник
Итак, как можно использовать этот инструмент для сообщения о пиковой загрузке ОЗУ программы после ее выхода ?
Тердон
@terdon Используется wait4для отлова выхода из процесса в комбинации с cgroups ( memory.max_usage_in_bytes), что, кажется, имеет смысл. Более подробная информация доступна в README на github.
Влад Фролов
Спасибо, но моя точка зрения была больше о вашем ответе. В его нынешнем виде он не отвечает на вопрос, а лишь указывает на какой-то внешний ресурс, который может это сделать. Кроме того, вы отправили точно такой же ответ в другом месте, который поднимает автоматический флаг. Пожалуйста, отредактируйте свой ответ и включите пример, показывающий, как эта программа может делать то, что просит OP.
Terdon
2
@terdon Да, я сделал! Потому что я искал один и тот же вопрос, и вопросы в значительной степени совпадают, и ответы все те же: 'parse ps output', что безумие! Я провел неделю, прежде чем случайно наткнулся на проект cgmemtime, который идеально подходит для всех тех вопросов, которые я прокомментировал!
Влад Фролов
1
Справедливо. Было бы замечательно, если бы вы могли привести пример того, как это можно использовать. Это улучшит ваш ответ. В любом случае, спасибо, что нашли время опубликовать это, я уверен, что другие найдут это полезным.
Тердон