Відповіді:
Ось один вкладиш, який не потребує зовнішніх скриптів або утиліт і не вимагає запускати процес через іншу програму, наприклад, Valgrind або time, так що ви можете використовувати його для будь-якого запущеного процесу:
grep VmPeak /proc/$PID/status
(замініть $PID
PID процесу, який вас цікавить)
[ Редагувати : Працює на 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
/bin/time -v
вирішує це.
time -l
на MacOS, дає подібний вихід.
(Це вже відповів, старе запитання .. але тільки для запису :)
Мене надихнуло сценарій Ян і придумав цей невеличкий інструмент, названий memusg . Я просто збільшив частоту вибірки до 0,1, щоб обробити багато коротких життєвих процесів. Замість моніторингу єдиного процесу я змусив його виміряти rss суму групи процесів. (Так, я пишу багато окремих програм, які працюють разом). Зараз він працює на Mac OS X та Linux. Використання повинно бути подібним до використання time
:
memusg ls -alR /> / dev / null
Він показує лише пік на даний момент, але мене цікавлять невеликі розширення для запису інших (грубих) статистичних даних.
Добре мати такий простий інструмент для простого огляду, перш ніж розпочати будь-яке серйозне профілювання.
ps -o rss=
де rss - це реальна пам'ять (резидентний набір) розміру процесу (у 1024 байтових одиницях) з моєї сторінки BSD man.
Вальдрінд однолінійний:
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
time
, Я покидаю тебе.
valgrind --massif
. Ви також можете використовувати ms_print
інструмент, який постачається з ним, для зручного виведення даних (включаючи графіки використання ascii з часом)
time
хоча, забираючи принаймні 10 разів більше часу на таку команду ls
.
У 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
Можливо, (гну) час (1) вже робить те, що ви хочете. Наприклад:
$ /usr/bin/time -f "%P %M" command
43% 821248
Але інші інструменти профілювання можуть дати більш точні результати залежно від того, що ви шукаєте.
time
це вбудована команда при використанні csh
. Якщо ви використовуєте точний шлях, це дозволить запустити зовнішню команду. Наскільки мені відомо, лише версія GNU підтримує опцію формату.
/ usr / bin / час, можливо, робить те, що ти хочеш, насправді. Щось на зразок.
/ usr / bin / time --format = '(% Xtext +% Дані% Mmax)'
Детальніше дивіться у часі (1) ...
У MacOS Sierra використовуйте:
/usr/bin/time -l commandToMeasure
Ви можете використовувати, grep
щоб взяти те, що ви хочете, можливо.
command time -l
замість /usr/bin/time -l
якої, ваша оболонка насправді викликає двійковий виклик time
замість вбудованої функції. (Так, command
це не заповнювач місця, command time
відрізняється від просто time
.)
Якщо процес працює щонайменше пару секунд, ви можете скористатися наступним скриптом 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
Для цього можна використовувати такий інструмент, як Valgrind .
Ось (на основі інших відповідей) дуже простий сценарій, який спостерігає за вже запущеним процесом. Ви просто запускаєте його з 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
Використовуйте масив: http://valgrind.org/docs/manual/ms-manual.html
Heaptrack - це інструмент KDE, який має графічний інтерфейс та текстовий інтерфейс. Я вважаю його більш підходящим, ніж valgrind, щоб зрозуміти використання пам'яті процесу, оскільки він надає більше деталей та фламеграфів. Це також швидше, тому що він робить менше перевірки цього валлінджу. І це дає вам пікове використання пам'яті.
У будь-якому випадку, відстеження RSS та Vss вводить в оману, оскільки сторінки можуть бути спільними, ось чому це memusg
. Те , що ви дійсно повинні зробити , це відстежувати суму Pss
в /proc/[pid]/smaps
або використання pmap
. Система-монітор GNOME раніше це робила, але це було занадто дорого.
Повторно винайдіть колесо, зроблене ручним сценарієм баш. Швидкий і чистий.
Мій випадок використання: я хотів відстежувати машину 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%
ваш власний командний вихід
На macOS ви можете використовувати DTrace замість цього. Додаток "Інструменти" - це приємний графічний інтерфейс для цього, він поставляється з XCode afaik.
'htop' - найкраща команда, щоб побачити, який процес використовує скільки оперативної пам'яті .....
для більш детальної інформації http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html
Будь ласка, відповідайте на запитання. Надайте деталі та діліться своїми дослідженнями!
Вибачте, я вперше тут і можу задавати лише питання ...
Використовувані запропоновані:
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