web-dev-qa-db-ja.com

アプリケーションまたはプロセスの実際のメモリ使用量を測定する方法

この質問は ここで 詳しく説明されています。

Linuxでアプリケーションやプロセスのメモリ使用量をどのように測定しますか?

ブログ記事の Linuxでのメモリ使用量の理解 から、psはこの目的に使用する正確なツールではありません。

なぜpsが間違っているのか

見方によっては、psはプロセスの実メモリ使用量を報告していません。実際に行っているのは、各プロセスがどれだけの実メモリを占有するかを示していますそれが実行中の唯一のプロセスである場合。もちろん、一般的なLinuxマシンでは常に何十ものプロセスが実行されています。つまり、psによって報告されるVSZとRSSの番号はほぼ間違いなく間違っています

667
ksuralta

psまたは同様のツールを使用すると、そのプロセスによって割り当てられたメモリページの量だけを取得できます。この数は正しいですが:

  • アプリケーションによって使用される実際のメモリ量は反映されず、アプリケーション用に予約されているメモリ量だけが反映されます。

  • 複数のスレッドや動的にリンクされたライブラリを使用するなどしてページが共有されていると、誤解を招く可能性があります。

アプリケーションが実際に使用しているメモリ量を知りたい場合は、プロファイラー内で実行する必要があります。たとえば、valgrindを使用すると、使用されているメモリの量、さらに重要なことには、プログラムで発生する可能性のあるメモリリークについての洞察を得ることができます。 valgrindのヒーププロファイラーツールは 'massif'と呼ばれます。

Massifはヒーププロファイラーです。プログラムのヒープの定期的なスナップショットを取ることによって、詳細なヒーププロファイリングを実行します。プログラムのどの部分が最も多くのメモリ割り当てを担当しているかに関する情報を含む、時間の経過に伴うヒープ使用量を示すグラフを作成します。グラフは、最も多くのメモリが割り当てられている場所を特定するための詳細情報を含むテキストファイルまたはHTMLファイルによって補完されます。 Massifは通常よりも20倍遅いプログラムを実行します。

valgrindドキュメント で説明されているように、あなたはvalgrindを通してプログラムを実行する必要があります:

valgrind --tool=massif <executable> <arguments>

Massifはメモリ使用量のスナップショットのダンプを書き込みます(例:massif.out.12345)。これらは、(1)メモリ使用量のタイムライン、(2)各スナップショットについて、プログラムメモリのどこに割り当てられたかの記録を提供します。これらのファイルを分析するための優れたグラフィカルツールは massif-visualizer です。しかし、valgrindに同梱されている単純なテキストベースのツールであるms_printは、すでに非常に役に立ちました。

メモリリークを見つけるには、valgrindの(デフォルト)memcheckツールを使用してください。

328
ypnos

pmap コマンドを試してください。

Sudo pmap -x <process pid>
261
Anil

確実にはわかりませんが、ここでは役立つことができる2つの「近い」ことを説明します。

$ ps aux 

仮想サイズ(VSZ)が表示されます

/proc/$pid/statusに行くことで/ procファイルシステムから詳細な統計を得ることもできます。

最も重要なものはVmSizeで、これはps auxが与えるものに近いはずです。

/proc/19420 $ cat status 
名前:firefox 
状態:S(睡眠中)
 Tgid:19420 
 Pid:19420 
 PPid:1 
 TracerPid:0 
 Uid:1000 1000 1000 1000 1000 
 Gid:1000 1000 1000 1000 1000 
 FDSize:256 
グループ: 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 [。] V mRSS:118768 kB 
 V mデータ:170180 kB 
 V mStk:228 kB 
 V m Exe:28 kB 
 V mLib:35424 kB 
 VmPTE:184 kB 
スレッド:8 
 SigQ:0/16382 
 SigPnd:0000000000000000 
 ShdPnd:0000000000000000 
 SigBlk:0000000000000000 
 ] SigIgn:0000000020001000 
 SigCgt:000000018000442f 
 CapIn:0000000000000000 
 CapPrm:0000000000000000 
 CapEff:0000000000000000 
 Cpus_allowed:03 
 :1 
 voluntary_ctxt_switches:63422 
 nonvoluntary_ctxt_switches:7171 
 
