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

этот вопрос транслируется здесь в мельчайших подробностях.

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

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

почему ps "неправильно"

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

30 ответов


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

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

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

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

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

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

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

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

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


попробовать pmap:

sudo pmap -x <process pid>

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

$ 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


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

cat /proc/1234/smaps

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


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


использовать smem, что является альтернативой ps который вычисляет USS и PSS для каждого процесса. То, что вы хотите, вероятно, PSS.

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

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

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

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

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


насчет time ?

не Баш builtin 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

ps -eo size,pid,user,command --sort -size | awk '{ hr=/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=/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] 

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

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

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

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

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


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

top

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

top -p <PID>

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

top | grep <PROCESS NAME>

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

VIRT -- Virtual Image (kb): общее количество виртуальная память, используемая задачей

RES -- Resident size (kb): физическая память без замены, используемая задачей ; RES = код + данные.

DATA -- Data+Stack size (kb): объем физической памяти, предназначенной для другого, чем исполняемый код, также известный как размер "резидентного набора данных" или DRS.

SHR -- Shared mem size (kb): объем общей памяти, используемой задачей. Он просто отражает память, которая потенциально может быть разделена с другими процессы.

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


для этого нет единого ответа, потому что вы не можете точно указать объем памяти, используемый процессом. Большинство процессов под linux используют общие библиотеки. Например, предположим, вы хотите рассчитать использование памяти для процесса "ls". Считаете ли вы только память, используемую исполняемым " ls " (если вы можете ее изолировать) ? Как насчет libc? Или все эти другие библиотеки, которые требуются для запуска "ls"?

linux-gate.so.1 =>  (0x00ccb000)
librt.so.1 => /lib/librt.so.1 (0x06bc7000)
libacl.so.1 => /lib/libacl.so.1 (0x00230000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00162000)
libc.so.6 => /lib/libc.so.6 (0x00b40000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00cb4000)
/lib/ld-linux.so.2 (0x00b1d000)
libattr.so.1 => /lib/libattr.so.1 (0x00229000)
libdl.so.2 => /lib/libdl.so.2 (0x00cae000)
libsepol.so.1 => /lib/libsepol.so.1 (0x0011a000)

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

кроме того, если вам нужно знать, сколько памяти требуется процессу для планирования емкости, вы должны рассчитать, сколько использует каждая дополнительная копия процесса. Я думаю, что /proc / PID / status может дать вам достаточно информации об использовании памяти за один раз. С другой стороны, valgrind даст вам лучший профиль использования памяти в течение всего срока службы программы


если ваш код на C или c++ , вы можете использовать getrusage() который возвращает вам различные статистические данные об использовании памяти и времени вашего процесса.

не все платформы поддерживают это, хотя и вернут 0 значений для параметров использования памяти.

вместо этого вы можете посмотреть виртуальный файл, созданный в /proc/[pid]/statm (где [pid] заменяется идентификатором процесса. Вы можете получить это от getpid()).

этот файл будет выглядеть как текстовый файл с 7 числа. Вы вероятно, больше всего интересуют первые (Все использование памяти) и шестые (использование памяти данных) номера в этом файле.


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

Я предполагаю, что все хотят знать WRT "использование памяти" следующее...
В linux количество физическую память, которую может использовать один процесс, можно условно разделить на следующие категории.

  • M. анонимная отображенная память

    • .P частные
      • .d dirty == malloc / mmapped куча и стек выделенной и записанной памяти
      • .c clean == malloc / mmapped куча и стек памяти после выделения, записи, а затем освобождены, но еще не исправлены
    • .с общий
      • .d dirty ==malloc / mmaped куча может получить копирование на запись и совместно между процессами (отредактировано)
      • .c clean ==malloc / mmaped куча может получить копирование на запись и совместно между процессами (отредактировано)
  • M. n с именем сопоставленная память

    • .P частные
      • .d dirty = = файл mmapped записанная память private
      • .с clean == сопоставленный текст программы / библиотеки private mapped
    • .с общей
      • .d dirty = = файл mmapped записанная память общая
      • .c clean == сопоставленный текст библиотеки общий сопоставленный

утилита, включенная в Android под названием showmap - Это довольно полезное

