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

Есть ли инструмент, который будет запускать командную строку и сообщать, сколько оперативной памяти было использовано в общей сложности?

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

Ответ 1

(Это уже ответ, старый вопрос... но только для записи:)

Я был вдохновлен Yang script и придумал этот небольшой инструмент, названный memusg. Я просто увеличил частоту дискретизации до 0,1, чтобы обрабатывать очень короткие жизненные процессы. Вместо того, чтобы отслеживать один процесс, я дал ему оценку rss-суммы группы процессов. (Да, я пишу много отдельных программ, которые работают вместе). В настоящее время он работает на Mac OS X и Linux. Использование должно быть похоже на использование time:

memusg ls -alR / >/dev/null

Показывает только пик на данный момент, но меня интересуют небольшие расширения для записи других (грубых) статистических данных.

Хорошо иметь такой простой инструмент, чтобы просто взглянуть, прежде чем мы начнем серьезное профилирование.

Ответ 2

[ Изменить: работает в 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

Ответ 3

Вальгринд однострочный:

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

Ответ 4

Возможно (gnu) time (1) уже делает то, что вы хотите. Например:

$ /usr/bin/time -f "%P %M" command
43% 821248

Но другие инструменты профилирования могут давать более точные результаты в зависимости от того, что вы ищете.

Ответ 5

/usr/bin/time, возможно, делает то, что вы хотите, на самом деле. Что-то вроде.

 /usr/bin/time --format='(%Xtext+%Ddata %Mmax)'

Подробнее см. время (1)...

Ответ 6

Если процесс выполняется не менее пары секунд, вы можете использовать следующий bash script, который будет запускать заданную командную строку, а затем печатать на stderr пик RSS (подставлять rss любой другой атрибут вас интересует). Он несколько легкий, и он работает для меня с ps, включенным в Ubuntu 9.04 (который я не могу сказать для time).

#!/usr/bin/env bash
"[email protected]" & # 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

Ответ 7

В MacOS Sierra используется:

/usr/bin/time -l commandToMeasure

Вы можете использовать grep, чтобы взять то, что вы хотите, возможно.

Ответ 8

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

Ответ 9

Для этого вы можете использовать инструмент, например Valgrind.

Ответ 10

Здесь (на основе других ответов) очень простой script, который отслеживает уже запущенный процесс. Вы просто запускаете его с 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

Ответ 12

'htop' - лучшая команда для просмотра того, какой процесс использует объем оперативной памяти.....

для более подробной информации http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html

Ответ 13

Heaptrack - это инструмент KDE с графическим интерфейсом и текстовым интерфейсом. Я считаю его более подходящим, чем valgrind, чтобы понять использование памяти в процессе, потому что он предоставляет более подробную информацию и плагины. Это также быстрее, потому что он делает меньше проверки этого valgrind. И это дает вам пиковое использование памяти.

В любом случае, отслеживание rss и vss вводит в заблуждение, поскольку страницы могут быть разделены, поэтому memusg. То, что вы действительно должны сделать, это отслеживать сумму Pss в /proc/[pid]/smaps или использовать pmap. системный монитор GNOME, но это было слишком дорого.

Ответ 14

Повторно изобрести колесо с ручным управлением bash script. Быстрая и чистая.

Мой прецедент: Я хотел отслеживать 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%

ваш пользовательский вывод команды

Ответ 15

В Linux:

Используйте /usr/bin/time -v <program> <args> и найдите "Максимальный размер резидентного набора".

(Не путать с встроенной командой Bash 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
      . . .