Jak zmierzyć rzeczywiste zużycie pamięci aplikacji lub procesu?

To pytanie jest omówione tutaj bardzo szczegółowo.

Jak zmierzyć zużycie pamięci aplikacji lub procesu w Linuksie?

Z artykułu na blogu zrozumienie wykorzystania pamięci w Linuksie, ps nie jest dokładnym narzędziem do wykorzystania w tym celu.

Dlaczego ps jest " źle "

W zależności od tego, jak na to patrzysz, ps nie raportuje rzeczywistego wykorzystania pamięci procesów. To, co naprawdę robi, pokazuje, jak wiele prawdziwej pamięci każdy proces zajęłby , gdyby był to jedyny proces działający . Oczywiście, typowa Maszyna Linuksowa ma kilkadziesiąt uruchomionych w danym momencie procesów, co oznacza, że numery VSZ i RSS zgłaszane przez ps są prawie na pewno błędne .

Author: Community, 2008-09-25

30 answers

Za pomocą ps lub podobnych narzędzi uzyskasz tylko ilość stron pamięci przydzielonych przez ten proces. Liczba ta jest poprawna, ale:

  • Nie odzwierciedla rzeczywistej ilości pamięci używanej przez aplikację, tylko ilość pamięci zarezerwowanej dla niej

  • Może być mylące, jeśli strony są współdzielone, na przykład przez kilka wątków lub za pomocą dynamicznie połączonych bibliotek

Jeśli naprawdę chcesz wiedzieć, jaką ilość pamięci ma Twoja aplikacja w rzeczywistości używa, musisz uruchomić go w profilerze. Na przykład valgrind może dać ci wgląd w ilość używanej pamięci oraz, co ważniejsze, W możliwe wycieki pamięci w twoim programie. Narzędzie do profilowania stosu valgrind nazywa się "massif":

/ Align = "left" / Wykonuje szczegółowe profilowanie sterty, wykonując regularne migawki sterty programu. Tworzy wykres pokazujący wykorzystanie sterty w czasie, w tym informacje o tym, które części programu są odpowiedzialny za najwięcej alokacji pamięci. Wykres jest uzupełniany przez plik tekstowy lub HTML, który zawiera więcej informacji do określenia, gdzie najwięcej pamięci jest przydzielane. Massif uruchamia programy około 20x wolniej niż normalnie.

Jak wyjaśniono w dokumentacja valgrind , musisz uruchomić program poprzez valgrind:

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

Massif zapisuje zrzut migawek użycia pamięci (np. massif.out.12345). Zapewniają one, (1) oś czasu wykorzystania pamięci, (2) dla każdego migawka-zapis miejsca w pamięci programu. Doskonałym narzędziem graficznym do analizy tych plików jest massif-visualizer. Ale znalazłem ms_print, proste narzędzie tekstowe dostarczane z valgrind, już bardzo pomocne.

Aby znaleźć wycieki pamięci, Użyj (domyślnie) memcheck Narzędzia valgrind.

 308
Author: ypnos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-24 17:58:29

Wypróbuj PMAP polecenie:

sudo pmap -x <process pid>
 226
Author: Anil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-22 11:21:58

Trudno powiedzieć na pewno, ale oto dwie "bliskie" rzeczy, które mogą pomóc.

$ ps aux 

Da Ci wirtualny Rozmiar (VSZ)

Możesz również uzyskać szczegółowe statystyki z systemu plików / proc, przechodząc do /proc/$pid/status

Najważniejszy jest VmSize, który powinien być zbliżony do tego, co daje 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

 176
Author: DustinB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-20 05:35:57

W najnowszych wersjach Linuksa, użyj podsystemu smaps . Na przykład dla procesu o PID 1234:

cat /proc/1234/smaps

Powie Ci dokładnie, ile pamięci zużywa w tym czasie. Co ważniejsze, dzieli pamięć na prywatną i współdzieloną, dzięki czemu możesz określić, ile pamięci używa twoja instancja programu, bez uwzględniania pamięci współdzielonej między wieloma instancjami programu.

 123