187
DustinB

最近のバージョンのLinuxでは、 smaps サブシステムを使用してください。たとえば、PIDが1234のプロセスの場合:

cat /proc/1234/smaps

その時点で使用しているメモリ量が正確にわかります。さらに重要なことは、メモリをプライベートと共有に分割するので、プログラムの複数のインスタンス間で共有されるメモリを含めなくても、プログラムの インスタンス が使用しているメモリ量を判断できます。

127
Paul Biggar

これを計算する簡単な方法はありません。しかし、何人かの人々はいくつかの良い答えを得ようとしました:

123
Bash

smem を使用します。これは、USSを計算するpsの代替です。およびプロセスごとのPSS。あなたが望むのはおそらくPSSでしょう。

  • USS-一意のセットサイズ。これは、そのプロセスに固有の非共有メモリの量です(uniqueメモリの場合、Uと考えてください)。共有メモリは含まれません。したがって、これはプロセスが使用するメモリ量をunder-reportしますが、共有メモリを無視する場合に役立ちます。

  • PSS-比例セットサイズ。これはあなたが望むものです。共有メモリの割合をそのメモリを共有するプロセスの数で割った値とともに、一意のメモリ(USS)を加算します。したがって、プロセスごとに実際に使用されている物理メモリの量を正確に表すことができます-共有メモリは本当に共有として表されます。 Pphysicalメモリ用であると考えてください。

これがpsおよび他のユーティリティによって報告されるRSSと比較する方法:

  • RSS-常駐セットサイズ。これは、共有メモリと各プロセスで使用される非共有メモリの量です。プロセスがメモリを共有する場合、同じ共有メモリが複数回カウントされるため、実際に使用されたメモリの量をover-reportします-共有する他の各プロセスに再び表示されます同じメモリ。したがって、特にハイメモリプロセスに多くのフォークがある場合、fairly信頼性が低くなります。これは、ApacheまたはPHP(fastcgi/FPM)プロセスなどのサーバーでは一般的です。

注意:smemは(オプションで)円グラフなどのグラフも出力できます。 IMOの必要はありません。 ps -A vを使用するようにコマンドラインから使用する場合は、python-matplotlib推奨の依存関係をインストールする必要はありません。

100
thomasrutter
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

これをrootとして使用すると、各プロセスによるメモリ使用量の明確な出力が得られます。

出力例:

     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] 
73

timeはどうですか?

Bash 組み込みの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
62
Moonchild

これはツールと問題の優れた要約です: archive.org link

より多くの開発者が実際にそれを読むように、私はそれを引用します。

システム全体のメモリー使用量を分析したい場合、または1つのアプリケーションのメモリー使用量(そのヒープ使用量だけでなく)を徹底的に分析したい場合は、 exmap を使用してください。システム全体の分析では、最も効果的な使用率を持つプロセスを見つけ、実際には最も多くのメモリを使い、最も書き込み可能な使用率を持つプロセスを見つけ、最もデータを作成します。そのようなアプリケーションを選択し、2番目のリストビューでそのマッピングを分析してください。詳細はexmapのセクションを見てください。特にXサーバのプロセスが大量のメモリを消費する場合は、 xrestop を使用してXリソースの使用率をチェックしてください。詳細はxrestopセクションを見てください。

リークを検出したい場合は、 valgrind または kmtrace を使用してください。

アプリケーションのヒープ(mallocなど)使用量を分析する場合は、 memprof で実行するか、 kmtrace を指定してアプリケーションをプロファイルし、最大の割り当てを関数呼び出しツリーで検索します。詳細についてはそれらのセクションを参照してください。

38
phoku

あなたの答えにリストされている解決策の他に、あなたはLinuxコマンド "top"を使うことができます。それは実行中のシステムの動的なリアルタイムのビューを提供し、パーセンテージで、すべてのプログラムと一緒にシステム全体のCPUとメモリ使用量を与えます。

