Пік використання пам'яті процесу 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.