Викликати та відстежувати використання пам'яті одного процесу


14

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

Це попереднє запитання запропонувало пакет sysstat . Хоча його pidstatкорисність частково робить те, що я хочу, вона не відповідає моїм 2 потребам:

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

Чи є альтернативні сценарії / утиліти, щоб краще виконувати завдання виклику та вимірювання?


1
Здається, ви повинні написати собі простий маленький сценарій Python або Bash, щоб скинути використання пам'яті процесу (ви можете просто переглянути перше ціле число /proc/$PID/statm), а потім спати протягом 100 мс і повторити. Чому ви не можете просто продовжувати кидати ПІД - асоційований statmчерез cat, можливо , використовувати деякий регулярний вираз для фільтра від додаткових / непотрібних значень, і просто зробити sleep 0.01? Деякі операційні системи не дозволять sleepзначень другої секунди , тому в цьому випадку вам доведеться пройти маршрут Python (і timeзамість цього використати вбудовану бібліотеку Python ).
Прорив

Є багато способів
Munish

Відповіді:


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

ПРИМІТКИ:

  • Це передбачає, що існує лише один запущений процес із вказаною назвою.

@ björnen дякую за редагування. Ви абсолютно праві, я там помилявся man, я не знаю, чому вашу редакцію відхилили.
тердон

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 робить більше, ніж спостерігає: йому потрібно ввести якийсь код і зробити знімок пам'яті. Це може зашкодити точності статистики.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.