Linux에서 애플리케이션 또는 프로세스의 메모리 사용량을 어떻게 측정합니까?
Linux 에서 메모리 사용 이해 의 블로그 기사 ps
에서이 의도에 사용하는 정확한 도구는 아닙니다.
왜
ps
“잘못된”어떻게 보느냐에 따라
ps
프로세스의 실제 메모리 사용량을보고하지 않습니다. 실제로하는 것은 각 프로세스가 실행중인 유일한 프로세스 인 경우 각 프로세스가 차지하는 실제 메모리 양을 보여주는 것 입니다. 물론, 일반적인 리눅스 머신은 VSZ와 RSS 숫자로보고 한 수단 주어진 시간에 실행 수십 프로세스가ps
거의 확실히 있습니다 잘못 .
답변
이와 ps
유사한 도구를 사용하면 해당 프로세스에서 할당 한 메모리 페이지 만 얻을 수 있습니다. 이 번호는 맞지만,
-
응용 프로그램에서 사용 된 실제 메모리 양을 반영하지 않고 예약 된 메모리 양만 반영합니다.
-
예를 들어 여러 스레드 또는 동적으로 연결된 라이브러리를 사용하여 페이지를 공유하는 경우 오해의 소지가 있습니다.
응용 프로그램이 실제로 사용하는 메모리 양을 알고 싶다면 프로파일 러 내에서 실행해야합니다. 예를 들어, valgrind
사용 된 메모리 양과 프로그램에서 발생 가능한 메모리 누수에 대한 통찰력을 제공 할 수 있습니다. valgrind의 힙 프로파일 러 도구는 ‘massif’입니다.
Massif는 힙 프로파일 러입니다. 프로그램 힙의 정기적 스냅 샷을 작성하여 자세한 힙 프로파일 링을 수행합니다. 가장 많은 메모리 할당을 담당하는 프로그램 부분에 대한 정보를 포함하여 시간 경과에 따른 힙 사용량을 보여주는 그래프를 생성합니다. 그래프는 가장 많은 메모리가 할당되는 위치를 결정하기위한 추가 정보가 포함 된 텍스트 또는 HTML 파일로 보완됩니다. Massif는 프로그램을 정상보다 약 20 배 느리게 실행합니다.
valgrind documentation에 설명 된대로 valgrind를 통해 프로그램을 실행해야합니다.
valgrind --tool=massif <executable> <arguments>
Massif는 메모리 사용량 스냅 샷 덤프 (예 :)를 씁니다 massif.out.12345
. (1) 메모리 사용 타임 라인 (2) 각 스냅 샷에 대해 프로그램 메모리에서 할당 된 위치에 대한 레코드를 제공합니다. 이러한 파일을 분석하기위한 훌륭한 그래픽 도구는 massif-visualizer 입니다. 그러나 ms_print
valgrind와 함께 제공되는 간단한 텍스트 기반 도구는 이미 큰 도움이되었다는 것을 알았습니다 .
메모리 누수를 찾으려면 memcheck
valgrind 의 (기본) 도구를 사용하십시오 .
답변
pmap 명령을 시도하십시오 :
sudo pmap -x <process pid>
답변
확실히 말하기는 어렵지만 여기에 도움이 될 수있는 두 가지 “가까운”것이 있습니다.
$ ps aux
가상 크기 (VSZ)를 제공합니다
/ proc 파일 시스템에서 자세한 통계를 얻을 수도 있습니다. /proc/$pid/status
가장 중요한 것은 VmSize이며, ps aux
제공 하는 것에 가깝습니다 .
/ proc / 19420 $ 고양이 상태 이름 : 파이어 폭스 상태 : S (잠자기) Tgid : 19420 d : 19420 PPid : 1 TracerPid : 0 UID : 1000 1000 1000 1000 Gid : 1000 1000 1000 1000 FD 크기 : 256 그룹 : 4 6 20 24 25 29 30 44 46107109115124 1000 VmPeak : 222956 kB 크기 : 212520 kB VmLck : 0 kB VmHWM : 127912 킬로바이트 VmRSS : 118768 kB VmData : 170180 kB VmStk : 228 kB VmExe : 28kB VmLib : 35424 kB VmPTE : 184 kB 스레드 : 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
이때 사용중인 메모리 양을 정확하게 알려줍니다. 더 중요한 것은 메모리를 개인용 및 공유로 나누므로 프로그램의 여러 인스턴스간에 공유되는 메모리를 포함하지 않고 프로그램 인스턴스 가 사용하는 메모리 양을 알 수 있습니다 .
답변
이것을 계산하는 쉬운 방법은 없습니다. 그러나 어떤 사람들은 좋은 답변을 얻으려고 노력했습니다.
답변
프로세스 당 USS 및 PSS를 계산하는 ps 의 대안 인 smem을 사용하십시오 . 당신이 원하는 것은 아마도 PSS 일 것입니다.
-
USS- 고유 세트 크기. 이것은 그 과정에 고유 한 비공유 메모리의 양입니다 (라고 생각 U 에 대한 고유의 메모리). 공유 메모리는 포함되지 않습니다. 따라서이 의지 에 따라 공유 메모리를 무시하려는 경우 -report 메모리의 양 프로세스가 사용하는,하지만 도움이됩니다.
-
PSS- 비례 설정 크기. 이것이 당신이 원하는 것입니다. 공유 메모리의 비율을 해당 메모리를 공유하는 프로세스 수로 나눈 고유 메모리 (USS)를 더합니다. 따라서 프로세스 당 실제 실제 메모리 사용량을 정확하게 표현할 수 있습니다. 공유 메모리는 실제로 공유로 표시됩니다. P 가 실제 메모리를 위한 것이라고 생각하십시오 .
ps 및 기타 유틸리티에서 보고 한 RSS와 비교하는 방법 :
- RSS- 상주 세트 크기. 각 프로세스에서 사용하는 공유 메모리와 비공유 메모리의 양입니다. 모든 프로세스의 메모리를 공유하는 경우,이 것 이상 같은 공유 메모리 번 이상 계산되기 때문에, 실제로 사용되는 메모리의 양을 -report – 서로 다른 프로세스가 공유 같은 메모리에 다시 나타나지. 따라서 특히 높은 메모리 프로세스에 많은 포크가있는 경우 (아파치 또는 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]