Как измерить фактическое использование памяти приложения или процесса? - PullRequest
664 голосов
/ 25 сентября 2008

Этот вопрос охватывается здесь очень подробно.

Как вы измеряете использование памяти приложением или процессом в Linux?

Из статьи в блоге Понимание использования памяти в Linux , ps не является точным инструментом для этой цели.

Почему ps является "неправильным"

В зависимости от того, как вы на это смотрите, ps не сообщает о реальном использовании памяти процессами. Что он действительно делает, так это показывает, сколько реальной памяти каждый процесс занял бы , если бы это был единственный процесс, выполняющий . Конечно, на типичном компьютере с Linux в каждый момент времени выполняется несколько десятков процессов, а это означает, что номера VSZ и RSS, сообщаемые ps, почти определенно неверны .

Ответы [ 31 ]

333 голосов
/ 25 сентября 2008

С помощью ps или аналогичных инструментов вы получите только количество страниц памяти, выделенных этим процессом. Этот номер правильный, но:

  • не отражает фактический объем памяти, используемый приложением, только объем памяти, зарезервированный для него

  • может вводить в заблуждение, если страницы совместно используются, например, несколькими потоками или с использованием динамически связанных библиотек

Если вы действительно хотите знать, какой объем памяти фактически использует ваше приложение, вам нужно запустить его в профилировщике. Например, valgrind может дать вам представление об объеме используемой памяти и, что более важно, о возможных утечках памяти в вашей программе. Инструмент профилирования кучи Valgrind называется 'массив':

Массив - это профилировщик кучи. Он выполняет подробное профилирование кучи, делая регулярные снимки кучи программы. Он создает график, показывающий использование кучи с течением времени, включая информацию о том, какие части программы отвечают за наибольшее количество выделенной памяти. График дополняется текстовым или HTML-файлом, который содержит больше информации для определения того, где больше всего памяти выделяется. Массив запускает программы примерно в 20 раз медленнее, чем обычно.

Как объяснено в документации valgrind , вам нужно запустить программу через valgrind:

valgrind --tool=massif <executable> <arguments>

Massif записывает дамп снимков использования памяти (например, massif.out.12345). Они обеспечивают, (1) график использования памяти, (2) для каждого снимка, запись о том, где в вашей программе была выделена память. Отличным графическим инструментом для анализа этих файлов является massif-visualizer . Но я нашел, что ms_print, простой текстовый инструмент, поставляемый с valgrind, уже очень помог.

Чтобы найти утечки памяти, используйте (по умолчанию) memcheck инструмент valgrind.

265 голосов
/ 12 мая 2010

Попробуйте команду pmap :

sudo pmap -x <process pid>
187 голосов
/ 25 сентября 2008

Трудно сказать наверняка, но вот две "близкие" вещи, которые могут помочь.

$ ps aux 

даст вам виртуальный размер (VSZ)

Вы также можете получить подробную статистику из файловой системы / proc, перейдя на /proc/$pid/status

Наиболее важным является VmSize, который должен быть близок к тому, что дает ps aux.

/proc/19420$ cat status
Name:   firefox
State:  S (sleeping)
Tgid:   19420
Pid:    19420
PPid:   1
TracerPid:  0
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
FDSize: 256
Groups: 4 6 20 24 25 29 30 44 46 107 109 115 124 1000 
VmPeak:   222956 kB
VmSize:   212520 kB
VmLck:         0 kB
VmHWM:    127912 kB
VmRSS:    118768 kB
VmData:   170180 kB
VmStk:       228 kB
VmExe:        28 kB
VmLib:     35424 kB
VmPTE:       184 kB
Threads:    8
SigQ:   0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000020001000
SigCgt: 000000018000442f
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
Cpus_allowed:   03
Mems_allowed:   1
voluntary_ctxt_switches:    63422
nonvoluntary_ctxt_switches: 7171

127 голосов
/ 06 августа 2009

В последних версиях linux используйте подсистему smaps . Например, для процесса с PID 1234:

cat /proc/1234/smaps

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

123 голосов
/ 25 сентября 2008

Нет простого способа рассчитать это. Но некоторые люди пытались получить хорошие ответы:

96 голосов
/ 07 декабря 2012

