your programing

애플리케이션 또는 프로세스의 실제 메모리 사용량을 측정하는 방법은 무엇입니까?

lovepro 2020. 9. 30. 11:09
반응형

애플리케이션 또는 프로세스의 실제 메모리 사용량을 측정하는 방법은 무엇입니까?


이 질문은 여기 에서 자세히 다룹니다 .

Linux에서 애플리케이션 또는 프로세스의 메모리 사용량을 어떻게 측정합니까?

Linux 에서 메모리 사용 이해 의 블로그 기사에서는 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) 각 스냅 샷에 대해 프로그램 메모리가 할당 된 위치에 대한 기록을 제공합니다. 이러한 파일을 분석하기위한 훌륭한 그래픽 도구는 massif-visualizer 입니다. 하지만 ms_printvalgrind와 함께 제공되는 간단한 텍스트 기반 도구 인는 이미 큰 도움이되었습니다.

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


pmap 명령을 시도하십시오 .

sudo pmap -x <process pid>

확실히 말하기는 어렵지만 여기에 도움이 될 수있는 두 가지 "가까운"항목이 있습니다.

$ ps aux 

가상 크기 (VSZ)를 제공합니다.

/ proc 파일 시스템에서 자세한 통계를 얻을 수 있습니다. /proc/$pid/status

가장 중요한 것은 VmSize로, ps aux제공 하는 것에 가깝습니다 .

/ proc / 19420 $ 고양이 상태
이름 : firefox
상태 : S (수면)
Tgid : 19420
Pid : 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
Vm 크기 : 212520 kB
VmLck : 0kB
VmHWM : 127912 kB
VmRSS : 118768 kB
VmData : 170180 kB
VmStk : 228 kB
VmExe : 28KB
VmLib : 35424 kB
VmPTE : 184kB
글 : 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 - 서로 다른 프로세스가 공유 같은 메모리에 다시 나타나지. 따라서 특히 높은 메모리 프로세스에 많은 포크가있을 때 상당히 불안정합니다. 이는 Apache 또는 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을 사용 하십시오 . 전체 시스템 분석의 경우 가장 효과적인 사용량을 가진 프로세스를 찾고, 실제로 가장 많은 메모리를 사용하고, 쓰기 가능한 사용량이 가장 많은 프로세스를 찾고, 가장 많은 데이터를 생성합니다 (따라서 데이터가 누출되거나 매우 비효율적 일 수 있음). 이러한 응용 프로그램을 선택하고 두 번째 목록보기에서 해당 매핑을 분석합니다. 자세한 내용은 exmap 섹션을 참조하십시오. 또한 사용 xrestop X 서버의 프로세스가 메모리 많이 걸립니다 특히, X 자원의 높은 사용량을 확인 할 수 있습니다. 자세한 내용은 xrestop 섹션을 참조하십시오.

당신이 누출 사용 검색하도록하려면 Valgrind의를 또는 가능 kmtrace .

애플리케이션의 힙 (malloc 등) 사용량을 분석하려면 memprof 또는 kmtrace 에서 실행 하고 애플리케이션을 프로파일 링하고 함수 호출 트리에서 가장 큰 할당을 검색합니다. 자세한 내용은 해당 섹션을 참조하십시오.


답변에 나열된 솔루션 외에도 Linux 명령 "top"을 사용할 수 있습니다. 실행중인 시스템의 동적 실시간보기를 제공하고 전체 시스템과 모든 프로그램에 대한 CPU 및 메모리 사용량을 백분율로 제공합니다.

top

프로그램 pid로 필터링하려면 :

top -p <PID>

프로그램 이름으로 필터링하려면 :

top | grep <PROCESS NAME>

"top"은 다음과 같은 일부 필드도 제공합니다.

VIRT-가상 이미지 (kb) : 작업에 사용 된 총 가상 메모리 양

RES-상주 크기 (kb) : 작업이 사용한 스왑되지 않은 물리적 메모리. RES = 코드 + 데이터.

데이터-데이터 + 스택 크기 (kb) : '데이터 상주 세트'크기 또는 DRS라고도하는 실행 코드 이외의 용도로 사용되는 물리적 메모리의 양입니다.

SHR-공유 메모리 크기 (kb) : 작업에서 사용하는 공유 메모리 양입니다. 다른 프로세스와 잠재적으로 공유 될 수있는 메모리 만 반영합니다.

여기를 참조 하십시오 .


프로세스가 사용하는 메모리 양을 정확하게 파악할 수 없기 때문에 이에 대한 답이 하나도 없습니다. Linux에서 대부분의 프로세스는 공유 라이브러리를 사용합니다. 예를 들어 '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 / status가 한 번에 메모리 사용량에 대한 충분한 정보를 제공 할 수 있다고 생각합니다. 반면에 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 dirty == malloc / mmaped 힙은 copy-on-write를 가져와 프로세스간에 공유 할 수 있습니다 (편집 됨).
      • .c clean == malloc / mmaped 힙은 copy-on-write를 가져와 프로세스간에 공유 할 수 있습니다 (편집 됨).
  • Mn 명명 된 매핑 된 메모리

    • .p 비공개
      • .d dirty == 파일 mmapped 쓰기 메모리 개인
      • .c clean == 매핑 된 프로그램 / 라이브러리 텍스트 개인 매핑
    • .s 공유 됨
      • .d dirty == 파일 mmapped 쓰기 메모리 공유
      • .c clean == 매핑 된 라이브러리 텍스트 공유 매핑 됨