Author: Paul Biggar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-06 09:43:38

Nie ma łatwego sposobu, aby to obliczyć. Ale niektórzy próbowali uzyskać dobre odpowiedzi:

 120
Author: Bash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-06 13:11:05

Użycie smem, który jest alternatywą dla ps , który oblicza USS i PSS na proces. To, czego chcesz, to pewnie PSS.

  • USS - unikalny rozmiar zestawu. Jest to ilość nie udostępnionej pamięci unikalnej dla tego procesu (pomyśl o tym jako o U dla unikalnej pamięci). Nie obejmuje pamięci współdzielonej. Tak więc to Pod - zgłoś ilość pamięci używanej przez proces, ale jest pomocne, gdy chcesz zignorować udostępniane pamięć.

  • PSS - proporcjonalny rozmiar zestawu. Tego właśnie chcesz. Dodaje do siebie unikalną pamięć (USS), wraz z proporcją jej pamięci dzielonej podzielonej przez liczbę innych procesów dzielących tę pamięć. W ten sposób zapewni Ci dokładną reprezentację tego, ile rzeczywistej pamięci fizycznej jest używane na proces - z pamięcią dzieloną naprawdę reprezentowaną jako dzielona. Pomyśl o P byciu dla fizycznej pamięci.

Jak to porównuje do RSS, jak donosi ps i inne Utilities:

  • RSS - rozmiar zestawu Resident. Jest to ilość pamięci współdzielonej oraz pamięci nie udostępnionej używanej przez każdy proces. Jeśli jakiekolwiek procesy współdzielą pamięć, to over -zgłosi ilość faktycznie używanej pamięci, ponieważ ta sama pamięć dzielona będzie liczona więcej niż raz-pojawiając się ponownie w każdym innym procesie, który dzieli tę samą pamięć. Tak więc jest to dość zawodne, zwłaszcza gdy duża pamięć procesy mają wiele widełek - co jest powszechne na serwerze, z takimi procesami jak Apache lub PHP(fastcgi/FPM).

Uwaga: smem może również (opcjonalnie) generować wykresy, takie jak wykresy kołowe i tym podobne. IMO tego nie potrzebujesz. Jeśli chcesz używać go z linii poleceń, tak jak PS-A v, nie musisz instalować zalecanej zależności Pythona-matplotlib.

 88
Author: thomasrutter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-10 12:29:05

A co z time?

NieBash builtin time ale ten, który można znaleźć z which time, na przykład /usr/bin/time

Oto, co obejmuje, na prostej 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
 52
Author: Moonchild,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-04 21:51:08
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

Użyj tego jako root i możesz uzyskać wyraźne wyjście dla wykorzystania pamięci przez każdy proces.

PRZYKŁAD WYJŚCIA:

     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] 
 45
Author: Lokendra Singh Rawat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-01 20:34:36

To doskonałe podsumowanie narzędzi i problemów: archive.org link

Zacytuję to, aby więcej programistów faktycznie go przeczytało.

Jeśli chcesz przeanalizować wykorzystanie pamięci całego systemu lub dokładnie przeanalizować wykorzystanie pamięci jednej aplikacji( nie tylko jej wykorzystanie sterty), użyj exmap. Do analizy całego systemu, Znajdź procesy o najwyższym efektywnym wykorzystaniu, zajmują najwięcej pamięci w praktyce, znajdź procesy o najwyższym zapisywalnym wykorzystanie, tworzą najwięcej danych (a zatem prawdopodobnie wyciek lub są bardzo nieefektywne w ich wykorzystanie danych). Wybierz taką aplikację i przeanalizuj jej mapowania w drugim widoku listy. Więcej szczegółów można znaleźć w sekcji exmap. Użyj również xrestop, aby sprawdzić wysokie wykorzystanie zasobów X, zwłaszcza jeśli proces serwera X zajmuje dużo pamięci. Szczegółowe informacje można znaleźć w sekcji xrestop.

Jeśli chcesz wykryć wycieki, użyj valgrind lub ewentualnie kmtrace .

