この質問は ここで 詳しく説明されています。
Linuxでアプリケーションやプロセスのメモリ使用量をどのように測定しますか?
ブログ記事の Linuxでのメモリ使用量の理解 から、ps
はこの目的に使用する正確なツールではありません。
なぜ
ps
が間違っているのか見方によっては、
ps
はプロセスの実メモリ使用量を報告していません。実際に行っているのは、各プロセスがどれだけの実メモリを占有するかを示していますそれが実行中の唯一のプロセスである場合。もちろん、一般的なLinuxマシンでは常に何十ものプロセスが実行されています。つまり、ps
によって報告されるVSZとRSSの番号はほぼ間違いなく間違っています。
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
ツールを使用してください。
pmap コマンドを試してください。
Sudo pmap -x <process pid>
確実にはわかりませんが、ここでは役立つことができる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
最近のバージョンのLinuxでは、 smaps サブシステムを使用してください。たとえば、PIDが1234のプロセスの場合:
cat /proc/1234/smaps
その時点で使用しているメモリ量が正確にわかります。さらに重要なことは、メモリをプライベートと共有に分割するので、プログラムの複数のインスタンス間で共有されるメモリを含めなくても、プログラムの インスタンス が使用しているメモリ量を判断できます。
これを計算する簡単な方法はありません。しかし、何人かの人々はいくつかの良い答えを得ようとしました:
smem を使用します。これは、USSを計算するpsの代替です。およびプロセスごとのPSS。あなたが望むのはおそらくPSSでしょう。
USS-一意のセットサイズ。これは、そのプロセスに固有の非共有メモリの量です(uniqueメモリの場合、Uと考えてください)。共有メモリは含まれません。したがって、これはプロセスが使用するメモリ量をunder-reportしますが、共有メモリを無視する場合に役立ちます。
PSS-比例セットサイズ。これはあなたが望むものです。共有メモリの割合をそのメモリを共有するプロセスの数で割った値とともに、一意のメモリ(USS)を加算します。したがって、プロセスごとに実際に使用されている物理メモリの量を正確に表すことができます-共有メモリは本当に共有として表されます。 Pはphysicalメモリ用であると考えてください。
これがpsおよび他のユーティリティによって報告されるRSSと比較する方法:
注意: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
はどうですか?
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
これはツールと問題の優れた要約です: archive.org link
より多くの開発者が実際にそれを読むように、私はそれを引用します。
システム全体のメモリー使用量を分析したい場合、または1つのアプリケーションのメモリー使用量(そのヒープ使用量だけでなく)を徹底的に分析したい場合は、 exmap を使用してください。システム全体の分析では、最も効果的な使用率を持つプロセスを見つけ、実際には最も多くのメモリを使い、最も書き込み可能な使用率を持つプロセスを見つけ、最もデータを作成します。そのようなアプリケーションを選択し、2番目のリストビューでそのマッピングを分析してください。詳細はexmapのセクションを見てください。特にXサーバのプロセスが大量のメモリを消費する場合は、 xrestop を使用して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 =コード+データ。
DATA - データ+スタックサイズ(kb):実行可能コード以外に割り当てられた物理メモリの量。「データ常駐セット」サイズまたはDRSとも呼ばれます。
SHR - 共有メモリサイズ(KB):タスクによって使用される共有メモリの量。他のプロセスと潜在的に共有される可能性があるメモリを単に反映しています。
参照 ここ .
プロセスが使用するメモリの量を正確に特定することはできないため、これに対する唯一の答えはありません。 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はあなたにプログラムの寿命を通してメモリ使用量のより良いプロフィールを与えるでしょう。
コードがCまたはC++の場合は、getrusage()
を使用して、メモリに関するさまざまな統計とプロセスの時間使用量を返すことができます。
ただし、すべてのプラットフォームがこれをサポートしているわけではなく、メモリ使用オプションに対して0の値を返します。
代わりに、/proc/[pid]/statm
で作成された仮想ファイルを見ることができます(ここで、[pid]
は自分のプロセスIDに置き換えられます。これはgetpid()
から取得できます)。
このファイルは、7つの整数を含むテキストファイルのようになります。あなたはおそらくこのファイルの最初(全メモリ使用)と6番目(データメモリ使用)の番号に最も興味があるでしょう。
Valgrind 詳細な情報を表示することができますが、それは 遅く ターゲットアプリケーションを大幅に、そしてほとんどの場合それはアプリの動作を変更します。
Exmap 私がまだ知らなかったものですが、情報を取得するには カーネルモジュール が必要なようです。
みんながWRTの「メモリ使用量」を知りたいのは次のように思います。
Linuxでは、単一のプロセスが使用する可能性のある物理メモリの量は、次のカテゴリに大別することができます。
匿名マップメモリ
M.nの名前付きマップメモリ
と呼ばれる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
もう3つの方法があります。
ps aux --sort pmem
%MEM
でソートします。ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
top -a
%MEM
でトップソートを始めます( here から抽出)
私はhtop
を使っています。それはWindowsのタスクマネージャに似たとても良いコンソールプログラムです。
あなたがそれを実行する時間があればValgrindは素晴らしいです。 valgrind --tool=massif
は正しい解決策です。
しかし、私はもっと大きな例を実行し始めており、valgrindを使うことはもはや実用的ではありません。プログラムの最大メモリ使用量(モジュロページサイズと共有ページ)を知る方法はありますか?
本物のUNIXシステムでは、/usr/bin/time -v
は動作します。しかしLinuxでは、これは ではなく は機能します。
#!/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
を実行し、そして "active memory"統計をチェックすることです。アプリケーションを閉じ、数秒待ってからvmstat -s
をもう一度実行します。ただし、多くのアクティブメモリが解放されたことは明らかにアプリによって使用されていました。
コマンドラインの下には、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}'
プロセスがあまりにも多くのメモリを使い果たしていない場合(またはこれが原因であると予想されるため、または他のコマンドがこの初期指示を出しているため)、プロセスが短期間停止しても耐えるgcoreコマンドを使用してください。
gcore <pid>
生成されたコアファイルのサイズを確認して、特定のプロセスが使用しているメモリ量を確認します。
プロセスが数百メガバイト、またはギグを使用している場合、これはあまりうまく機能しません。コア生成にはI/Oパフォーマンスによっては数秒から数分かかることがあるためです。コアの作成中は、メモリの変更を防ぐためにプロセスが停止(または「凍結」)します。ので注意してください。
また、コアが生成されるマウントポイントに十分なディスク容量があること、およびシステムがその特定のディレクトリに作成されているコアファイルに悪影響を与えないことを確認してください。
私は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スクリプトを使うことができます:
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でプロファイリングするよりも早くてカーネルが古くてsmapsを使用できない場合は、(ps -o rss,command
を付けて)プロセスの常駐セットを表示するオプションを付けたpsを使うと、本物の迅速で妥当な_aproximation_
を得ることができます。使用されているスワップされていないメモリの量。
私はあなたが頂上を使用することをお勧めします。あなたはそれについてのすべてを このページ で見つけることができます。それはあなたのプロセスに必要なすべてのKPIを提供することが可能であり、ファイルにキャプチャすることもできます。
linuxのアプリケーションによるメモリ使用量をチェックするためのシェルスクリプトをチェックしてください 。 github およびバージョン のペーストなしおよびbc でも使用可能です。
Ubuntuで利用可能な組み込みの ' システムモニタ ' GUIツールを使用してください。
/ prox/xxx/numa_mapsはそこにある情報を与えます:N0 = ??? N1 =?しかし、この結果は実際の結果よりも低くなる可能性があります。それは、触れられたものだけを数えるからです。
関連する 質問 への回答に基づく
ネットワーク内の特定のデバイスのプロセスのメモリとCPU使用率を取得するには、SNMPを使用することができます。
要件:
注:
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