Jak mogę zmierzyć rzeczywiste zużycie pamięci przez aplikację lub proces?
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 systemie Linux, 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. Co to jest naprawdę robi to pokazanie, ile prawdziwej pamięci zajmowałby każdy proces , gdyby był jedynym uruchomionym procesem . Oczywiście, typowa Maszyna Linuksowa ma kilkadziesiąt uruchomionych w danym momencie procesów, co oznacza, że numery VSZ i RSS zgłaszane przezps
są prawie na pewno błędne .
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, a 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 program odpowiada 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.
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
2020-08-30 16:24:09
Wypróbuj PMAP polecenie:
sudo pmap -x <process pid>
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 / 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
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
2020-08-30 16:26:32
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.
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
2020-08-30 16:38:44
Nie ma łatwego sposobu, aby to obliczyć. Ale niektórzy próbowali uzyskać dobre odpowiedzi:
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
2020-08-30 16:28:37
Użycie smem, który jest alternatywą dla ps który oblicza USS i PSS dla każdego procesu. Pewnie chcesz 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 to 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ę 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 dlafizycznej pamięci.
Jak to porównuje do RSS jak donosi ps i inne narzędzia:
- 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 możesz użyć ps -A v
, nie musisz instalować zalecanej zależności Pythona i Matplotlib.
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
2020-08-30 16:50:16
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]
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
2019-01-03 02:52:21
Użyj time
.
NieBash wbudowany time
, ale ten, który można znaleźć za pomocą 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
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
2020-08-30 17:02:05
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. W przypadku analizy całego systemu Znajdź procesy o najwyższym efektywnym wykorzystaniu, zajmują one najwięcej pamięci w praktyce, znajdź procesy o najwyższym możliwym do zapisania zużyciu, tworzą najwięcej danych (a zatem prawdopodobnie przeciekają lub są bardzo nieefektywne w ich wykorzystaniu 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 przeanalizować sterta (malloc) 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.
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
2020-06-20 09:12:55
Oprócz rozwiązań wymienionych w odpowiedziach, możesz użyć linuksowego polecenia "top". Zapewnia dynamiczny widok uruchomionego systemu w czasie rzeczywistym, i 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 .
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
2020-08-30 17:01:17
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 biblioteki, 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ć uruchomiony w systemie bez ich zał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 / statusmoże dać wystarczająco dużo informacji o zużyciu pamięci w jednorazowo. Z drugiej strony, Valgrind da ci lepszy profil wykorzystania pamięci przez cały okres użytkowania programu.
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
2020-08-30 16:36:22
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.
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 wyświetlać szczegółowe informacje, ale znacznie spowalnia docelową aplikację i przez większość czasu zmienia jej zachowanie.
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ć w odniesieniu do "wykorzystania pamięci" jest następujące... W Linuksie ilość fizycznej pamięci pojedynczej proces może użyć można z grubsza podzielić na następujące kategorie.
-
M. A anonymous mapped memory
-
.P private
- .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 dostać copy-on-write I współdzielone między procesami (edytowane)
- .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 private
- .d dirty = = file mmapped written memory private
- .c clean = = mapped program / library text private mapped
-
.s shared
- .d dirty = = plik mm shared
- .c clean = = mapped library text shared mapped
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
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
2020-08-30 16:40:57
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
=============================================
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
2020-08-30 17:04:50
Jeszcze trzy metody do wypróbowania:
-
ps aux --sort pmem
Sortuje wyjście według%MEM
. -
ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
Używa rur. -
top -a
Zaczyna się od sortowania według%MEM
(wydobyto z tutaj)
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
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
Używam htop ; jest to bardzo dobry program konsolowy podobny do Windows Task Manager.
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
2020-08-30 16:44:21
Dobrym testem bardziej "rzeczywistego" użycia jest otwarcie aplikacji, uruchomienie vmstat -s
i sprawdzenie statystyk "aktywnej pamięci". Zamknij aplikację, odczekaj kilka sekund i uruchom ponownie vmstat -s
.
Jakkolwiek wiele aktywnej pamięci zostało zwolnionych, było widocznie w użyciu przez aplikację.
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
2020-08-30 16:43:19
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}'
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
2020-08-30 16:50:36
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 megabajtów lub gigabajtów jako rdzenia 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.
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
2020-08-30 16:53:11
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.
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
2020-08-30 16:27:54
Uwaga: działa to 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 stale szukać zmian i drukować je.
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
2020-08-30 16:56:33
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.
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
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.
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
Sprawdź ten skrypt powłoki, aby sprawdzić Użycie pamięci przez aplikację w Linuksie .
Jest również dostępny na Githubieoraz w wersji bez pasty i bc.
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
2020-08-30 16:54:27
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ć;)
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
2020-08-30 16:32:49
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 .
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
2020-08-30 16:57:30
- Last but not least use htop.
$ sudo apt-get update
$ sudo apt-get install htop
- Uruchom htop używając poniższego polecenia.
$ htop
- Uwaga dla początkujących: symbol dolara jest używany do pokazania, że uruchamiamy komendę na terminalu
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
2020-10-21 14:34:27
/ prox / xxx / numa_maps podaje tam jakieś info: N0=??? N1=???. Ale wynik ten może być niższy niż rzeczywisty wynik, ponieważ liczy się tylko te, które zostały dotknięte.
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-02-04 05:41:42
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ć
snmp
zainstalowane i uruchomione - {[1] } powinno być skonfigurowane tak, aby przyjmować żądania, z których zostanie uruchomiony poniższy skrypt (może być skonfigurowany w pliku snmpd.conf )
- powinieneś znać identyfikator procesu (PID) procesu, który 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 jest całkowitą kwotą prawdziwa pamięć systemowa przydzielona 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
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
2020-08-30 17:03:40