는 방법을 측정하는 실제적인 메모리 사용법의 응용 프로그램 또는 공정입니까?

StackOverflow https://stackoverflow.com/questions/131303

  •  02-07-2019
  •  | 
  •  

문제

이 질문은 커버 훌륭한 세부 사항입니다.

당신은 어떻게 측정하는 메모리 사용법의 응용 프로그램 또는 프로세스에서의 리눅스?

블로그에서 문의 이해 메모리 사용량에서 리눅스, 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 힙은 복사를 받고 프로세스간에 공유 할 수 있습니다. (편집)
  • MN은 맵핑 메모리로 명명되었습니다

    • .P 개인
      • .D Dirty == 파일 Mmapped 서면 메모리 비공개
      • .C Clean == 매핑 된 프로그램/라이브러리 텍스트 개인 매핑
    • .S 공유
      • .D Dirty == 파일 Mmapped 서면 메모리 공유
      • .c clean == 맵핑 라이브러리 텍스트 공유 매핑

안드로이드에 포함 된 유틸리티 쇼 맵 매우 유용합니다

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에서는 이것이 그렇습니다 ~ 아니다 일하다.

시도 할 세 가지 방법 :

  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 성능에 따라 몇 초 또는 몇 분이 걸릴 수 있으므로 프로세스가 수백 메그 또는 공연을 사용하는 경우에는 잘 작동하지 않습니다. 핵심 생성 동안 메모리 변화를 방지하기 위해 프로세스가 중지 (또는 "동결"). 그러니 조심해.

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

아래 명령 줄은 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;

이것은 계속해서 변경 사항을 찾고 인쇄 할 것입니다.

enter image description here

Valgrind로 프로파일 링보다 빠른 것을 원하고 커널이 오래되고 Smaps를 사용할 수 없다면, PS는 프로세스의 상주 세트를 보여줄 수있는 옵션을 사용할 수 없습니다. ps -o rss,command) 빠르고 합리적으로 줄 수 있습니다 _aproximation_ 사용중인 실제 금액의 메모리가.

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

쉘 스크립트를 확인하여 확인하십시오 Linux의 응용 프로그램에 의한 메모리 사용. 또한 사용할 수 있습니다 github 그리고 버전에서 페이스트와 BC없이.

또 다른 투표 여기서도, 나는 당신이 다음과 같은 도구를 사용할 수 있다고 덧붙이고 싶습니다. Alleyoop Valgrind에서 생성 된 결과를 해석하는 데 도움이됩니다.

나는 항상 두 개의 도구를 사용하고 항상 자랑스럽게 보여주기 위해 마른 비 eky 코드를 가지고 있습니다.)

이 질문은 현재 실행중인 프로세스를 검사하는 것 같습니다. 처음부터 끝까지 응용 프로그램에서 사용하는 피크 메모리를보고 싶었습니다. Valgrind 외에도 사용할 수 있습니다 TSTIME, 훨씬 간단합니다. "Highwater"메모리 사용량 (RSS 및 가상)을 측정합니다. 에서 이 답변.

내장을 사용하십시오 '시스템 모니터'우분투에서 사용 가능한 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top