Android에 포함 된 showmap 이라는 유틸리티 는 매우 유용합니다.

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 작업 관리자와 유사한 매우 훌륭한 콘솔 프로그램입니다.


Valgrind는 실행할 시간이 있다면 놀랍습니다. valgrind --tool=massif올바른 솔루션입니다.

그러나 더 큰 예제를 실행하기 시작했으며 valgrind를 사용하는 것은 더 이상 실용적이지 않습니다. 프로그램의 최대 메모리 사용량 (모듈로 페이지 크기 및 공유 페이지)을 알려주는 방법이 있습니까?

실제 유닉스 시스템에서 /usr/bin/time -v작동합니다. 그러나 Linux에서는 작동 하지 않습니다 .


시도 할 세 가지 방법이 더 있습니다.

  1. ps aux --sort pmem
    출력을 %MEM.
  2. ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
    파이프를 사용하여 정렬합니다.
  3. 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 성능에 따라 코어 생성이 생성되는 데 몇 초 또는 몇 분이 걸릴 수 있으므로이 방식은 잘 작동하지 않습니다. 코어 생성 중에는 메모리 변경을 방지하기 위해 프로세스가 중지 (또는 "고정")됩니다. 그러니까 조심하세요.

또한 코어가 생성되는 마운트 지점에 충분한 디스크 공간이 있고 시스템이 특정 디렉토리에 생성되는 코어 파일에 부정적인 반응을 보이지 않는지 확인하십시오.


아래 명령 줄은 Linux 시스템에서 실행되는 다양한 프로세스가 사용하는 총 메모리 (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}'

저는 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하려면 내 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;

계속해서 변경 사항을 찾아 인쇄합니다.

여기에 이미지 설명 입력


Valgrind로 프로파일 링하는 것보다 더 빠른 것을 원하고 커널이 오래되었고 smap을 사용할 수없는 경우 프로세스의 상주 세트를 표시하는 옵션이있는 ps (사용 ps -o rss,command)는 _aproximation_실제 양을 빠르고 합리적 으로 제공 할 수 있습니다. 스왑되지 않은 메모리가 사용 중입니다.


나는 당신이 위에 사용하는 것이 좋습니다. 이 페이지에서 그것에 대한 모든 것을 찾을 수 있습니다 . 프로세스에 필요한 모든 KPI를 제공 할 수 있으며 파일로 캡처 할 수도 있습니다.


Linux에서 응용 프로그램의 메모리 사용량 을 확인하려면 쉘 스크립트를 확인하십시오 . githubpaste 및 bc없는 버전 에서도 사용할 수 있습니다 .


또 다른 투표 여기,하지만 내가 좋아하는 당신이 도구를 사용할 수있는 추가하고 싶습니다 Alleyoop는 당신이 Valgrind의에 의해 생성 된 결과를 해석하는 데 도움이.

나는 항상 두 가지 도구를 사용하고 자랑스럽게 보여주기 위해 항상 간결하고 누출되지 않는 코드를 가지고 있습니다.)


이 질문은 현재 실행중인 프로세스를 검사하는 것 같지만 처음부터 끝까지 애플리케이션에서 사용하는 최대 메모리를보고 싶었습니다. valgrind 외에도 훨씬 더 간단한 tstime 을 사용할 수 있습니다 . "고수"메모리 사용량 (RSS 및 가상)을 측정합니다. 에서 이 답변 .


우분투에서 사용할 수있는 내장 된 ' 시스템 모니터 'GUI 도구 사용


관련 질문 에 대한 답변을 기반으로 합니다.

SNMP를 사용하여 네트워크의 특정 장치에서 프로세스의 메모리 및 CPU 사용량을 가져올 수 있습니다. :)

요구 사항 :

  • 프로세스를 실행하는 장치에 snmp가 설치되어 실행 중이어야합니다.
  • 아래 스크립트를 실행할 요청을 수락하도록 snmp를 구성해야합니다 (snmpd.conf에서 구성 할 수 있음).
  • 모니터링하려는 프로세스의 프로세스 ID (pid)를 알아야합니다.

메모:

  • HOST-RESOURCES-MIB :: hrSWRunPerfCPU 는이 프로세스에서 사용하는 전체 시스템 CPU 리소스의 센티 초 수입니다. 다중 프로세서 시스템에서이 값은 실제 (벽시계) 시간의 1 센티 초에서 1 센티 초 이상 증가 할 수 있습니다.

  • HOST-RESOURCES-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

참고 URL : https://stackoverflow.com/questions/131303/how-to-measure-actual-memory-usage-of-an-application-or-process

반응형