アプリケーションまたはプロセスの実際のメモリ使用量を測定するにはどうすればよいですか?
質問
この質問はカバーされています ここ 非常に詳細に。
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 ヒープはコピーオンライトを取得し、プロセス間で共有される可能性があります (編集済み)
- .p プライベート
M.n という名前のマップされたメモリ
- .p プライベート
- .d ダーティ == ファイル mmapped 書き込みメモリ プライベート
- .c clean == マップされたプログラム/ライブラリ テキスト プライベート マップ
- .s が共有されました
- .d ダーティ == ファイル mmapped 書き込みメモリ共有
- .c clean == マップされたライブラリ テキスト共有マップ
- .p プライベート
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 つの方法を試してみてください。
ps aux --sort pmem
出力を次の基準で並べ替えます。%MEM
.ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
パイプを使用してソートします。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;
これにより、継続的に変更が検索され、印刷されます。
Valgrind を使用したプロファイリングよりも迅速な処理が必要で、カーネルが古く、smap を使用できない場合は、プロセスの常駐セットを表示するオプションを備えた ps ( ps -o rss,command
)を迅速かつ合理的に提供できます _aproximation_
使用されているスワップされていないメモリの実量。
上から使用することをお勧めします。それについてはすべて次のサイトで見つけることができます このページ. 。プロセスに必要なすべての KPI を提供でき、ファイルにキャプチャすることもできます。
確認するシェルスクリプトを確認する Linuxのアプリケーションによるメモリ使用量。以下でも利用可能 ギットハブ そしてあるバージョンでは ペーストとBCなし.
組み込みの ' を使用しますシステムモニター' 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