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

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

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

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

есть ли какие-то альтернативные скрипты / утилиты для лучшего выполнения задания invoke-and-measure?

4
задан Community
27.12.2022 19:27 Количество просмотров материала 2777
Распечатать страницу

2 ответа

Это должно делать то, что вам нужно. Он получает информацию от /proc/$PID/statm и печатает (от 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

сценарий:

#!/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 `
    ## If the process is running, print the memory usage
     if [ -e /proc/$pidno/statm ]; then
     ## Get the memory info
      m=`awk '{OFS="\t";print ,,,}' /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 " 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

Примечания:

  • это предполагает, что есть только single запуск процесса с указанным именем.
11
отвечен terdon 2022-12-29 03:15

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

1
отвечен Jokester 2022-12-29 05:32

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх