Пік використання пам'яті процесу linux / unix


376

Чи є інструмент, який буде запускати командний рядок і повідомляти про загальне пікове використання оперативної пам'яті?

Я уявляю щось аналогічне / usr / bin / time

Відповіді:


28

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

grep VmPeak /proc/$PID/status

(замініть $PIDPID процесу, який вас цікавить)


4
Що робити, якщо я не знаю PID? Наприклад, у випадку, коли програма запускається невеликий проміжок часу (<1s)
— diralik

4
"VmHWM: Піковий розмір резидента" може бути більш корисним для вимірювання використання оперативної пам'яті (замість VmPeak, який включає також багато інших речей).
— jfs

@jfs це дійсно залежить від того, що ти хочеш дізнатися. IIRC VmPeak - це максимальне загальне використання пам'яті, включаючи віртуальну пам'ять, тоді як VmHWM - пікове використання оперативної пам'яті. Отже, якщо ви хочете дізнатися загальний об'єм пам'яті, яку просила ваша програма, використовуйте VmPeak; якщо ви хочете дізнатися, скільки фактичної оперативної пам’яті вона коли-небудь використовувала в даний момент часу, використовуйте VmHWM.
— erobertc

1
@diralik, якщо ви перевіряєте програму, написану власноруч, ви можете вставити рядок коду, щоб переглянути у файл "/ proc / self / status".
— Fileland

404

