17 ответов:
(это уже ответ, старый вопрос.. но только для протокола:)
Я был вдохновлен сценарием Яна, и придумал этот небольшой инструмент, названный memusg. Я просто увеличил частоту дискретизации до 0,1, чтобы справиться с очень короткими жизненными процессами. Вместо того, чтобы отслеживать один процесс, я заставил его измерить RSS-сумму группы процессов. (Да, я пишу много отдельных программ, которые работают вместе) в настоящее время он работает на Mac OS X и Linux. Использование должно было быть похоже на то, что
time:memusg ls -alR / >/dev/nullон показывает только пик на данный момент, но меня интересуют небольшие расширения для записи другой (грубой) статистики.
хорошо иметь такой простой инструмент, чтобы просто взглянуть, прежде чем мы начнем любое серьезное профилирование.
[ Edit: работает на Ubuntu 14.04:
/usr/bin/time -v commandубедитесь, что используется полный путь.]выглядит так:
/usr/bin/timeдает вам эту информацию, если вы проходите-v(это на Ubuntu 8.10). См., например,Maximum resident set sizeниже:$ /usr/bin/time -v ls / .... Command being timed: "ls /" User time (seconds): 0.00 System time (seconds): 0.01 Percent of CPU this job got: 250% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.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): 0 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 315 Voluntary context switches: 2 Involuntary context switches: 0 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
Valgrind one-liner:
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=\(.*\)//' | sort -g | tail -n 1Примечание использование --pages-as-heap для измерения всей памяти в процессе. Более подробная информация здесь:http://valgrind.org/docs/manual/ms-manual.html
возможно (gnu)времени(1) уже делает то, что вы хотите. Например:
$ /usr/bin/time -f "%P %M" command 43% 821248, но и другие инструменты профилирования может дать более точные результаты в зависимости от того, что вы ищете.
/usr/bin / time может быть делает то, что вы хотите, на самом деле. Что-то вроде этого.
/usr/bin/time --format='(%Xtext+%Ddata %Mmax)'Подробнее см. time(1)...
если процесс выполняется в течение хотя бы нескольких секунд, то вы можете использовать следующий скрипт 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
на MacOS Sierra используйте:
/usr/bin/time -l commandToMeasureможно использовать
grepвзять то, что вы хотите, может быть.
На Linux:
использовать
/usr/bin/time -v <program> <args>и посмотрите на "максимальный размер резидентного набора".(не путать с Баш
timeвстроенная команда! Так что используйте полный путь,/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 . . .
вы можете использовать такой инструмент, как Valgrind для этого.
вот (на основе других ответов) очень простой скрипт, который наблюдает за уже запущенным процессом. Вы просто запустите его с pid процесса, который вы хотите посмотреть в качестве аргумента:
#!/usr/bin/env bash pid= 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
'htop' - лучшая команда для просмотра того, какой процесс использует сколько оперативной памяти.....
для более подробной информации http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html
Heaptrack это инструмент KDE, который имеет графический интерфейс и текстовый интерфейс. Я нахожу его более подходящим, чем valgrind, чтобы понять использование памяти процесса, потому что он предоставляет больше деталей и flamegraphs. Это также быстрее, потому что он делает меньше проверки, что valgrind. И это дает вам пиковое использование памяти.
в любом случае, отслеживание rss и vss вводит в заблуждение, потому что страницы могут быть разделены, вот почему это
memusg. Что вы действительно должны сделать, это отслеживать суммуPssin/proc/[pid]/smapsили использоватьpmap. GNOME system-monitor раньше так делали, но это было слишком дорого.
повторное изобретение колеса, с рукописным сценарием bash. Быстро и чисто.
мой пример: Я хотел следить за машиной linux, которая имеет меньше оперативной памяти, и хотел сделать снимок использования каждого контейнера, когда он работает при интенсивном использовании.
#!/usr/bin/env bash threshold= echo "$(date '+%Y-%m-%d %H:%M:%S'): Running free memory monitor with threshold $threshold%.." while(true) freePercent=`free -m | grep Mem: | awk '{print (/)*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.
Comments