пиковое измерение памяти длительного процесса в Linux

Я боюсь, что нет никаких хороших независимых от платформы способов сделать, это кроме соединения с другим компьютером и наличия его отправляет Вам Ваш IP-адрес. Например: findmyipaddress. Обратите внимание, что это не будет работать при необходимости в IP-адресе, это находится позади NAT, если компьютер, с которым Вы соединяетесь, не находится позади NAT также.

Вот одно решение, которое работает в Linux: связали IP-адрес с сетевым интерфейсом .

7
задан Community 23 May 2017 в 10:32
поделиться

7 ответов

You could use a munin-node plugin to do this, but it's a little heavyweight. http://munin.projects.linpro.no/

1
ответ дан 6 December 2019 в 12:53
поделиться

Actually, what I said before:

"""

try

/usr/bin/time -v yourcommand

that should help. if you use only "time", bash will execute the built-in (that does not have "-v")

"""

does not work (returns 0).

I made the following perl script (that I called smaps):

#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
my $max = 0;
while( open my $f, '<', "/proc/$ARGV[0]/smaps" ) {
  local $/; $_ = <$f>;
  $max = $1 if /Rss:\s*(\d+)/ and $1 > $max;
  open my $g, '>', '/tmp/max';
  say $g $max
}

And then I call it (for instance, to watch qgit's memory usage):

bash -c './smaps $$ & exec qgit'

Use single quotes so the "daughter" shell interprets $$ (that will be the same PID of qgit after the exec). this answer, I tested :-D

HTH

2
ответ дан 6 December 2019 в 12:53
поделиться

Просто используйте top -n для итерации определенное количество раз и -d для задержки между обновлениями. Кроме того, вы можете получить только выходные данные, относящиеся к вашему процессу, путем поиска его pid, например:

top -n 30 -d 60 | grep <process-id>

Прочтите верхнюю страницу руководства для получения дополнительной информации

man top

Конечно, вы также можете получить нужный столбец с помощью awk.

6
ответ дан 6 December 2019 в 12:53
поделиться

/ proc / pid / smaps, например / proc / pid / maps дает информацию только о сопоставлениях виртуальной памяти, но не о фактическом использовании физической памяти. top и ps дают RSS, который (в зависимости от того, что вы хотите знать) может не быть хорошим индикатором использования памяти.

Хорошая ставка, если вы используете ядро ​​Linux более поздней версии, чем 2.6.28.7, - это использовать функцию Pagemap. Это обсуждение и источник некоторых инструментов на www.eqware. net / Статьи / CapturingProcessMemoryUsageUnderLinux .

Средство сбора страниц предназначено для сбора данных об использовании памяти ВСЕМИ процессами, и поэтому, вероятно, создает большую нагрузку на ЦП, чем вы хотите. Однако вы легко сможете изменить его, чтобы он собирал данные только для определенного идентификатора процесса. Это достаточно снизило бы накладные расходы, чтобы вы могли легко запускать его каждые несколько секунд. Я не пробовал, но думаю, что инструмент анализа страниц должен работать без изменений.

EQvan

Это достаточно снизило бы накладные расходы, чтобы вы могли легко запускать его каждые несколько секунд. Я не пробовал, но думаю, что инструмент анализа страниц должен работать без изменений.

EQvan

Это достаточно снизило бы накладные расходы, чтобы вы могли легко запускать его каждые несколько секунд. Я не пробовал, но думаю, что инструмент анализа страниц должен работать без изменений.

EQvan

1
ответ дан 6 December 2019 в 12:53
поделиться

Valgrind с массивом не должен быть слишком тяжелым, но я бы рекомендовал использовать / proc. Вы можете легко написать свой собственный сценарий монитора. Вот мой, для вашего удобства:

#!/bin/bash

ppid=$$
maxmem=0

$@ &
pid=`pgrep -P ${ppid} -n -f $1` # $! may work here but not later
while [[ ${pid} -ne "" ]]; do
    #mem=`ps v | grep "^[ ]*${pid}" | awk '{print $8}'`
        #the previous does not work with MPI
        mem=`cat /proc/${pid}/status | grep VmRSS | awk '{print $2}'`
    if [[ ${mem} -gt ${maxmem} ]]; then
        maxmem=${mem}
    fi
    sleep 1
    savedpid=${pid}
    pid=`pgrep -P ${ppid} -n -f $1`
done
wait ${savedpid} # don't wait, job is finished
exitstatus=$?   # catch the exit status of wait, the same of $@
echo -e "Memory usage for $@ is: ${maxmem} KB. Exit status: ${exitstatus}\n"
2
ответ дан 6 December 2019 в 12:53
поделиться
[

] Это зависит от того, какой тип памяти вы хотите контролировать. [

] [

] Мониторинг следующего M.a.p.d. путем сортировки номеров всех процессов (не всех потоков) позволит контролировать физическую память malloc, используемую каждым процессом.[

]. [

] Вы можете написать программу на Си, чтобы сделать ее еще быстрее, но я думал, что awk - это минимальный выбор для этой цели. [

] [
    ] [
  • ] M.a анонимная картографическая память [
      ] [
    • ].p private [
        ] [
      • ].d грязная == malloc/mmapped heap и stack allocation and write memory [
      • ] [
      • ].c clean == malloc/mmapped heap and stack memory once allocation, write, then freed, but not reclaimed yet [
      • ] [
      ][
    • ] [
    • ].s shared [
        ] [
      • ].d грязный == не должно быть ни одного [
      • ] [
      • ].c clean == не должно быть ни одного [
      • ] [
      ][
    • ] [
    ][
  • ] [
  • ] M.n именованная картографическая память. [
      ] [
    • ].p private [
        ] [
      • ].d грязный == файл mmapped write memory private [
      • ] [
      • ].c clean == mapped program/library text private mapped [
      • ] [
      ][
    • ] [
    • ].s shared [
        ] [
      • ].d грязный == файл mmapped write memory shared [
      • ] [
      • ].c clean == mapped library text shared mapped [
      • ] [
      ][
    • ] [
    ][
  • ] [
] [

] Я бы предпочел получить следующие числа, чтобы получить реальные числа с наименьшими накладными расходами. [
] Вы должны суммировать их, чтобы разделить то, что ps показывает как RSS, и получить более точные цифры, чтобы не запутать. [

] [

] M.a.p.d: [

] [
 awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Dirty/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps
] [

]M.a.p.c:[

] [
 awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Clean/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps
] [

] M.n.p.d.:... и так далее [

]
1
ответ дан 6 December 2019 в 12:53
поделиться

Вместо того, чтобы опрашивать / proc миллиард раз в секунду, почему бы просто не обработать вывод strace?

http://tstarling.com/blog/2010/06/measuring-memory-usage-with-strace/

1
ответ дан 6 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: