Як виміряти в 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.