는 방법을 측정하는 실제적인 메모리 사용법의 응용 프로그램 또는 공정입니까?
문제
이 질문은 커버 기 훌륭한 세부 사항입니다.
당신은 어떻게 측정하는 메모리 사용법의 응용 프로그램 또는 프로세스에서의 리눅스?
블로그에서 문의 이해 메모리 사용량에서 리눅스, ps
하지 않은 정확한 도구를 사용하는을 위한 이도 있었습니다.
유
ps
은"잘못된"에 따라 어떻게 당신이 그것을 보면,
ps
은 보고되지 않은 실의 메모리 사용량을 처리합니다.그것이 무엇인지 정말 하고 있는 방법을 보여주는 많은 실시 메모리를 각 과정에 소요될 것입 경우에만 실행하는 프로세스.물론,전형적인 Linux 기계는 여러 가지 다스 프로세스를 실행하는 주어진 시간에는 것을 의미 VSZ 및 RSS 번호에 의해 보고ps
은 거의 확실히 잘못된.
해결책
와 함께 ps
또는 유사한 도구는 해당 프로세스에 의해 할당 된 메모리 페이지의 양만 받게됩니다. 이 숫자는 정확하지만 :
응용 프로그램에서 사용하는 실제 메모리 양을 반영하지 않으며 예약 된 메모리 양만 반영합니다.
예를 들어 여러 스레드가 또는 동적으로 연결된 라이브러리를 사용하여 페이지를 공유하는 경우 오해의 소지가있을 수 있습니다.
응용 프로그램에서 실제로 사용하는 메모리의 양을 정말로 알고 싶다면 프로파일 러 내에서 실행해야합니다. 예를 들어, valgrind
사용 된 메모리의 양과 프로그램에서 메모리 누출 가능성에 대한 통찰력을 줄 수 있습니다. Valgrind의 힙 프로파일 러 도구를 'Massif'라고합니다.
Massif는 힙 프로파일 러입니다. 프로그램 힙의 정기적 인 스냅 샷을 가져 와서 세부 힙 프로파일 링을 수행합니다. 프로그램의 어느 부분이 가장 메모리 할당을 담당하는지에 대한 정보를 포함하여 시간이 지남에 따라 힙 사용을 보여주는 그래프를 생성합니다. 그래프는 가장 많은 메모리가 할당되는 위치를 결정하기위한 자세한 정보가 포함 된 텍스트 또는 HTML 파일로 보완됩니다. Massif는 평소보다 약 20 배 느린 프로그램을 운영합니다.
설명 된 바와 같이 Valgrind 문서, Valgrind를 통해 프로그램을 실행해야합니다.
valgrind --tool=massif <executable> <arguments>
Massif는 메모리 사용 덤프 덤프 스냅 샷을 씁니다 (예 : massif.out.12345
). 이들은 (1) 메모리 사용의 타임 라인, (2) 각 스냅 샷에 대해 프로그램 메모리가 할당 된 위치에 대한 기록을 제공합니다. 이 파일을 분석하기위한 훌륭한 그래픽 도구는 다음과 같습니다 대규모 방문자. 그러나 나는 찾았다 ms_print
, Valgrind와 함께 제공되는 간단한 텍스트 기반 도구는 이미 큰 도움이됩니다.
메모리 누출을 찾으려면 (기본값)를 사용하십시오. memcheck
Valgrind의 도구.
다른 팁
시도해보십시오 오후 명령:
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 하위 시스템. 예를 들어, 1234의 PID가있는 프로세스의 경우 :
cat /proc/1234/smaps
그 당시에 얼마나 많은 메모리를 사용하고 있는지 정확히 알려줄 것입니다. 더 중요한 것은 메모리를 비공개로 나누고 공유 할 것이므로 메모리가 얼마나 많은지 알 수 있습니다. 사례 프로그램의 여러 인스턴스간에 메모리 공유를 포함하지 않고 프로그램 중 사용 중입니다.
이것을 계산하는 쉬운 방법은 없습니다. 그러나 어떤 사람들은 좋은 답변을 얻으려고 노력했습니다.
사용 smem, 그것은 대안입니다 추신 프로세스 당 USS 및 PSS를 계산합니다. 당신이 원하는 것은 아마도 PSS 일 것입니다.
USS - 고유 한 세트 크기. 이것은 해당 프로세스에 고유 한 샤워되지 않은 메모리의 양입니다 ( 유 ~을 위한 독특한 메모리). 공유 메모리는 포함되지 않습니다. 따라서 이것은 할 것입니다 아래에-프로세스가 사용하는 메모리의 양을보고하지만 공유 메모리를 무시할 때 도움이됩니다.
PSS - 비례 세트 크기. 이것이 당신이 원하는 것입니다. 공유 메모리의 비율을 해당 메모리를 공유하는 다른 프로세스의 수로 나눈 고유 메모리 (USS)를 추가합니다. 따라서 프로세스 당 실제 물리적 메모리가 얼마나 많이 사용되는지에 대한 정확한 표현을 제공합니다. 공유 메모리는 실제로 공유 된 것으로 표시됩니다. 생각하십시오 피 존재하는 물리적 인 메모리.
이것이보고 된 RSS와 어떻게 비교되는지 추신 그리고 다른기구 :
- RSS - 상주 세트 크기. 이것은 각 프로세스에서 사용하는 공유 메모리와 공유되지 않은 메모리의 양입니다. 프로세스가 메모리를 공유하면 그렇습니다 ~ 위에- 동일한 공유 메모리가 두 번 이상 계산되기 때문에 실제로 사용되는 메모리의 양을보고합니다. 동일한 메모리를 공유하는 서로 프로세스에 다시 나타납니다. 따라서 그것은입니다 꽤 신뢰할 수없는 것, 특히 높은 메모리 프로세스에 많은 포크가있는 경우, 아파치 또는 PHP (FASTCGI/FPM) 프로세스와 같은 서버에서 일반적입니다.
통지 : SMEM은 또한 (선택적으로) 파이 차트 등과 같은 출력 그래프를 할 수 있습니다. IMO 당신은 그 중 아무것도 필요하지 않습니다. PS -A V를 사용할 수있는 것처럼 명령 줄에서 사용하려면 Python -Matplotlib 권장 종속성을 설치할 필요가 없습니다.
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
이것을 루트로 사용하면 각 프로세스에서 메모리 사용에 대한 명확한 출력을 얻을 수 있습니다.
출력 예 :
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]
는 어때 time
?
아닙니다 세게 때리다 내장 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
이것은 도구와 문제에 대한 훌륭한 요약입니다. archive.org 링크
더 많은 개발자가 실제로 읽을 수 있도록 인용하겠습니다.
전체 시스템의 메모리 사용량을 분석하거나 하나의 응용 프로그램의 메모리 사용량을 철저히 분석하려면 (힙 사용뿐만 아니라) exmap. 전체 시스템 분석을 위해, 효과적인 사용량이 가장 높은 프로세스를 찾아 내고 실제로 가장 메모리를 취하고, 가장 높은 서면 사용량으로 프로세스를 찾으면, 가장 많은 데이터를 생성합니다 (따라서 데이터 사용량이 누출되거나 매우 효과적 일 수 있음). 이러한 애플리케이션을 선택하고 두 번째 ListView에서 매핑을 분석하십시오. 자세한 내용은 Exmap 섹션을 참조하십시오. 또한 사용하십시오 xrestop 특히 X 서버의 프로세스에 많은 메모리가 필요한 경우 X 리소스의 높은 사용을 확인합니다. 자세한 내용은 Xrestop 섹션을 참조하십시오.
누출을 감지하려면 사용하십시오 Valgrind 또는 아마도 kmtrace.
힙 (malloc 등)을 분석하려면 응용 프로그램의 사용을 사용하려면 실행하십시오. Memprof 또는 함께 kmtrace, 응용 프로그램을 프로파일하고 가장 큰 할당을 위해 함수 호출 트리를 검색하십시오. 자세한 내용은 섹션을 참조하십시오.
당신의 답변에 나열된 솔루션 외에도 Linux 명령 "Top"을 사용할 수 있습니다. 실행 시스템의 역동적 인 실시간보기를 제공하며 전체 시스템과 함께 전체 시스템에 대한 CPU 및 메모리 사용량을 백분율로 제공합니다.
top
프로그램 PID에 의해 필터링하려면 :
top -p <PID>
프로그램 이름으로 필터링하려면 :
top | grep <PROCESS NAME>
"Top"은 다음과 같은 일부 필드도 제공합니다.
virt -Virtual Image (KB) : 작업에서 사용하는 가상 메모리의 총량
RES-Resident Size (KB) : 작업이 사용하지 않은 물리적 메모리; RES = 코드 + 데이터.
데이터 - 데이터+스택 크기 (KB) : '데이터 거주 세트'크기 또는 DRS라고도하는 실행 가능한 코드 이외의 다른 물리적 메모리의 양.
SHR- 공유 MEM 크기 (KB) : 작업에서 사용하는 공유 메모리의 양. 그것은 단순히 다른 프로세스와 잠재적으로 공유 할 수있는 메모리를 반영합니다.
참조 여기.
거기에 하나의 대답이기 때문에 고정할 수 없습점 정확한 양의 메모리 프로세스를 사용합니다.대부분의 프로세스에서 리눅스를 사용한 공유 라이브러리입니다.예를 들어,당신을 계산하고 싶은 메모리 사용량에 대한'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/상태에 당신을 줄 수 있는 충분한 정보의 메모리 사용량에 하나의 시간입니다.다른 한편으로,valgrind 을 줄 것이다 당신은 더 나은 프로필 메모리의 사용 수명 동안의 프로그램
코드가 C 또는 C ++ 인 경우 사용할 수 있습니다. getrusage()
프로세스의 메모리 및 시간 사용에 대한 다양한 통계를 반환합니다.
모든 플랫폼이이를 지원하는 것은 아니며 메모리 사용 옵션에 대해 0 값을 반환합니다.
대신 생성 된 가상 파일을 볼 수 있습니다. /proc/[pid]/statm
(어디 [pid]
프로세스 ID로 대체됩니다. 당신은 이것을 얻을 수 있습니다 getpid()
).
이 파일은 정수 7 개가있는 텍스트 파일처럼 보입니다. 이 파일의 첫 번째 (모든 메모리 사용) 및 여섯 번째 (데이터 메모리 사용) 숫자에 가장 관심이있을 수 있습니다.
Valgrind 자세한 정보를 보여줄 수 있지만 속도가 느려집니다 대상 응용 프로그램은 크게, 대부분 앱의 동작을 변경합니다.
exmap 아직 몰랐지만 커널 모듈 정보를 얻으려면 장애물이 될 수 있습니다.
나는 모두가 WRT "메모리 사용"을 알고 싶어하는 것이 다음과 같습니다 ...
Linux에서는 단일 프로세스가 사용할 수있는 물리적 메모리의 양을 다음 범주로 대략적으로 나눌 수 있습니다.
MA 익명 매핑 메모리
- .P 개인
- .D Dirty == malloc/mmapped 힙 및 스택 할당 및 서면 메모리
- .c clean == malloc/mmapped 힙과 스택 메모리가 할당, 작성, 해방 된 후에는 메모리가되지만 아직 회수되지 않았습니다.
- .S 공유
- .D 더러운 == malloc/mmaped 힙은 복사를 받고 프로세스간에 공유 할 수 있습니다. (편집)
- .C Clean == malloc/mmaped 힙은 복사를 받고 프로세스간에 공유 할 수 있습니다. (편집)
- .P 개인
MN은 맵핑 메모리로 명명되었습니다
- .P 개인
- .D Dirty == 파일 Mmapped 서면 메모리 비공개
- .C Clean == 매핑 된 프로그램/라이브러리 텍스트 개인 매핑
- .S 공유
- .D Dirty == 파일 Mmapped 서면 메모리 공유
- .c clean == 맵핑 라이브러리 텍스트 공유 매핑
- .P 개인
안드로이드에 포함 된 유틸리티 쇼 맵 매우 유용합니다
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 Task Manager와 유사한 아주 좋은 콘솔 프로그램입니다.
Valgrind는 당신이 그것을 실행할 시간이 있다면 놀랍습니다. valgrind --tool=massif
올바른 솔루션입니다.
그러나 더 큰 예제를 실행하기 시작했으며 Valgrind를 사용하는 것이 더 이상 실용적이지 않습니다. 프로그램의 최대 메모리 사용량 (모듈로 페이지 크기 및 공유 페이지)을 알리는 방법이 있습니까?
실제 유닉스 시스템에서 /usr/bin/time -v
공장. 그러나 Linux에서는 이것이 그렇습니다 ~ 아니다 일하다.
시도 할 세 가지 방법 :
ps aux --sort pmem
출력을 분류합니다%MEM
.ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
파이프를 사용하여 정렬합니다.top -a
상단 분류가 시작됩니다%MEM
(추출 여기)
#!/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
더 "실제 세계"사용법에 대한 좋은 테스트는 응용 프로그램을 열고 실행하는 것입니다. vmstat -s
"활성 메모리"통계를 확인하십시오. 응용 프로그램을 닫고 몇 초 동안 기다렸다가 실행하십시오. vmstat -s
다시. 그러나 많은 활성 메모리가 해방 된 것은 분명히 앱에서 사용 중이 었습니다.
프로세스가 너무 많은 메모리를 사용하지 않는 경우 (이 경우가 발생하거나 다른 명령 이이 초기 표시가 주어 졌기 때문에) 프로세스가 짧은 시간 동안 중지 될 수 있습니다. Gcore 명령을 사용하십시오.
gcore <pid>
생성 된 코어 파일의 크기를 확인하여 특정 프로세스가 얼마나 많은 메모리를 사용하고 있는지 알 수 있습니다.
핵심 생성이 I/O 성능에 따라 몇 초 또는 몇 분이 걸릴 수 있으므로 프로세스가 수백 메그 또는 공연을 사용하는 경우에는 잘 작동하지 않습니다. 핵심 생성 동안 메모리 변화를 방지하기 위해 프로세스가 중지 (또는 "동결"). 그러니 조심해.
또한 코어가 생성되는 마운트 포인트에 디스크 공간이 충분하고 시스템이 특정 디렉토리에서 생성되는 코어 파일에 부정적인 반응을 보이지 않도록하십시오.
아래 명령 줄은 MB의 Linux 시스템에서 실행되는 다양한 프로세스에서 사용하는 총 메모리를 제공합니다.
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}'
나는 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가 이미 실행중인 프로세스에 손을 잡을 수 있는지 또는 데몬과 같은 프로세스가 없어야하는지 모르겠습니다.
편집하다: 이것은 메모리 소비가 증가 할 때만 100% 잘 작동합니다.
주어진 프로세스 (또는 처리 된 공유 공통 이름 그룹, 예를 들어 메모리 사용량을 모니터링하려면 google-chrome
, 당신은 내 배쉬 스크립트를 사용할 수 있습니다 :
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;
이것은 계속해서 변경 사항을 찾고 인쇄 할 것입니다.
Valgrind로 프로파일 링보다 빠른 것을 원하고 커널이 오래되고 Smaps를 사용할 수 없다면, PS는 프로세스의 상주 세트를 보여줄 수있는 옵션을 사용할 수 없습니다. ps -o rss,command
) 빠르고 합리적으로 줄 수 있습니다 _aproximation_
사용중인 실제 금액의 메모리가.
나는 당신이 꼭대기를 사용하는 것을 제안합니다. 당신은 그것에 관한 모든 것을 찾을 수 있습니다 이 페이지. 프로세스에 필요한 모든 KPI를 제공 할 수 있으며 파일로 캡처 할 수도 있습니다.
쉘 스크립트를 확인하여 확인하십시오 Linux의 응용 프로그램에 의한 메모리 사용. 또한 사용할 수 있습니다 github 그리고 버전에서 페이스트와 BC없이.
내장을 사용하십시오 '시스템 모니터'우분투에서 사용 가능한 GUI 도구
관련 답변을 기반으로합니다 의문.
SNMP를 사용하여 네트워크의 특정 장치에서 프로세스의 메모리 및 CPU 사용을 얻을 수 있습니다 :)
요구 사항 :
- 프로세스를 실행하는 장치에는 SNMP가 설치되어 실행되어야합니다.
- SNMP는 아래 스크립트를 실행하는 곳에서 요청을 수락하도록 구성되어야합니다 (SNMPD.conf로 구성 될 수 있음).
- 모니터링하려는 프로세스의 프로세스 ID (PID)를 알아야합니다.
메모:
호스트-자원 -MIB :: HRSWRUNPERFCPU 이 프로세스에서 소비되는 총 시스템의 CPU 리소스의 센티 초 수입니다. 다중 프로세서 시스템 에서이 값은 실제 (벽 시계) 시간 1 센티 초에 1 센티 초 이상 증가 할 수 있습니다.
호스트-자원 -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