Пиковое использование памяти процессом linux / unix - PullRequest
335 голосов
/ 22 апреля 2009

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

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

Ответы [ 19 ]

350 голосов
/ 22 апреля 2009

[ Редактировать : Работает в 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
91 голосов
/ 16 августа 2010

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

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

memusg ls -alR / >/dev/null

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

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

61 голосов
/ 09 июня 2012

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

26 голосов
/ 22 апреля 2009

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

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

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

17 голосов
/ 22 апреля 2009

/ usr / bin / time, возможно, делает то, что вы хотите, на самом деле. Нечто подобное.

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

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

16 голосов
/ 22 октября 2017

В 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
      . . .
15 голосов
/ 13 августа 2009

Если процесс выполняется в течение хотя бы пары секунд, вы можете использовать следующий скрипт bash, который запустит заданную командную строку и напечатает для вывода пикового 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
13 голосов
/ 30 ноября 2016

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

/usr/bin/time -l commandToMeasure

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

7 голосов
/ 22 апреля 2009

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

6 голосов
/ 13 февраля 2019

Вот одна строка, которая не требует каких-либо внешних скриптов или утилит и не требует, чтобы вы запускали процесс с помощью другой программы, такой как Valgrind или time, поэтому вы можете использовать ее для любого процесса, который уже запущен:

grep VmPeak /proc/$PID/status

(замените $PID на PID интересующего вас процесса)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...