virtual                    shared   shared   private  private
size     RSS      PSS      clean    dirty    clean    dirty    object
-------- -------- -------- -------- -------- -------- -------- ------------------------------
       4        0        0        0        0        0        0 0:00 0                  [vsyscall]
       4        4        0        4        0        0        0                         [vdso]
      88       28       28        0        0        4       24                         [stack]
      12       12       12        0        0        0       12 7909                    /lib/ld-2.11.1.so
      12        4        4        0        0        0        4 89529                   /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
      28        0        0        0        0        0        0 86661                   /usr/lib/gconv/gconv-modules.cache
       4        0        0        0        0        0        0 87660                   /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
       4        0        0        0        0        0        0 89528                   /usr/lib/locale/en_US.utf8/LC_TELEPHONE
       4        0        0        0        0        0        0 89527                   /usr/lib/locale/en_US.utf8/LC_ADDRESS
       4        0        0        0        0        0        0 87717                   /usr/lib/locale/en_US.utf8/LC_NAME
       4        0        0        0        0        0        0 87873                   /usr/lib/locale/en_US.utf8/LC_PAPER
       4        0        0        0        0        0        0 13879                   /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
       4        0        0        0        0        0        0 89526                   /usr/lib/locale/en_US.utf8/LC_MONETARY
       4        0        0        0        0        0        0 89525                   /usr/lib/locale/en_US.utf8/LC_TIME
       4        0        0        0        0        0        0 11378                   /usr/lib/locale/en_US.utf8/LC_NUMERIC
    1156        8        8        0        0        4        4 11372                   /usr/lib/locale/en_US.utf8/LC_COLLATE
     252        0        0        0        0        0        0 11321                   /usr/lib/locale/en_US.utf8/LC_CTYPE
     128       52        1       52        0        0        0 7909                    /lib/ld-2.11.1.so
    2316       32       11       24        0        0        8 7986                    /lib/libncurses.so.5.7
    2064        8        4        4        0        0        4 7947                    /lib/libdl-2.11.1.so
    3596      472       46      440        0        4       28 7933                    /lib/libc-2.11.1.so
    2084        4        0        4        0        0        0 7995                    /lib/libnss_compat-2.11.1.so
    2152        4        0        4        0        0        0 7993                    /lib/libnsl-2.11.1.so
    2092        0        0        0        0        0        0 8009                    /lib/libnss_nis-2.11.1.so
    2100        0        0        0        0        0        0 7999                    /lib/libnss_files-2.11.1.so
    3752     2736     2736        0        0      864     1872                         [heap]
      24       24       24        0        0        0       24 [anon]
     916      616      131      584        0        0       32                         /bin/bash
-------- -------- -------- -------- -------- -------- -------- ------------------------------
   22816     4004     3005     1116        0      876     2012 TOTAL

Я использую htop; Это очень хорошая консольная программа, похожая на Диспетчер задач Windows.


Valgrind удивительно, если у вас есть время, чтобы запустить его. valgrind --tool=massif является правильным решением.

тем не менее, я начинаю запускать большие примеры, и использование valgrind больше не практично. Есть ли способ определить максимальное использование памяти (размер страницы по модулю и общие страницы) программы?

в реальной системе unix,/usr/bin/time -v строительство. В Linux, однако, это делает не работа.


более трех способов:

  1. ps aux --sort pmem
    Он сортирует вывод по %MEM.
  2. ps aux | awk '{print , , }' | sort -k2r | head -n 15
    Он сортирует с помощью труб.
  3. top -a
    Он начинает верхнюю сортировку по %MEM

(взято из здесь)


#!/bin/ksh
#
# Returns total memory used by process  in kb.
#
# See /proc/NNNN/smaps if you want to do something
# more interesting.
#

IFS=$'\n'

