Ответы:
Вот одна строка, которая не требует каких-либо внешних сценариев или утилит и не требует, чтобы вы запускали процесс с помощью другой программы, такой как 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 / time -v ls / .... Время выполнения команды: "ls /" Пользовательское время (секунды): 0,00 Системное время (секунды): 0,01 Процент CPU, который получил это задание: 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.
Valgrind один вкладыш:
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
Возможно (GNU) время (1) уже делает то, что вы хотите. Например:
$ /usr/bin/time -f "%P %M" command
43% 821248
Но другие инструменты профилирования могут дать более точные результаты в зависимости от того, что вы ищете.
time
встроенная команда при использовании csh
. Если вы используете точный путь, это позволит вам выполнить внешнюю команду. Насколько я знаю, только версия GNU поддерживает опцию формата.
/ usr / bin / time, возможно, делает то, что вы хотите, на самом деле. Что-то вроде.
/ usr / bin / time --format = '(% Xtext +% Ddata% 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
Используйте Massif: http://valgrind.org/docs/manual/ms-manual.html
Heaptrack - это инструмент KDE с графическим интерфейсом и текстовым интерфейсом. Я нахожу более подходящим, чем valgrind, понять использование памяти процессом, поскольку он предоставляет больше деталей и флеймграфов. Это также быстрее, потому что он меньше проверяет этот valgrind. И это дает вам пиковое использование памяти.
В любом случае, отслеживание rss и vss вводит в заблуждение, потому что страницы могут быть общими, вот почему memusg
. Что вы действительно должны сделать, это отслеживать сумму Pss
в /proc/[pid]/smaps
или использования pmap
. Системный монитор GNOME раньше делал это, но это было слишком дорого.
Переизобретая колесо, с помощью скрипта bash, сделанного вручную. Быстро и чисто.
Мой пример использования: я хотел отслеживать машину 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