Jeśli chcesz analizować stertę (malloc itp.) użycie aplikacji, uruchom ją w memprof lub z kmtrace , profiluj aplikację i przeszukaj drzewo wywołań funkcji w poszukiwaniu największych przydziałów. Więcej szczegółów można znaleźć w ich sekcjach.

 38
Author: phoku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-31 17:38:12

Oprócz rozwiązań wymienionych w Twoich odpowiedziach, możesz użyć polecenia Linuksa "top"; zapewnia dynamiczny widok uruchomionego systemu w czasie rzeczywistym, podaje zużycie procesora i pamięci, dla całego systemu wraz z każdym programem, w procentach:

top

Aby filtrować przez program pid:

top -p <PID>

Aby filtrować według nazwy programu:

top | grep <PROCESS NAME>

"top" zawiera również pola takie jak:

VIRT -- Virtual Image (kb): całkowita ilość pamięci wirtualnej używanej przez zadanie

RES -- Resident size (kb): Nie-zamieniona pamięć fizyczna użyta przez zadanie ; RES = Kod + dane.

DATA -- Data+rozmiar stosu (kb): Ilość pamięci fizycznej poświęconej innemu kodowi niż wykonywalny, znana również jako rozmiar "zestawu danych rezydentnych" lub DRS.

SHR -- Shared mem size (kb): Ilość pamięci dzielonej używanej przez zadanie. Po prostu odzwierciedla pamięć, która może być potencjalnie współdzielona z innymi procesami.

Odniesienie tutaj .

 24
Author: Yahya Yahyaoui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-18 08:58:38

Nie ma na to ani jednej odpowiedzi, ponieważ nie można precyzyjnie wskazać ilości pamięci używanej przez proces. Większość procesów pod Linuksem używa bibliotek współdzielonych. Na przykład, powiedzmy, że chcesz obliczyć zużycie pamięci dla procesu 'ls'. Czy liczysz tylko pamięć używaną przez plik wykonywalny 'ls' (jeśli możesz ją wyizolować) ? Może libc? Lub wszystkie inne libs, które są wymagane do uruchomienia '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)

Można argumentować, że są one współdzielone przez inne procesy, ale 'ls' nie może być uruchom system bez ich ładowania.

Ponadto, jeśli chcesz wiedzieć, ile pamięci potrzebuje proces do planowania pojemności, musisz obliczyć, ile zużywa każda dodatkowa kopia procesu. Myślę, że /proc / PID / status może dać wystarczająco dużo informacji o zużyciu pamięci za jednym razem. Z drugiej strony, valgrind da ci lepszy profil wykorzystania pamięci przez cały okres użytkowania programu

 17
Author: Dprado,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 02:44:26

Jeśli Twój kod jest w C lub c++ możesz być w stanie użyć getrusage(), który zwraca Ci różne statystyki dotyczące wykorzystania pamięci i czasu Twojego procesu.

Nie wszystkie platformy to jednak obsługują i zwrócą wartości 0 dla opcji użycia pamięci.

Zamiast tego możesz spojrzeć na wirtualny plik utworzony w /proc/[pid]/statm (Gdzie {[2] } jest zastępowany przez Twój Identyfikator procesu. Możesz to uzyskać z getpid()).

Ten plik będzie wyglądał jak plik tekstowy z 7 liczbami całkowitymi. Jesteś prawdopodobnie najbardziej zainteresowany pierwszy (all memory use) i szósty (data memory use) numery w tym pliku.

 14
Author: CashCow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-18 13:02:23

Valgrind może pokazać szczegółowe informacje, ale to spowalnia aplikację docelową znacznie, a przez większość czasu zmienia zachowanie aplikacji.
Exmap był czymś, czego jeszcze nie wiedziałem, ale wydaje się, że potrzebujesz modułu jądra, aby uzyskać informacje, co może być przeszkodą.

