アプリケーションまたはプロセスの実際のメモリ使用量を測定するにはどうすればよいですか?

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

  •  02-07-2019
  •  | 
  •  

質問

この質問はカバーされています ここ 非常に詳細に。

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) 各スナップショット、プログラム内のどこにメモリが割り当てられたかの記録を提供します。これらのファイルを分析するための優れたグラフィカル ツールは、 山塊可視化装置. 。でも見つけた ms_print, は、valgrind に同梱されているシンプルなテキストベースのツールで、すでに非常に役に立ちます。

メモリ リークを見つけるには、(デフォルト) を使用します。 memcheck ヴァルグリンドのツール。

他のヒント

試してみてください pmap 指示:

sudo pmap -x <process pid>

確かに言うのは難しいですが、役立つ「近い」ことが 2 つあります。

$ 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 の最近のバージョンでは、 スマップ サブシステム。たとえば、PID が 1234 のプロセスの場合:

cat /proc/1234/smaps

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

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

使用 スメム, の代替手段です ps プロセスごとの USS と PSS を計算します。あなたが欲しいのはおそらく PSS です。

  • USS - ユニークなセットサイズ。これは、そのプロセスに固有の非共有メモリの量です (次のように考えてください)。 U のために 個性的 メモリ)。共有メモリは含まれません。したがって、これは - プロセスが使用するメモリ量をレポートしますが、共有メモリを無視したい場合に役立ちます。

  • PSS - 比例セットサイズ。これがあなたが望むものです。固有メモリ (USS) と、そのメモリを共有する他のプロセスの数で割った共有メモリの割合を加算します。したがって、共有メモリは実際に共有として表現され、プロセスごとに実際の物理メモリがどれだけ使用されているかを正確に表現できます。考えてみましょう P のためにある 物理的な メモリ。

レポートによる RSS との比較 ps およびその他のユーティリティ:

  • RSS - 常駐セットのサイズ。これは、各プロセスによって使用される共有メモリと非共有メモリの量を合計したものです。プロセスがメモリを共有している場合、これは 以上- 同じ共有メモリが複数回カウントされるため、実際に使用されているメモリ量を報告します。同じメモリを共有する他の各プロセスで再度表示されます。したがって、それは かなり 特に高メモリプロセスに多くのフォークがある場合は信頼性が低くなります。これは、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

これを 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] 

どうですか 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 リンク

より多くの開発者が実際に読んでいただけるよう、引用させていただきます。

システム全体のメモリ使用量を分析したい場合、または 1 つのアプリケーションのメモリ使用量 (ヒープ使用量だけでなく) を徹底的に分析したい場合は、次を使用します。 エクスマップ. 。システム全体の分析では、最も効率的な使用率を持つプロセス、実際に最も多くのメモリを使用するプロセス、書き込み可能な使用率が最も高いプロセス、最も多くのデータを作成するプロセスを見つけます (したがって、データが漏洩する可能性があるか、データの使用効率が非常に低い)。そのようなアプリケーションを選択し、2 番目のリストビューでそのマッピングを分析します。詳細については、 exmap セクションを参照してください。も使用します エックスレストップ 特に X サーバーのプロセスが大量のメモリを消費する場合に、X リソースの使用率が高いことを確認します。詳細については、「xrestop」セクションを参照してください。

漏れを検出したい場合は、次を使用します。 ヴァルグリンド あるいはおそらく kmtrace.

アプリケーションのヒープ (malloc など) 使用状況を分析したい場合は、次のいずれかの方法でアプリケーションを実行します。 メンプロフ または一緒に 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 を使用すると、一度に AT のメモリ使用量について十分な情報が得られると思います。一方、valgrind を使用すると、プログラムの存続期間全体にわたるメモリ使用量のより適切なプロファイルが得られます。

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

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

代わりに、で作成された仮想ファイルを確認できます。 /proc/[pid]/statm (どこ [pid] はプロセス ID に置き換えられます。これは次から入手できます getpid()).

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

ヴァルグリンド 詳細情報を表示できますが、 遅くなる ターゲット アプリケーションに大きく影響し、ほとんどの場合、アプリケーションの動作が変更されます。
エクスマップ まだ知らなかったのですが、どうやら必要なようです。 カーネルモジュール 情報を入手することは障害になる可能性があります。

誰もが WRT の「メモリ使用量」について知りたいのは次のようなことだと思います...
Linux では、単一プロセスが使用する可能性のある物理メモリの量は、次のカテゴリに大まかに分類できます。

  • M. 匿名のマップされたメモリ

    • .p プライベート
      • .d Dirty == malloc/mmapped ヒープとスタックの割り当ておよび書き込みメモリ
      • .c clean == malloc/mmapped ヒープおよびスタック メモリは、一度割り当てられ、書き込まれ、その後解放されましたが、まだ再利用されていません
    • .s が共有されました
      • .d ダーティ == malloc/mmaped ヒープはコピーオンライトを取得し、プロセス間で共有される可能性があります (編集済み)
      • .c クリーン == malloc/mmaped ヒープはコピーオンライトを取得し、プロセス間で共有される可能性があります (編集済み)
  • M.n という名前のマップされたメモリ

    • .p プライベート
      • .d ダーティ == ファイル mmapped 書き込みメモリ プライベート
      • .c clean == マップされたプログラム/ライブラリ テキスト プライベート マップ
    • .s が共有されました
      • .d ダーティ == ファイル mmapped 書き込みメモリ共有
      • .c clean == マップされたライブラリ テキスト共有マップ

Android に含まれるユーティリティと呼ばれる ショーマップ とても便利です

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 を使用するのは現実的ではなくなりました。プログラムの最大メモリ使用量 (モジュロ ページ サイズと共有ページ) を知る方法はありますか?

実際の Unix システムでは、 /usr/bin/time -v 動作します。ただし、Linux ではこれが行われます。 ない 仕事。

さらに 3 つの方法を試してみてください。

  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 がすでに実行中のプロセスを操作できるのか、それともデーモンなどのプロセスを停止すべきではないのかはわかりません。

編集: これはメモリ消費量が増加した場合にのみ 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

Valgrind を使用したプロファイリングよりも迅速な処理が必要で、カーネルが古く、smap を使用できない場合は、プロセスの常駐セットを表示するオプションを備えた ps ( ps -o rss,command)を迅速かつ合理的に提供できます _aproximation_ 使用されているスワップされていないメモリの実量。

上から使用することをお勧めします。それについてはすべて次のサイトで見つけることができます このページ. 。プロセスに必要なすべての KPI を提供でき、ファイルにキャプチャすることもできます。

確認するシェルスクリプトを確認する Linuxのアプリケーションによるメモリ使用量。以下でも利用可能 ギットハブ そしてあるバージョンでは ペーストとBCなし.

もう一票 ここでは、次のようなツールを使用できることを付け加えておきます。 アリウープ valgrind によって生成された結果を解釈するのに役立ちます。

私は常に 2 つのツールを使用しており、常にリーンでリークのないコードを誇りを持って表示しています ;)

この質問は現在実行中のプロセスを調べることに関するもののようですが、私はアプリケーションが最初から最後まで使用するピークメモリを確認したかったのです。valgrind 以外にも、次のことができます。 時間, これははるかに簡単です。これは、「最高レベル」のメモリ使用量 (RSS および仮想) を測定します。から この答え.

組み込みの ' を使用しますシステムモニター' ubuntuで利用可能な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