Используйте смем , который является альтернативой пс , который рассчитывает USS и PSS для процесса. То, что вы хотите, вероятно, PSS.

  • USS - уникальный размер набора. Это количество неразделенной памяти, уникальной для этого процесса (воспринимайте это как U для уникальной памяти). Он не включает общую память. Таким образом, это будет при -отчете об объеме памяти, используемой процессом, но полезно, если вы хотите игнорировать разделяемую память.

  • PSS - Размер пропорционального набора. Это то, что вы хотите. Он складывает уникальную память (USS) вместе с долей общей памяти, деленной на число других процессов, совместно использующих эту память. Таким образом, это даст вам точное представление о том, сколько фактической физической памяти используется на процесс - с разделяемой памятью, действительно представленной как разделяемая Представьте, что P предназначен для физической памяти.

Как это сравнивается с RSS, как сообщили ps и другие утилиты:

  • RSS - Размер резидентного набора. Это количество общей памяти плюс неразделенная память, используемая каждым процессом. Если какие-либо процессы совместно используют память, это будет over - сообщать об объеме фактически используемой памяти, поскольку одна и та же общая память будет учитываться более одного раза - снова появляться в каждом другом процессе, который совместно использует одну и ту же память. Таким образом, это довольно ненадежно, особенно когда процессы с высокой памятью имеют много разветвлений - что характерно для сервера, с такими вещами, как процессы Apache или PHP (fastcgi / FPM).

Примечание: smem также может (необязательно) выводить графики, такие как круговые диаграммы и т.п. ИМО тебе ничего не нужно. Если вы просто хотите использовать его из командной строки, как если бы вы использовали ps -A v, вам не нужно устанавливать рекомендуемую зависимость python-matplotlib.

75 голосов
/ 23 июня 2017
ps -eo size,pid,user,command --sort -size | \
    awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |\
    cut -d "" -f2 | cut -d "-" -f1

Используйте это как root, и вы можете получить четкий вывод об использовании памяти каждым процессом.