top

プログラムpidでフィルタリングするには:

top -p <PID>

プログラム名でフィルタリングするには:

top | grep <PROCESS NAME>

"top"は以下のようないくつかのフィールドも提供します。

VIRT - 仮想イメージ(KB):タスクによって使用された仮想メモリーの合計量

RES - 常駐サイズ(kb):タスクが使用したスワップされていない物理メモリ。 RES =コード+データ。

DATA - データ+スタックサイズ(kb):実行可能コード以外に割り当てられた物理メモリの量。「データ常駐セット」サイズまたはDRSとも呼ばれます。

SHR - 共有メモリサイズ(KB):タスクによって使用される共有メモリの量。他のプロセスと潜在的に共有される可能性があるメモリを単に反映しています。

参照 ここ .

26
Yahya Yahyaoui

プロセスが使用するメモリの量を正確に特定することはできないため、これに対する唯一の答えはありません。 Linux下のほとんどのプロセスは共有ライブラリを使用します。たとえば、 'ls'プロセスのメモリ使用量を計算したいとしましょう。実行可能ファイル 'ls'によって使用されているメモリだけを数えますか(分離できる場合)。 libcはどうですか?それとも、 'ls'を実行するために必要な他のすべてのlibs?

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はメモリ使用量ATの十分な情報を一度に提供するかもしれないと思います。一方、valgrindはあなたにプログラムの寿命を通してメモリ使用量のより良いプロフィールを与えるでしょう。

19
Dprado

コードがCまたはC++の場合は、getrusage()を使用して、メモリに関するさまざまな統計とプロセスの時間使用量を返すことができます。

ただし、すべてのプラットフォームがこれをサポートしているわけではなく、メモリ使用オプションに対して0の値を返します。

代わりに、/proc/[pid]/statmで作成された仮想ファイルを見ることができます(ここで、[pid]は自分のプロセスIDに置き換えられます。これはgetpid()から取得できます)。

このファイルは、7つの整数を含むテキストファイルのようになります。あなたはおそらくこのファイルの最初(全メモリ使用)と6番目(データメモリ使用)の番号に最も興味があるでしょう。

16
CashCow

Valgrind 詳細な情報を表示することができますが、それは 遅く ターゲットアプリケーションを大幅に、そしてほとんどの場合それはアプリの動作を変更します。
Exmap 私がまだ知らなかったものですが、情報を取得するには カーネルモジュール が必要なようです。

みんながWRTの「メモリ使用量」を知りたいのは次のように思います。
Linuxでは、単一のプロセスが使用する可能性のある物理メモリの量は、次のカテゴリに大別することができます。

  • 匿名マップメモリ​​

    • .p private
      • .d dirty == malloc/mmappedヒープとスタック割り当ておよび書き込み済みメモリ
      • .c clean == malloc/mmappedヒープおよびスタックメモリがいったん割り当てられ、書き込まれ、その後解放されたが、まだ再生されていない
    • .sさんが共有しました
      • .d dirty == malloc/mmapedヒープがコピーオンライトされ、プロセス間で共有される可能性がある (編集済み)
      • .c clean == malloc/mmapedヒープがコピーオンライトされ、プロセス間で共有される可能性がある (編集済み)
  • M.nの名前付きマップメモリ​​

    • .p private
      • .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
12
holmes

もう3つの方法があります。

  1. ps aux --sort pmem
    出力を%MEMでソートします。
  2. ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
    パイプを使って分類します。
  3. top -a
    %MEMでトップソートを始めます

here から抽出)

9
Thomas Shaiker

私はhtopを使っています。それはWindowsのタスクマネージャに似たとても良いコンソールプログラムです。

あなたがそれを実行する時間があればValgrindは素晴らしいです。 valgrind --tool=massifは正しい解決策です。

しかし、私はもっと大きな例を実行し始めており、valgrindを使うことはもはや実用的ではありません。プログラムの最大メモリ使用量(モジュロページサイズと共有ページ)を知る方法はありますか?