[ Редагувати : Працює на Ubuntu 14.04:/usr/bin/time -v command обов'язково використовуйте повний шлях.]

Схоже /usr/bin/time, ви даєте цю інформацію, якщо проходите -v(це на Ubuntu 8.10). Дивіться, наприклад,Maximum resident set size нижче:

$ / usr / bin / час -v ls /
….
        Тимчасові команди: "ls /"
        Час користувача (секунди): 0,00
        Системний час (секунди): 0,01
        Процент процесора отримав цю роботу: 250%
        Час, що минув (настінний годинник) (год: мм: сс або м: сс): 0: 00,00
        Середній розмір спільного тексту (кбайт): 0
        Середній розмір даних без спільного використання (кбайт): 0
        Середній розмір стека (кбайт): 0
        Середній загальний розмір (кбайт): 0
        Максимальний розмір набору резидентів (кбайт): 0
        Середній розмір набору резидентів (кбайт): 0
        Основні (вимагають вводу / виводу) помилки сторінки: 0
        Незначні помилки (повернення кадру) на сторінці: 315
        Добровільні контекстні перемикачі: 2
        Мимовільні контекстні перемикачі: 0
        Обміни: 0
        Вхід файлової системи: 0
        Виходи файлової системи: 0
        Надіслані повідомлення з розеткою: 0
        Отримано повідомлення про розетку: 0
        Поставлені сигнали: 0
        Розмір сторінки (байти): 4096
        Стан виходу: 0

4
Ймовірно, це завжди повертає 0, тому що ls не робить багато. Спробуйте більш інтенсивну команду процесора.
— Джон Ерісон

17
На головній сторінці: Більшість відомостей, показаних часом, виходить із системного виклику wait3 (2). Цифри такі ж хороші, як і ті, які повернув wait3 (2). У системах, у яких немає виклику wait3 (2), який повертає інформацію про стан, замість цього використовується системний виклик time (2). Однак він надає набагато менше інформації, ніж wait3 (2), тому в цих системах час звітує більшість ресурсів як нуль.
— лотхар

79
"bash: -v: команда не знайдена" означає, що bash перехоплює час для використання свого. /bin/time -vвирішує це.
— gcb

3
Варто було б зробити швидку перевірку, щоб переконатися, що вихід має сенс. Gnu time має помилку, де він повідомляє про фактичне використання пам'яті в 4 рази: stackoverflow.com/questions/10035232/…
— Ян

24
@skalee Спробуйте time -lна MacOS, дає подібний вихід.
— Волкер Столц

96

(Це вже відповів, старе запитання .. але тільки для запису :)

Мене надихнуло сценарій Ян і придумав цей невеличкий інструмент, названий memusg . Я просто збільшив частоту вибірки до 0,1, щоб обробити багато коротких життєвих процесів. Замість моніторингу єдиного процесу я змусив його виміряти rss суму групи процесів. (Так, я пишу багато окремих програм, які працюють разом). Зараз він працює на Mac OS X та Linux. Використання повинно бути подібним до використання time:

memusg ls -alR /> / dev / null

Він показує лише пік на даний момент, але мене цікавлять невеликі розширення для запису інших (грубих) ​​статистичних даних.

Добре мати такий простий інструмент для простого огляду, перш ніж розпочати будь-яке серйозне профілювання.


1
все, що все ще використовує PS і лише добре визначити спостережувану верхню пам'ять. не справжня верхня пам'ять. ви завжди можете пропустити щось між одним і іншим інтервалом.
— gcb

6
Які одиниці для виводу сценарію memusg? Байти? Кілобайти?
— Деніел Даніель

1
@DanielStandage: ймовірно, в кілобайт. Він просто спостерігає за значеннями, показаними, ps -o rss=де rss - це реальна пам'ять (резидентний набір) розміру процесу (у 1024 байтових одиницях) з моєї сторінки BSD man.
— netj

3
@gcb Так що, це ви отримуєте, коли вимірюєте зразки.
— Volker Stolz

2
Здається, посилання на memusg, дане у відповіді, порушено. У будь-якому випадку / usr / bin / time робить це дуже добре.
— Том Корнебіз

65

Вальдрінд однолінійний:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

Зверніть увагу на використання --pages-as-heap для вимірювання всієї пам'яті в процесі. Більше інформації тут: http://valgrind.org/docs/manual/ms-manual.html


14
time, Я покидаю тебе.
— jbeard4

1
Зручний сценарій, але мені потрібно сортувати -g у моїй системі Slackware (я припускаю, що ви шукаєте найвище значення).
— Нік Коулман

3
+1 для valgrind --massif. Ви також можете використовувати ms_printінструмент, який постачається з ним, для зручного виведення даних (включаючи графіки використання ascii з часом)
— Елі Бендерський

7
Масив має набагато більші накладні витрати, ніж timeхоча, забираючи принаймні 10 разів більше часу на таку команду ls.
— Тимофій Гу

8
Це дійсно занадто масово. У цій відповіді слід згадати про уповільнення. Команда, яку я хочу виміряти, зазвичай займає 35 секунд. Я запустив цю команду valgrind, щоб її виміряти більше півгодини тому, і вона досі не завершена…
— Унагі

35

У Linux:

Використовуйте /usr/bin/time -v <program> <args>та шукайте " Максимальний розмір резидента ".

(Не плутати з timeвбудованою командою Bash ! Тому використовуйте повний шлях , /usr/bin/time)

Наприклад:

> /usr/bin/time -v ./myapp
        User time (seconds): 0.00
        . . .
        Maximum resident set size (kbytes): 2792
        . . .

На BSD, MacOS:

Використовуйте /usr/bin/time -l <program> <args>, шукаючи " максимальний розмір набору резидентів ":

>/usr/bin/time -l ./myapp
        0.01 real         0.00 user         0.00 sys
      1440  maximum resident set size
      . . .

sudo apt-get install time
— Рольф

2
Невже це питання вже не охоплене відповіддю, доданим за два роки до цього ?
— Чарльз Даффі

34

Можливо, (гну) час (1) вже робить те, що ви хочете. Наприклад:

$ /usr/bin/time -f "%P %M" command
43% 821248

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


Здається, я завжди отримую нулі з цим, навіть для великих команд
— jes5199

Я отримую змінні результати, як-то 400% 0 і 0% 0 в тій же програмі .. можливо, це слід запускати на більші періоди часу, щоб бути точним?
— Ліран Ореві

Я не знаю, що запропонувати. Код вище - це саме те, що я запустив команду латексу, яка трапилася в історії. Як я кажу, більш точні результати можна отримати за допомогою інших інструментів.
— Джон Еріксон

2
Це працює принаймні у системах CentOS (і, таким чином, я думаю, також RHEL). % P надає незв'язану статистику (% CPU), яка залежить від планувальника і, таким чином, досить мінлива.
— Blaisorblade

2
@Deleteman: timeце вбудована команда при використанні csh. Якщо ви використовуєте точний шлях, це дозволить запустити зовнішню команду. Наскільки мені відомо, лише версія GNU підтримує опцію формату.
— Джон Еріксон

18

/ usr / bin / час, можливо, робить те, що ти хочеш, насправді. Щось на зразок.

 / usr / bin / time --format = '(% Xtext +% Дані% Mmax)'

Детальніше дивіться у часі (1) ...


1
Здається, я завжди отримую нулі з цього приводу навіть для великих команд
— jes5199

jes5199, Liran, дивлячись на вищезазначені коментарі, здається, що час (1) може бути зламаний для повідомлення про пам'ять про деякі Linux ...
— simon

У Ubuntu 16.04 текст і дані дорівнюють нулю, але max не дорівнює нулю і дає значущі значення. Я задоволений цим.
— Стефан Гурішон

Я сподіваюся, що Mmax означає те, що ми хочемо, щоб це означало .... сторінка man трохи коротко про це
— matanster

17

У MacOS Sierra використовуйте:

/usr/bin/time -l commandToMeasure

Ви можете використовувати, grepщоб взяти те, що ви хочете, можливо.


5
Це! Я буквально витратив годину, намагаючись отримати Instruments.app та dtrace, щоб надати мені профіль пам'яті з увімкненою цілісністю системи (не можу вимкнути її), в той час як все, що мені було потрібно, була лише ця проста команда. Невелика примітка, яку ви можете використовувати command time -lзамість /usr/bin/time -lякої, ваша оболонка насправді викликає двійковий виклик timeзамість вбудованої функції. (Так, commandце не заповнювач місця, command timeвідрізняється від просто time.)
— Якуб Арнольд,

16

Якщо процес працює щонайменше пару секунд, ви можете скористатися наступним скриптом bash, який запустить заданий командний рядок, після чого надрукуйте для stderr пікового RSS (замініть rssбудь-який інший атрибут, який вас цікавить). Він дещо легкий, і він працює для мене з psвключеним в Ubuntu 9.04 (про що я не можу сказати time).

#!/usr/bin/env bash
"$@" & # Run the given command line in the background.
pid=$! peak=0
while true; do
  sleep 1
  sample="$(ps -o rss= $pid 2> /dev/null)" || break
  let peak='sample > peak ? sample : peak'
done
echo "Peak: $peak" 1>&2

1
Основним недоліком цього методу є те, що якщо процес виділяє багато пам'яті протягом короткого періоду (наприклад, наприкінці), це може бути не виявлено. Скорочення часу сну може трохи допомогти.
— vinc17


8

Добре, якщо ви дійсно хочете показати пік пам’яті та ще деякі поглиблені статистичні дані, рекомендую скористатися профілером, таким як valgrind . Гарний вальгринд передній частині - алейоп .



5

Ось (на основі інших відповідей) дуже простий сценарій, який спостерігає за вже запущеним процесом. Ви просто запускаєте його з pid процесу, який ви хочете розглядати як аргумент:

#!/usr/bin/env bash

pid=$1

while ps $pid >/dev/null
do
    ps -o vsz= ${pid}
    sleep 1
done | sort -n | tail -n1

Приклад використання:

max_mem_usage.sh 23423


1

Heaptrack - це інструмент KDE, який має графічний інтерфейс та текстовий інтерфейс. Я вважаю його більш підходящим, ніж valgrind, щоб зрозуміти використання пам'яті процесу, оскільки він надає більше деталей та фламеграфів. Це також швидше, тому що він робить менше перевірки цього валлінджу. І це дає вам пікове використання пам'яті.

У будь-якому випадку, відстеження RSS та Vss вводить в оману, оскільки сторінки можуть бути спільними, ось чому це memusg. Те , що ви дійсно повинні зробити , це відстежувати суму Pssв /proc/[pid]/smapsабо використання pmap. Система-монітор GNOME раніше це робила, але це було занадто дорого.


1

Повторно винайдіть колесо, зроблене ручним сценарієм баш. Швидкий і чистий.

Мій випадок використання: я хотів відстежувати машину Linux, яка має менше оперативної пам’яті, і хотів зробити знімок часу на використання контейнера, коли він працює в умовах великого використання.

#!/usr/bin/env bash

threshold=$1

echo "$(date '+%Y-%m-%d %H:%M:%S'): Running free memory monitor with threshold $threshold%.."

while(true)
    freePercent=`free -m | grep Mem: | awk '{print ($7/$2)*100}'`    
  do

  if (( $(awk 'BEGIN {print ("'$freePercent'" < "'$threshold'")}') ))
  then
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Free memory $freePercent% is less than $threshold%"
       free -m
       docker stats --no-stream
       sleep 60  
       echo ""  
  else
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Sufficient free memory available: $freePercent%"
  fi
  sleep 30

done

Вибірка зразка:

2017-10-12 13:29:33: Запуск безкоштовного монітора пам’яті з порогом 30%.

2017-10-12 13:29:33: Достатньо вільної пам'яті: 69.4567%

2017-10-12 13:30:03: Достатньо вільної пам'яті: 69.4567%

2017-10-12 16:47:02: Вільна пам'ять 18,9387% менше 30%

ваш власний командний вихід


1

На macOS ви можете використовувати DTrace замість цього. Додаток "Інструменти" - це приємний графічний інтерфейс для цього, він поставляється з XCode afaik.


0

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

для більш детальної інформації http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html


3
htop не перераховує використання PEAK. Тільки ТОКОВЕ використання. (Якщо ви не знаєте чогось, чого я не знаю. Як я вчора шукав в htop для цього точного сценарію.)
— Katastic Voyage

-2

Будь ласка, відповідайте на запитання. Надайте деталі та діліться своїми дослідженнями!

Вибачте, я вперше тут і можу задавати лише питання ...

Використовувані запропоновані:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

тоді:

grep mem_heap_B massif.out
...
mem_heap_B=1150976
mem_heap_B=1150976
...

це дуже відрізняється від того, що topпоказує команда в подібний момент:

14673 gu27mox   20   0 3280404 468380  19176 R 100.0  2.9   6:08.84 pwanew_3pic_com

які вимірюються одиниці від Valgrind ??

/usr/bin/time -v ./test.shНіколи не відповіли - ви повинні безпосередньо годувати виконуваний /usr/bin/timeяк:

/usr/bin/time -v  pwanew_3pic_compass_2008florian3_dfunc.static  card_0.100-0.141_31212_resubmit1.dat_1.140_1.180   1.140 1.180 31212


    Command being timed: "pwanew_3pic_compass_2008florian3_dfunc.static card_0.100-0.141_31212_resubmit1.dat_1.140_1.180 1.140 1.180 31212"

    User time (seconds): 1468.44
    System time (seconds): 7.37
    Percent of CPU this job got: 99%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 24:37.14
    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): 574844
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 74
    Minor (reclaiming a frame) page faults: 468880
    Voluntary context switches: 1190
    Involuntary context switches: 20534
    Swaps: 0
    File system inputs: 81128
    File system outputs: 1264
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.