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

10235
Jokester

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

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

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

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

14
Похоже, вы должны написать себе простой маленький скрипт на Python или Bash, чтобы сбросить использование памяти процессом (вы можете просто просмотреть первое целое число в `/ proc / $ PID / statm`), а затем спать в течение 100 мс и повторить. Почему вы не можете просто выбросить связанный с PID `statm` через` cat`, возможно, использовать некоторое регулярное выражение, чтобы отфильтровать лишние / ненужные значения, и просто сделать `sleep 0.01`? Некоторые операционные системы не допускают значения «сна» за доли секунды, поэтому в этом случае вам придется выбрать маршрут Python (и вместо этого использовать встроенную в Python библиотеку «time»). Breakthrough 11 лет назад 1
Есть много [способов] (http://www.golinuxhub.com/2015/02/how-to-check-memory-utilization-for.html) munish 8 лет назад 0

2 ответа на вопрос

11
terdon

This should do what you need. It gets the information from /proc/$PID/statm and prints (from man stat):

 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 

The script:

#!/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 '' /proc/$pidno/statm` ## Get the memory percentage perc=`top -bd .10 -p $pidno -n 1 | grep $pidno | gawk ''` ## print the results echo -e "$m\t$perc"; ## If the process is not running else echo "$1 is not running"; fi done 

You can then call the script, giving it a process name as input. For example:

$ 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 

NOTES:

  • This assumes that there is only a single running process with the name specified.
1
Jokester

Спустя годы я обнаружил, что у 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 делает больше, чем просто наблюдает: ему нужно внедрить некоторый код и сделать снимок памяти. Это может повредить точности статистики.