for line in $(</proc//smaps)
do
   [[ $line =~ ^Size:\s+(\S+) ]] && ((kb += ${.sh.match[1]}))
done

print $kb

хороший тест более" реального мира " использования, чтобы открыть приложение, а затем запустить vmstat -s и проверьте статистику "активная память". Закройте приложение, подождите несколько секунд и запустите vmstat -s снова. Однако сколько активной памяти было освобождено, очевидно, используется приложением.


ниже командной строки даст вам общую память, используемую различным процессом, запущенным на машине Linux в MB

ps -eo size,pid,user,command --sort -size | awk '{ hr=/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | awk '{total=total + } END {print total}'

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

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


Если процесс не использует слишком много памяти (либо потому, что вы ожидаете, что это так, или какая-то другая команда дала этот первоначальный признак), и процесс может выдержать остановку в течение короткого периода времени, вы можете попробовать использовать команду gcore.

gcore <pid>

проверьте размер сгенерированного файла ядра, чтобы получить хорошее представление о том, сколько памяти использует конкретный процесс.

Это не будет работать слишком хорошо, если процесс использует сотни мегабайт или гигабайт, поскольку генерация ядра может занять несколько секунд или минут в зависимости от производительности ввода-вывода. Во время создания ядра процесс останавливается (или "замораживается"), чтобы предотвратить изменения памяти. Так что будьте осторожны.

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


Edit:это работает на 100% хорошо, только когда потребление памяти увеличивается

Если вы хотите контролировать использование памяти данным процессом (или группой обработанных общих имен, например google-chrome, вы можете использовать мой bash-скрипт:

while true; do ps aux | awk ‚{print , }’ | grep chrome | sort -n > /tmp/a.txt; sleep 1; diff /tmp/{b,a}.txt; mv /tmp/{a,b}.txt; done;

это будет постоянно искать изменения и распечатать их.

enter image description here


Если вы хотите что-то быстрее, чем профилирование с Valgrind, и ваше ядро старше, и вы не можете использовать smaps, ps с параметрами для отображения резидентного набора процесса (с ps -o rss,command) могут дать вам быстрый и разумный _aproximation_ реального объема используемой памяти без замены.


Проверьте сценарий оболочки, чтобы проверить использование памяти приложением в linux. Также доступно на github и в версии без пасты и bc.


Я бы предложил вам использовать atop. Вы можете найти все об этом на на этой странице. Он способен обеспечить все необходимые KPI для процессов, а также может захватить в файл.


Я использую Arch Linux, и есть этот замечательный пакет под названием ps_mem

ps_mem -p <pid>

Пример Вывода

$ ps_mem -S -p $(pgrep firefox)

Private   +   Shared  =  RAM used   Swap used   Program

355.0 MiB +  38.7 MiB = 393.7 MiB    35.9 MiB   firefox
---------------------------------------------
                        393.7 MiB    35.9 MiB
=============================================

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

Я использую два инструмента все время и всегда имею худой, не протекающий код, чтобы с гордостью показать его;)


хотя этот вопрос, похоже, касается изучения текущих процессов, я хотел увидеть пиковую память, используемую приложением от начала до конца. Кроме valgrind, вы можете использовать tstime, что гораздо проще. Он измеряет использование памяти" highwater " (RSS и virtual). От ответ.


используйте встроенный 'мониторинг системы ' GUI инструмент доступен в ubuntu


на основе ответа на связанный вопрос.

вы можете использовать SNMP для получения памяти и использования процессора процесса на определенном устройстве в сети:)

требования:

  • на устройстве, на котором выполняется процесс, должен быть установлен и запущен snmp
  • snmp должен быть настроен для приема запросов, из которых вы будете запускать скрипт ниже(он может быть настроен в snmpd будет.conf)
  • вы должны знать идентификатор процесса(PID) процесса, который вы хотите контролировать

Примечания:

  • хост-ресурсы-MIB:: hrSWRunPerfCPU - это количество centi-секунд общих ресурсов процессора системы, потребляемых этим процессом. Обратите внимание, что в многопроцессорной системе это значение может увеличиваться более чем на одну центи-секунду в одной центи-секунде реального (настенные часы) время.

  • хост-ресурсы-MIB:: hrSWRunPerfMem - общий объем реальной системной памяти, выделенной для этого процесса.

**

процесс мониторинга скрипт:

**

echo "IP: "
read ip
echo "specfiy pid: "
read pid
echo "interval in seconds:"
read interval

while [ 1 ]
do
    date
    snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfCPU.$pid
    snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfMem.$pid
    sleep $interval;
done