[linux] 응용 프로그램 또는 프로세스의 실제 메모리 사용량을 측정하는 방법은 무엇입니까?

이 질문은 여기서 자세히 다루고 있습니다 .

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_printvalgrind와 함께 제공되는 간단한 텍스트 기반 도구는 이미 큰 도움이되었다는 것을 알았습니다 .

메모리 누수를 찾으려면 memcheckvalgrind 의 (기본) 도구를 사용하십시오 .


답변

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]