Zakładam, że to, co każdy chce wiedzieć WRT "wykorzystanie pamięci" jest następujące...
W Linuksie ilość pamięci fizycznej, jaką może użyć pojedynczy proces, może być z grubsza podzielone na następujące kategorie.

  • M. A anonymous mapped memory

    • .P prywatne
      • .d dirty = = malloc / mmapped heap and stack alokowana i zapisywana pamięć
      • .c clean = = malloc / mmapped pamięć stosu i stosu raz przydzielona, zapisana, a następnie zwolniona, ale jeszcze nie odzyskana
    • .s shared
      • .d dirty = = malloc / mmaped heap może uzyskać copy-on-write i udostępniać między procesami [edytuj]
      • .c clean = = malloc / mmaped heap może uzyskać copy-on-write i udostępniać między procesami (edited)
  • M. n nazwanej pamięci mapowanej

    • .P prywatne
      • .d dirty = = file mmapped written memory private
      • .c clean = = mapped program / library text private mapped
    • .s shared
      • .d dirty = = file mmapped written memory shared
      • .c clean = = Maped tekst biblioteki współdzielony mapowany

Narzędzie zawarte w Androidzie o nazwie showmap jest całkiem przydatne

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
 12
Author: holmes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-31 00:53:52

Używam htop; jest to bardzo dobry program konsolowy podobny do Menedżera zadań Windows.

 9
Author: Tomasz Dzięcielewski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-20 09:32:13

Valgrind jest niesamowity, jeśli masz czas, aby go uruchomić. valgrind --tool=massif jest właściwym rozwiązaniem.

Jednak zaczynam uruchamiać większe przykłady, a używanie valgrind nie jest już praktyczne. Czy istnieje sposób na określenie maksymalnego wykorzystania pamięci (modulo page size i shared pages) programu?

Na prawdziwym systemie unix, /usr/bin/time -v działa. W Linuksie to jednak działa , a nie .

 9
Author: Joshua Pinter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-23 21:24:37

Jeszcze trzy metody do wypróbowania:

  1. ps aux --sort pmem
    Sortuje wyjście według %MEM.
  2. ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
    Używa rur.
  3. top -a
    Zaczyna się od sortowania według %MEM

(wydobyto z tutaj)

 9
Author: Thomas Shaiker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-02 20:45:49
#!/bin/ksh
#
# Returns total memory used by process $1 in kb.
#
# See /proc/NNNN/smaps if you want to do something
# more interesting.
#

IFS=$'\n'

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

print $kb
 8
Author: pokute,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-09 20:58:42

Dobrym testem bardziej "rzeczywistego" użycia jest otwarcie aplikacji, następnie uruchomienie vmstat -s i sprawdzenie statystyki "aktywnej pamięci". Zamknij aplikację, odczekaj kilka sekund i uruchom ponownie vmstat -s. Jednak wiele aktywnej pamięci został zwolniony był ewidentnie w użyciu przez aplikację.

 7
Author: Nick W.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-20 05:33:25

Poniższy wiersz poleceń poda całkowitą pamięć używaną przez różne procesy działające na komputerze z Linuksem w MB

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 "" }' | awk '{total=total + $1} END {print total}'
 5
Author: Vineeth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-20 05:32:42

Get valgrind. daj mu swój program do uruchomienia, a powie Ci wiele o jego wykorzystaniu pamięci.

Dotyczy to tylko programu, który działa przez jakiś czas i zatrzymuje się. Nie wiem, czy valgrind może dostać w swoje ręce już uruchomiony proces, czy nie powinien zatrzymywać takich procesów jak demony.

 4
Author: DarenW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-25 04:21:57

Jeśli proces nie zużywa zbyt dużo pamięci (ponieważ spodziewasz się, że tak będzie, lub inne polecenie podało to początkowe wskazanie), a proces może wytrzymać zatrzymanie przez krótki okres czasu, możesz spróbować użyć polecenia gcore.

gcore <pid>

Sprawdź rozmiar wygenerowanego pliku core, aby dowiedzieć się, ile pamięci zużywa dany proces.

To nie będzie działać zbyt dobrze, jeśli proces używa setek megs, lub gigs, jako rdzeń generowanie może potrwać kilka sekund lub minut w zależności od wydajności We/Wy. Podczas tworzenia rdzenia Proces jest zatrzymywany (lub "zamrożony"), aby zapobiec zmianom w pamięci. Więc bądź ostrożny.

