Вимірювання використання оперативної пам'яті програми


46

time - це геніальна команда, якщо ви хочете розібратися, скільки часу займає процесор для даної команди.

Я шукаю щось подібне, яке може виміряти максимальне використання оперативної пам'яті програми та будь-яких дітей. Переважно він повинен розрізняти виділену пам'ять, яка була використана, і невикористану. Можливо, це навіть може дати медіану використання пам'яті (тому використання пам’яті слід очікувати при тривалому запуску).

Тому я хотів би зробити:

rammeassure my_program my_args

і отримати вихід, подібний до:

Max memory allocated: 10233303 Bytes
Max memory used: 7233303 Bytes
Median memory allocation: 5233303 Bytes

Я подивився на memusg https://gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82, але вважаю це дещо злом.

Відповіді:


24

Ви можете використовувати timeime для вимірювання використання високогірної пам'яті (RSS та віртуальної) процесу.

Наприклад:

$ tstime date       
Tue Aug 16 21:35:02 CEST 2011

Exit status: 0

pid: 31169 (date) started: Tue Aug 16 21:35:02 2011
        real   0.017 s, user   0.000 s, sys   0.000s
        rss      888 kb, vm     9764 kb

Він також підтримує більш простий для розбору вихідний режим ( -t).


Мені це подобається. Це навіть зробила Права з./tstime -t bash -c 'perl -e "\$a=\"x\"x100000000;\$b=\$a.\$a;\$b=\"\";\$a=\"\";sleep 10;"'
Оле Танге

3
"Використання оперативної пам'яті процесом" не є чітко визначеним значенням. Якщо є кілька примірників запущеної однієї програми, вони поділяють виконуваний файл. Більшість програм поділяють glibc(та інші бібліотеки, що їх асоціюють, їх щось називають "спільними"). Багато демонів завантажують конфігурацію в пам'ять і вилки (2) дітей, які потім діляться даними конфігурації. Потім є дані в буферах для читання / запису, якими керує ядро. А потім є сервіси, які є стадом слабко пов'язаних процесів (подумайте про робоче середовище та всі його аплети та фонові матеріали).
фонбранд

@vonbrand, як Linux-ядро обчислює значення RSS / VSS, добре визначено.
maxschlepzig

@maxschlepzig, він цілком може обчислити деякі випадкові значення, це не означає, що вони означають те, що ви думаєте, що вони означають: Набір резидентів - це лише сторінки в адресному просторі процесу, які наразі знаходяться в пам'яті. Це не "пам'ять, яка використовується цим процесом", вона включає в себе все, що вона обмінюється.
фонбранд

@vonbrand У більшості випадків використання вимірювання обсягу використання пам'яті процесу потрібно заміряти невідомі анонімні сторінки, що має бути дуже передбачуваним з тим самим входом.
Володимир Пантелеев

28

timeє вбудованою вашою оболонкою. Якщо вам подобається, timeале вам потрібна додаткова інформація, спробуйте GNU timeв режимі багатослівної ( -v)

/usr/bin/time -v sleep 5               
    Command being timed: "sleep 5"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.00
    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): 2144
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 179
    Voluntary context switches: 2
    Involuntary context switches: 1
    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

Шукайте пакет "час" або "gnutime" у своєму менеджері пакунків.


3
Зауважте, що деякі відомості, повідомлені часом GNU, можуть бути неточними. Напр. Під Ubuntu 10.04: На сторінці чоловіка зазначено, що "Номери такі ж хороші, як і ті, які повернув wait3 (2)" Тобто wait3заповнює структуру, описану в getrusage(2): "Не всі поля мають сенс для Linux. [..] '.
maxschlepzig

4
Наприклад, на тестову програму, яка точно виділяє 10 МБ (і торкається кожної сторінки) - час GNU повідомляє про maxRSS в 42608 KiB - і tstimeповідомляє 10652 KiB. Знову під Ubuntu 10.04.
maxschlepzig

Я б любив, якби це було просто. На моїй машині Ubuntu я пробував: /usr/bin/time -v perl -e '$a="x"x100000000;$b=$a.$a;sleep 10;'. top каже, що це займає близько 570 МБ, але час - 2,3 ГБ. На практиці це число для мене не використовується.
Оле Танге

Коефіцієнт 4 фіксується в часі ВНУ 1,7 і, таким чином, працює як очікувалося.
Оле Танге

Важлива примітка: "Максимальний розмір резидентного набору" працює лише з Linux 2.6.32.
Ян Худек

17

Можливо, надмірність, але я щойно виявив, що valgrindмає чудовий інструмент на ім’я massif. Я перевірив це на xterm:

valgrind --trace-children=yes --tool=massif xterm
ms_print massif.out.* | less

І ви отримуєте хороший графік використання пам'яті:

    MB
4.230^                     #                    :::::::  :::      @@:     ::: 
     |   @                 #:::@::@@:::::@::::::: :: : ::: :::::::@ ::::::: ::
     |   @               ::#:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::::@@:::::::::: #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
   0 +----------------------------------------------------------------------->Mi
     0                                                                   292.4

разом із надмірно детальною інформацією про використання пам'яті. Деталі в посібнику з вальгринда .

Програми будуть працювати приблизно в 20 разів повільніше. Також я запустив кілька команд всередині xterm. Їх слід пам’яті було враховано, оскільки --trace-children=yesваріант є!


1
Штраф за швидкість 20 разів робить його неприйнятним для моєї ситуації. Інакше дуже гарний графік!
Оле Танге

1
Так виглядає, щонайменше, у версії 3.8.1 valgrind, яку я використовую, булеви приймаються лише у формі "так / ні", а не "правда / неправда". Мої скаржилися! :-)
MakisH

6

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

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

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

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

Наприклад, процес A виділяє 10 MiB і роздвоює дитину B, яка виділяє 20 MiB, і роздвоює дочку C, яка виділяє 30 MiB. Усі три процеси поділяють часове вікно, коли їх розподіл призводить до відповідного використання пам'яті RSS (резидентний набір).

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

Відповідь: 60 МіБ

cgmemtime - це інструмент для відповіді на такі запитання.


3

Схоже, tstime більше не працює під не-root під Linux> = 3.0. Ось утиліта для опитування, яку я написав, щоб зламати проблему: https://github.com/jhclark/memusg/blob/master/memusg


/usr/bin/time -vдає правильний вихід у новіших версіях. У старих версіях просто потрібно розділити на 4, щоб отримати правильну суму.
Оле Танге

Однак, я не думаю, що час -v підтримує максимальний розмір vmemory (лише RSS). Хтось може підтвердити це в останній версії?
jhclark
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.