ПРИМЕР ВЫХОДА:

     0.00 Mb COMMAND 
  1288.57 Mb /usr/lib/firefox
   821.68 Mb /usr/lib/chromium/chromium 
   762.82 Mb /usr/lib/chromium/chromium 
   588.36 Mb /usr/sbin/mysqld 
   547.55 Mb /usr/lib/chromium/chromium 
   523.92 Mb /usr/lib/tracker/tracker
   476.59 Mb /usr/lib/chromium/chromium 
   446.41 Mb /usr/bin/gnome
   421.62 Mb /usr/sbin/libvirtd 
   405.11 Mb /usr/lib/chromium/chromium 
   302.60 Mb /usr/lib/chromium/chromium 
   291.46 Mb /usr/lib/chromium/chromium 
   284.56 Mb /usr/lib/chromium/chromium 
   238.93 Mb /usr/lib/tracker/tracker
   223.21 Mb /usr/lib/chromium/chromium 
   197.99 Mb /usr/lib/chromium/chromium 
   194.07 Mb conky 
   191.92 Mb /usr/lib/chromium/chromium 
   190.72 Mb /usr/bin/mongod 
   169.06 Mb /usr/lib/chromium/chromium 
   155.11 Mb /usr/bin/gnome
   136.02 Mb /usr/lib/chromium/chromium 
   125.98 Mb /usr/lib/chromium/chromium 
   103.98 Mb /usr/lib/chromium/chromium 
    93.22 Mb /usr/lib/tracker/tracker
    89.21 Mb /usr/lib/gnome
    80.61 Mb /usr/bin/gnome
    77.73 Mb /usr/lib/evolution/evolution
    76.09 Mb /usr/lib/evolution/evolution
    72.21 Mb /usr/lib/gnome
    69.40 Mb /usr/lib/evolution/evolution
    68.84 Mb nautilus
    68.08 Mb zeitgeist
    60.97 Mb /usr/lib/tracker/tracker
    59.65 Mb /usr/lib/evolution/evolution
    57.68 Mb apt
    55.23 Mb /usr/lib/gnome
    53.61 Mb /usr/lib/evolution/evolution
    53.07 Mb /usr/lib/gnome
    52.83 Mb /usr/lib/gnome
    51.02 Mb /usr/lib/udisks2/udisksd 
    50.77 Mb /usr/lib/evolution/evolution
    50.53 Mb /usr/lib/gnome
    50.45 Mb /usr/lib/gvfs/gvfs
    50.36 Mb /usr/lib/packagekit/packagekitd 
    50.14 Mb /usr/lib/gvfs/gvfs
    48.95 Mb /usr/bin/Xwayland :1024 
    46.21 Mb /usr/bin/gnome
    42.43 Mb /usr/bin/zeitgeist
    42.29 Mb /usr/lib/gnome
    41.97 Mb /usr/lib/gnome
    41.64 Mb /usr/lib/gvfs/gvfsd
    41.63 Mb /usr/lib/gvfs/gvfsd
    41.55 Mb /usr/lib/gvfs/gvfsd
    41.48 Mb /usr/lib/gvfs/gvfsd
    39.87 Mb /usr/bin/python /usr/bin/chrome
    37.45 Mb /usr/lib/xorg/Xorg vt2 
    36.62 Mb /usr/sbin/NetworkManager 
    35.63 Mb /usr/lib/caribou/caribou 
    34.79 Mb /usr/lib/tracker/tracker
    33.88 Mb /usr/sbin/ModemManager 
    33.77 Mb /usr/lib/gnome
    33.61 Mb /usr/lib/upower/upowerd 
    33.53 Mb /usr/sbin/gdm3 
    33.37 Mb /usr/lib/gvfs/gvfsd
    33.36 Mb /usr/lib/gvfs/gvfs
    33.23 Mb /usr/lib/gvfs/gvfs
    33.15 Mb /usr/lib/at
    33.15 Mb /usr/lib/at
    30.03 Mb /usr/lib/colord/colord 
    29.62 Mb /usr/lib/apt/methods/https 
    28.06 Mb /usr/lib/zeitgeist/zeitgeist
    27.29 Mb /usr/lib/policykit
    25.55 Mb /usr/lib/gvfs/gvfs
    25.55 Mb /usr/lib/gvfs/gvfs
    25.23 Mb /usr/lib/accountsservice/accounts
    25.18 Mb /usr/lib/gvfs/gvfsd 
    25.15 Mb /usr/lib/gvfs/gvfs
    25.15 Mb /usr/lib/gvfs/gvfs
    25.12 Mb /usr/lib/gvfs/gvfs
    25.10 Mb /usr/lib/gnome
    25.10 Mb /usr/lib/gnome
    25.07 Mb /usr/lib/gvfs/gvfsd 
    24.99 Mb /usr/lib/gvfs/gvfs
    23.26 Mb /usr/lib/chromium/chromium 
    22.09 Mb /usr/bin/pulseaudio 
    19.01 Mb /usr/bin/pulseaudio 
    18.62 Mb (sd
    18.46 Mb (sd
    18.30 Mb /sbin/init 
    18.17 Mb /usr/sbin/rsyslogd 
    17.50 Mb gdm
    17.42 Mb gdm
    17.09 Mb /usr/lib/dconf/dconf
    17.09 Mb /usr/lib/at
    17.06 Mb /usr/lib/gvfs/gvfsd
    16.98 Mb /usr/lib/at
    16.91 Mb /usr/lib/gdm3/gdm
    16.86 Mb /usr/lib/gvfs/gvfsd
    16.86 Mb /usr/lib/gdm3/gdm
    16.85 Mb /usr/lib/dconf/dconf
    16.85 Mb /usr/lib/dconf/dconf
    16.73 Mb /usr/lib/rtkit/rtkit
    16.69 Mb /lib/systemd/systemd
    13.13 Mb /usr/lib/chromium/chromium 
    13.13 Mb /usr/lib/chromium/chromium 
    10.92 Mb anydesk 
     8.54 Mb /sbin/lvmetad 
     7.43 Mb /usr/sbin/apache2 
     6.82 Mb /usr/sbin/apache2 
     6.77 Mb /usr/sbin/apache2 
     6.73 Mb /usr/sbin/apache2 
     6.66 Mb /usr/sbin/apache2 
     6.64 Mb /usr/sbin/apache2 
     6.63 Mb /usr/sbin/apache2 
     6.62 Mb /usr/sbin/apache2 
     6.51 Mb /usr/sbin/apache2 
     6.25 Mb /usr/sbin/apache2 
     6.22 Mb /usr/sbin/apache2 
     3.92 Mb bash 
     3.14 Mb bash 
     2.97 Mb bash 
     2.95 Mb bash 
     2.93 Mb bash 
     2.91 Mb bash 
     2.86 Mb bash 
     2.86 Mb bash 
     2.86 Mb bash 
     2.84 Mb bash 
     2.84 Mb bash 
     2.45 Mb /lib/systemd/systemd
     2.30 Mb (sd
     2.28 Mb /usr/bin/dbus
     1.84 Mb /usr/bin/dbus
     1.46 Mb ps 
     1.21 Mb openvpn hackthebox.ovpn 
     1.16 Mb /sbin/dhclient 
     1.16 Mb /sbin/dhclient 
     1.09 Mb /lib/systemd/systemd 
     0.98 Mb /sbin/mount.ntfs /dev/sda3 /media/n0bit4/Data 
     0.97 Mb /lib/systemd/systemd 
     0.96 Mb /lib/systemd/systemd 
     0.89 Mb /usr/sbin/smartd 
     0.77 Mb /usr/bin/dbus
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.74 Mb /usr/bin/dbus
     0.71 Mb /usr/lib/apt/methods/http 
     0.68 Mb /bin/bash /usr/bin/mysqld_safe 
     0.68 Mb /sbin/wpa_supplicant 
     0.66 Mb /usr/bin/dbus
     0.61 Mb /lib/systemd/systemd
     0.54 Mb /usr/bin/dbus
     0.46 Mb /usr/sbin/cron 
     0.45 Mb /usr/sbin/irqbalance 
     0.43 Mb logger 
     0.41 Mb awk { hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" } 
     0.40 Mb /usr/bin/ssh
     0.34 Mb /usr/lib/chromium/chrome
     0.32 Mb cut 
     0.32 Mb cut 
     0.00 Mb [kthreadd] 
     0.00 Mb [ksoftirqd/0] 
     0.00 Mb [kworker/0:0H] 
     0.00 Mb [rcu_sched] 
     0.00 Mb [rcu_bh] 
     0.00 Mb [migration/0] 
     0.00 Mb [lru
     0.00 Mb [watchdog/0] 
     0.00 Mb [cpuhp/0] 
     0.00 Mb [cpuhp/1] 
     0.00 Mb [watchdog/1] 
     0.00 Mb [migration/1] 
     0.00 Mb [ksoftirqd/1] 
     0.00 Mb [kworker/1:0H] 
     0.00 Mb [cpuhp/2] 
     0.00 Mb [watchdog/2] 
     0.00 Mb [migration/2] 
     0.00 Mb [ksoftirqd/2] 
     0.00 Mb [kworker/2:0H] 
     0.00 Mb [cpuhp/3] 
     0.00 Mb [watchdog/3] 
     0.00 Mb [migration/3] 
     0.00 Mb [ksoftirqd/3] 
     0.00 Mb [kworker/3:0H] 
     0.00 Mb [kdevtmpfs] 
     0.00 Mb [netns] 
     0.00 Mb [khungtaskd] 
     0.00 Mb [oom_reaper] 
     0.00 Mb [writeback] 
     0.00 Mb [kcompactd0] 
     0.00 Mb [ksmd] 
     0.00 Mb [khugepaged] 
     0.00 Mb [crypto] 
     0.00 Mb [kintegrityd] 
     0.00 Mb [bioset] 
     0.00 Mb [kblockd] 
     0.00 Mb [devfreq_wq] 
     0.00 Mb [watchdogd] 
     0.00 Mb [kswapd0] 
     0.00 Mb [vmstat] 
     0.00 Mb [kthrotld] 
     0.00 Mb [ipv6_addrconf] 
     0.00 Mb [acpi_thermal_pm] 
     0.00 Mb [ata_sff] 
     0.00 Mb [scsi_eh_0] 
     0.00 Mb [scsi_tmf_0] 
     0.00 Mb [scsi_eh_1] 
     0.00 Mb [scsi_tmf_1] 
     0.00 Mb [scsi_eh_2] 
     0.00 Mb [scsi_tmf_2] 
     0.00 Mb [scsi_eh_3] 
     0.00 Mb [scsi_tmf_3] 
     0.00 Mb [scsi_eh_4] 
     0.00 Mb [scsi_tmf_4] 
     0.00 Mb [scsi_eh_5] 
     0.00 Mb [scsi_tmf_5] 
     0.00 Mb [bioset] 
     0.00 Mb [kworker/1:1H] 
     0.00 Mb [kworker/3:1H] 
     0.00 Mb [kworker/0:1H] 
     0.00 Mb [kdmflush] 
     0.00 Mb [bioset] 
     0.00 Mb [kdmflush] 
     0.00 Mb [bioset] 
     0.00 Mb [jbd2/sda5
     0.00 Mb [ext4
     0.00 Mb [kworker/2:1H] 
     0.00 Mb [kauditd] 
     0.00 Mb [bioset] 
     0.00 Mb [drbd
     0.00 Mb [irq/27
     0.00 Mb [i915/signal:0] 
     0.00 Mb [i915/signal:1] 
     0.00 Mb [i915/signal:2] 
     0.00 Mb [ttm_swap] 
     0.00 Mb [cfg80211] 
     0.00 Mb [kworker/u17:0] 
     0.00 Mb [hci0] 
     0.00 Mb [hci0] 
     0.00 Mb [kworker/u17:1] 
     0.00 Mb [iprt
     0.00 Mb [iprt
     0.00 Mb [kworker/1:0] 
     0.00 Mb [kworker/3:0] 
     0.00 Mb [kworker/0:0] 
     0.00 Mb [kworker/2:0] 
     0.00 Mb [kworker/u16:0] 
     0.00 Mb [kworker/u16:2] 
     0.00 Mb [kworker/3:2] 
     0.00 Mb [kworker/2:1] 
     0.00 Mb [kworker/1:2] 
     0.00 Mb [kworker/0:2] 
     0.00 Mb [kworker/2:2] 
     0.00 Mb [kworker/0:1] 
     0.00 Mb [scsi_eh_6] 
     0.00 Mb [scsi_tmf_6] 
     0.00 Mb [usb
     0.00 Mb [bioset] 
     0.00 Mb [kworker/3:1] 
     0.00 Mb [kworker/u16:1] 
63 голосов
/ 05 ноября 2015

А как же time?

Не Bash встроенный time, а тот, который вы можете найти с which time, например /usr/bin/time

Вот что на простом ls:

$ /usr/bin/time --verbose ls
(...)
Command being timed: "ls"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 2372
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 1
Minor (reclaiming a frame) page faults: 121
Voluntary context switches: 2
Involuntary context switches: 9
Swaps: 0
File system inputs: 256
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
38 голосов
/ 29 сентября 2009

Это отличная сводка инструментов и проблем: archive.org ссылка

Я процитирую это, так что больше разработчиков действительно прочтут это.

Если вы хотите проанализировать использование памяти всей системой или полностью проанализировать использование памяти одним приложением (а не только использование кучи), используйте exmap . Для анализа всей системы, найдите процессы с наиболее эффективным использованием, они занимают наибольший объем памяти на практике, находят процессы с самым высоким уровнем записи, они создают наибольшее количество данных (и, следовательно, возможно, имеют утечку или очень неэффективны при использовании данных). Выберите такое приложение и проанализируйте его отображения во втором просмотре списка. Смотрите раздел exmap для более подробной информации. Также используйте xrestop , чтобы проверить интенсивное использование ресурсов X, особенно если процесс сервера X занимает много памяти. Подробнее см. В разделе xrestop.

Если вы хотите обнаружить утечки, используйте valgrind или, возможно, kmtrace .

Если вы хотите проанализировать использование приложения кучей (malloc и т. Д.), Запустите его в memprof или с помощью kmtrace , профилируйте приложение и выполните поиск в дереве вызовов функций для Самые большие отчисления. Смотрите их разделы для более подробной информации.

26 голосов
/ 18 мая 2015

Помимо решений, перечисленных в ваших ответах, вы можете использовать команду Linux "top"; Он обеспечивает динамическое представление работающей системы в режиме реального времени, дает информацию об использовании процессора и памяти для всей системы, а также для каждой программы, в процентах:

top

для фильтрации по pid программы:

top -p <PID>

для фильтрации по имени программы:

top | grep <PROCESS NAME>

"top" предоставляет также некоторые поля, такие как:

VIRT - виртуальный образ (КБ): общий объем виртуальной памяти, используемой задачей

RES - Резидентный размер (КБ): физическая память без перестановки, используемая задачей; RES = КОД + ДАННЫЕ.

ДАННЫЕ - Данные + размер стека (КБ): объем физической памяти, выделяемый для исполняемого кода, отличного от размера, также известного как размер «резидентного набора данных» или DRS.

SHR - Размер общей памяти (КБ): объем общей памяти, используемой задачей. Он просто отражает память, которая потенциально может использоваться другими процессами.

Ссылка здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...