Upewnij się również, że punkt montowania, w którym generowany jest rdzeń, ma dużo miejsca na dysku i że system nie zareaguje negatywnie na plik rdzenia tworzony w danym katalogu.

 4
Author: Rocco Corsi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-20 09:31:25

Edit: to działa w 100% dobrze tylko wtedy, gdy zużycie pamięci wzrasta

Jeśli chcesz monitorować zużycie pamięci przez dany proces (lub grupę przetwarzanych współdzielonych nazw, np. google-chrome, możesz użyć my bash-script:

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

To będzie nieustannie szukać zmian i je drukować.

Tutaj wpisz opis obrazka

 3
Author: test30,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-07 13:35:44

Jeśli chcesz czegoś szybszego niż profilowanie za pomocą Valgrind, a twoje jądro jest starsze i nie możesz używać smaps, ps z opcjami pokazywania rezydentnego zestawu procesu (z ps -o rss,command) może dać ci szybką i rozsądną _aproximation_ rzeczywistą ilość używanej nie wymienionej pamięci.

 3
Author: juanjux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-20 05:34:37

Sprawdź skrypt powłoki, aby sprawdzić Użycie pamięci przez aplikację w Linuksie . Dostępne również na github oraz w wersji bez pasty i bc.

 2
Author: Bobbin Zachariah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-26 07:32:34

Sugerowałbym użycie atopu. Wszystko na ten temat znajdziesz na tej stronie. Jest w stanie zapewnić wszystkie niezbędne KPI dla procesów, a także może przechwytywać do pliku.

 2
Author: Jain Rach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-15 22:40:28

Używam Arch Linux i jest taki wspaniały pakiet o nazwie ps_mem

ps_mem -p <pid>

Przykładowe Wyjście

$ 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
=============================================
 2
Author: GypsyCosmonaut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-17 19:57:52

Kolejny głos na valgrind tutaj, ale chciałbym dodać, że możesz użyć narzędzia typu Alleyoop, aby pomóc Ci zinterpretować wyniki generowane przez valgrind.

Używam tych dwóch narzędzi cały czas i zawsze mam chudy, nie wyciekający kod, aby z dumą go pokazać;)

 1
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-31 11:25:37

Podczas gdy to pytanie wydaje się być o zbadanie aktualnie uruchomionych procesów, chciałem zobaczyć pamięć szczytową używaną przez aplikację od początku do końca. Oprócz valgrind, możesz użyć tstime , co jest znacznie prostsze. Mierzy zużycie pamięci "highwater" (RSS i virtual). Z tej odpowiedzi .

 1
Author: jtpereyda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:36:27

Użyj wbudowanego GUI ' system monitor ' dostępnego w ubuntu

 0
Author: Sudheesh.M.S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-18 13:07:23

na podstawie odpowiedzi na powiązane pytanie .

Możesz użyć SNMP, aby uzyskać wykorzystanie pamięci i procesora procesu w konkretnym urządzeniu w sieci:)

Wymagania:

  • urządzenie uruchamiające proces powinno mieć zainstalowany i uruchomiony snmp
  • snmp powinien być skonfigurowany tak, aby przyjmował żądania, z których będzie uruchamiany poniższy skrypt(może być skonfigurowany w snmpd.conf)
  • powinieneś znać identyfikator procesu (pid) chcesz monitorować

Uwagi:

  • HOST-RESOURCES-MIB:: hrSWRunPerfCPU oznacza liczbę centi-sekund całkowitych zasobów procesora systemu zużywanych przez ten proces. Zauważ, że w systemie wieloprocesorowym wartość ta może wzrosnąć o więcej niż jedną Centi-sekundę w jedną centi-sekundę rzeczywistego (zegar ścienny) czasu.

  • HOST-RESOURCES-MIB:: hrSWRunPerfMem całkowita ilość rzeczywistej pamięci systemowej przypisane do tego procesu.

**

Skrypt monitorowania procesu:

**

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
 0
Author: Roselyn Verbo Domingo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:36