Пиковое использование памяти процесса linux / unix



есть ли инструмент, который будет запускать командную строку и сообщать, сколько ОЗУ было использовано всего?



Я представляю себе что-то аналогичное /usr/bin/time

673   17  

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 взять то, что вы хотите, может быть.

Ну, если вы действительно хотите показать пик памяти и еще несколько углубленных статистических данных, я рекомендую использовать профилировщик, такой как valgrind. Хороший valgrind front-end-это alleyoop.

На 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
time -f '%M' <run_program>

Использовать Массив: 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. Что вы действительно должны сделать, это отслеживать сумму Pss in /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

    Ничего не найдено.