Як виміряти в Linux пікову пам'ять програми після закінчення


11

Як виміряти пікову пам'ять програми, що працює в Linux?

Я запускаю цю програму пакетно, тому не можу використовувати RSS, оскільки вона повідомляє про поточну пам'ять. Мені потрібна пікова пам'ять, про яку раніше повідомлялася програма.

VmPeak також не є рішенням, оскільки він повідомляє про виділену пам'ять, а також не обчислює з реального Ram, а також з жорсткого диска.


На якій ОС ви запускаєте додаток?
CVn

Я працюю в Linux
des_user

Ця тема повинна вам допомогти: serverfault.com/questions/387268/…
Jacob Coleman

Відповіді:


13

Ось два способи відстеження пікового використання пам'яті процесів.

Сироп

Я не використовував цей інструмент, але це схоже на те, що ви шукаєте. Це називається Syrupy .

Опис

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

Список літератури


3

Незважаючи на те, що тема досить стара, я хочу поділитися ще одним проектом, який з’явився з функції ядра cgroups Linux.

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

cgmemtime вимірює багатоводневу пам'ять RSS + CACHE для процесу та його нащадків.

Щоб мати змогу зробити це, він ставить процес у власну групу.

Наприклад, процес A виділяє 10 MiB і роздвоює дитину B, яка виділяє 20 MiB, і роздвоює дочку C, яка виділяє 30 MiB. Усі три процеси поділяють часове вікно, коли їх розподіл призводить до відповідного використання пам'яті 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.
Влад Фролов

Дякую, але моя думка стосувалася більше вашої відповіді. На даний момент він не відповідає на питання, лише вказує на якийсь зовнішній ресурс, який може бути в змозі. Крім того, ви опублікували таку саму відповідь в іншому місці, що піднімає автоматичний прапор. Будь ласка, відредагуйте свою відповідь та включіть приклад, який показує, як ця програма може робити те, що вимагає ОП.
тердон

2
@terdon Так, я! Тому що я шукав одне і те ж питання, і питання майже однакові, а відповіді однакові: "розбір PS виведення", який божевільний! Я витратив тиждень, перш ніж випадково натрапив на проект cgmemtime, який є ідеальною відповідністю для всіх тих питань, які я коментував!
Влад Фролов

1
Справедливо. Було б просто чудово, якби ви могли навести приклад того, як це можна використовувати. Це покращило б вашу відповідь. У будь-якому випадку, дякую, що знайшли час, щоб опублікувати це, я впевнений, що інші знайдуть це корисним.
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.