本物のUNIXシステムでは、/usr/bin/time -vは動作します。しかしLinuxでは、これは ではなく は機能します。

9
Seth
#!/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
8
pokute

より現実的な使い方の良いテストは、アプリケーションを開いてvmstat -sを実行し、そして "active memory"統計をチェックすることです。アプリケーションを閉じ、数秒待ってからvmstat -sをもう一度実行します。ただし、多くのアクティブメモリが解放されたことは明らかにアプリによって使用されていました。

6
Nick W.

コマンドラインの下には、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}'
5
Vineeth

プロセスがあまりにも多くのメモリを使い果たしていない場合(またはこれが原因であると予想されるため、または他のコマンドがこの初期指示を出しているため)、プロセスが短期間停止しても耐えるgcoreコマンドを使用してください。

gcore <pid>

生成されたコアファイルのサイズを確認して、特定のプロセスが使用しているメモリ量を確認します。

プロセスが数百メガバイト、またはギグを使用している場合、これはあまりうまく機能しません。コア生成にはI/Oパフォーマンスによっては数秒から数分かかることがあるためです。コアの作成中は、メモリの変更を防ぐためにプロセスが停止(または「凍結」)します。ので注意してください。

また、コアが生成されるマウントポイントに十分なディスク容量があること、およびシステムがその特定のディレクトリに作成されているコアファイルに悪影響を与えないことを確認してください。

5
Rocco Corsi

私は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
=============================================
4
GypsyCosmonaut

Valgrindを入手してください。実行するプログラムを指定すると、そのメモリ使用量について十分にわかります。

これは、しばらく実行されて停止するプログラムの場合にのみ適用されます。 valgrindがすでに実行中のプロセスを手に入れることができるのか、デーモンなどのプロセスを停止してはいけないのかはわかりません。

4
DarenW

編集: これはメモリ消費量が増加した場合にのみ100%うまく動作します

あなたが与えられたプロセス(あるいは処理された共有の共通名のグループ、例えばgoogle-chrome)によるメモリ使用量をモニターしたいなら、あなたは私のbashスクリプトを使うことができます:

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

3
test30

Valgrindでプロファイリングするよりも早くてカーネルが古くてsmapsを使用できない場合は、(ps -o rss,commandを付けて)プロセスの常駐セットを表示するオプションを付けたpsを使うと、本物の迅速で妥当な_aproximation_を得ることができます。使用されているスワップされていないメモリの量。

3
juanjux

私はあなたが頂上を使用することをお勧めします。あなたはそれについてのすべてを このページ で見つけることができます。それはあなたのプロセスに必要なすべてのKPIを提供することが可能であり、ファイルにキャプチャすることもできます。

2
Jain Rach
2

valgrind への別の投票もここにありますが、 Alleyoop のようなツールを使ってvalgrindによって生成された結果を解釈できるようにすることができます。

私は2つのツールをいつも使っていて、それを誇らしげに見せるために、常にスリムでリークのないコードを使っています。

1
Dan

この質問は現在実行中のプロセスを調べることに関するもののようですが、私は最初から最後までアプリケーションによって使用されるピークメモリを見たかったです。 valgrind以外に、 tstime を使用することもできます。これははるかに簡単です。これは、 "最高水位"のメモリ使用量(RSSと仮想)を測定します。 この答えから

1
jtpereyda

Ubuntuで利用可能な組み込みの ' システムモニタ ' GUIツールを使用してください。

0
Sudheesh.M.S

/ prox/xxx/numa_mapsはそこにある情報を与えます:N0 = ??? N1 =?しかし、この結果は実際の結果よりも低くなる可能性があります。それは、触れられたものだけを数えるからです。

0
ptan

関連する 質問 への回答に基づく

ネットワーク内の特定のデバイスのプロセスのメモリとCPU使用率を取得するには、SNMPを使用することができます。

要件:

  • プロセスを実行しているデバイスには、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