Вызывать и отслеживать использование памяти одним процессом

14

Я хочу запустить программу, потребляющую память, и отслеживать ее использование во времени. Программа заканчивается через несколько секунд после запуска.

Этот предыдущий вопрос предложил пакет sysstat . Хотя его pidstatутилита частично выполняет то, что я хочу, она не может удовлетворить мои 2 потребности:

  • Он принимает минимальный интервал 1s, но я хочу измерять при более короткой детализации. ( 0.1sдолжно быть в порядке)
  • Он только отслеживает существующий процесс, хотя я не всегда могу присутствовать, чтобы скопировать и вставить pid.

Существуют ли альтернативные скрипты / утилиты, чтобы лучше выполнять работу по вызову и измерению?

шутник
источник
1
Похоже, вы должны написать себе простой маленький скрипт на Python или Bash, чтобы сбросить использование памяти процессом (вы можете просто просмотреть первое целое число в /proc/$PID/statm), а затем поспать 100 мс и повторить. Почему вы не можете просто продолжать бросать ПИД - ассоциированный statmчерез cat, возможно , использовать некоторое регулярное выражение для фильтра от дополнительных / ненужных значений, и просто сделать sleep 0.01? Некоторые операционные системы не допускают sleepзначения менее секунды , поэтому в этом случае вам придется выбрать маршрут Python (и timeвместо этого использовать встроенную библиотеку Python для сна).
Прорыв
Есть много способов
Муниш

Ответы:

11

Это должно делать то, что вам нужно. Он получает информацию /proc/$PID/statmи печатает (с man procfs):

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              data       data + stack

Сценарий:

#!/usr/bin/env bash 

## Print header
 echo -e "Size\tResid.\tShared\tData\t%"
 while [ 1 ]; do
    ## Get the PID of the process name given as argument 1
     pidno=`pgrep $1`
    ## If the process is running, print the memory usage
     if [ -e /proc/$pidno/statm ]; then
     ## Get the memory info
      m=`awk '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
     ## Get the memory percentage
      perc=`top -bd .10 -p $pidno -n 1  | grep $pidno | gawk '{print \$10}'`
     ## print the results
      echo -e "$m\t$perc";
    ## If the process is not running
     else
      echo "$1 is not running";
     fi
 done

Затем вы можете вызвать скрипт, присвоив ему имя процесса в качестве ввода. Например:

$ memusage.sh firefox
Size    Resid.  Shared  Data    %
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517209  261899  9546    400731  12.8
517209  261899  9546    400731  12.8

ПРИМЕЧАНИЯ:

  • Это предполагает, что существует только один запущенный процесс с указанным именем.
terdon
источник
@ björnen спасибо за редактирование. Вы совершенно правы, я ошибся manтам, я не знаю, почему ваше редактирование было отклонено.
Terdon
1

Спустя годы я обнаружил, что у valgrind (также) есть инструмент для этого:

# record memory usage

$ valgrind --tool=massif bash -c "sleep 5; echo hey";
==5281== Massif, a heap profiler
==5281== Copyright (C) 2003-2015, and GNU GPL'd, by Nicholas Nethercote
==5281== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==5281== Command: bash -c sleep\ 5;\ echo\ hey
==5281==
hey
==5281==

# print the usage (5281 was the pid of bash, your filename will be different)
$ ms_print massif.out.4682

Примечание: valgrind делает больше, чем просто наблюдает: ему нужно внедрить некоторый код и сделать снимок памяти. Это может повредить точности статистики.

шутник
источник