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


712

ここでは、この質問について詳しく説明します。

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

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

なぜps「間違っている」のか

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


6
この質問は、おそらく最近ではserverfault.comに属していますが、「移行するには古すぎる」と言われています。ただし、実際には閉じたくないのですが...
thomasrutter

この質問を参照してください。stackoverflow.com/questions/669438/...
Bloodmoon

2
実際にpsはそれも表示されません-仮想メモリと常駐メモリの数が表示されます。仮想は、プロセスが理論的に使用できるメモリの最大量であり、それが唯一のプロセスであったため(決してそうではありません)、割り当てたすべてのページを使用しました(決して起こりません)また、ページをマップまたはマップ解除しませんでした(可能性は低い)。常駐中は、物理メモリに現在マッピングされている仮想メモリの量が表示されます。virt > usage > resただし、通常は64ビットシステムvirt ~= res*10では非常に広範囲です。
Dima Tisnek

5
リンクされた記事からの抜粋はまったくナンセンスです。RSSは実際に使用される物理メモリであり、プロセスが実行中のプロセスが1つだけであっても、VSZは物理メモリの使用に変換される場合と変換されない場合があります。
David Schwartz

回答:


356

ps同様のツールまたはあなただけの、そのプロセスによって割り当てられたメモリページの量を取得します。この番号は正しいですが、次のとおりです。

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

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

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

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

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

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

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

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


44
valgrindによって生成された結果を解釈するには、alleyoopをお勧めします。それほど凝ったものではなく、リークの原因を突き止めるために知っておくべきことを簡単に伝えます。ユーティリティの素敵なペア。
ダン、

6
(a)は正しい。使用されているページと、malloc()やnewなどの呼び出しを介してアプリケーションによって実際に割り当てられたメモリには違いがあります。
jcoffland 2010年

63
これは本当にvalgrindを使用してメモリ使用量を取得する方法を教えていないのですか?
マットジョイナー、2011年

11
デフォルトのvalgrindツールであるmemcheckは、メモリリークの検出に役立ちますが、実際にはメモリプロファイラではありません。そのためには、valgrind --tool = massifが必要です。
Todd Freed

3
@DavidSchwartzあなたの発言が私の意見とどのように矛盾しているかはわかりません。私の言っていることを実際に読むよりも、あなたが私が「間違っている」というあなたの点にあまりにも心配しているように感じます。ここで私の重要な点は、RSSはアプリケーションの実際のメモリ使用量の不適切な尺度であり、最後の2つの文でまったく同じことを言っているということです。そもそも、RSSの縮小を最初に取り上げた理由は何だと思いましたか。それで、私が言及している正確なことによって私が「間違っている」ことを証明するために、私にそれを綴り返すように?私に対するあなたの態度は面倒です。
ypnos

280

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

sudo pmap -x <process pid>

45
sudoで実行するか、エラーが発生せず、メモリが消費されていません。
Matt

22
OSXには存在しません(Googleからここに来るすべての人向け)
jcollum

3
それは質問に対する完全な答えです!ps。私のシェルでは、pmapはsudoなしでプロセスを読み取ることができます。
MasterControlProgram 2016年

7
OS X(一見OPの問題ではないようです)については、vmmap(1)を使用して同様のデータを見ることができます
jrg

注:完全に異なる回答を提供しますgnome-system-monitor
リバマー2018

190

はっきりとはわかりませんが、役立つ2つの「近い」ことがここにあります。

$ ps aux 

仮想サイズ(VSZ)を提供します

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

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

/ proc / 19420 $猫のステータス
名前:Firefox
状態:S(眠っている)
Tgid:19420
Pid:19420
PPid:1
TracerPid:0
Uid:1000 1000 1000 1000
ギッド:1000 1000 1000 1000
FDSize:256
グループ:4 6 20 24 25 29 30 44 46107109115124 1000 
VmPeak:222956 kB
Vmサイズ: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
スレッド: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


21
何か不足していますか?psで報告されたVSZとRSSは誤解を招くので、質問はプロセスによるメモリ使用量をより適切に測定する方法を尋ねました。あなたの答えはVSZを調べる方法の詳細です-誤解を招くものとして言及されたのと同じ値。
thomasrutter

16
@thomasrutterはい、元の質問(rev 1)がありません。何度か編集されており、かなり古くなっています(2008)。元の質問は、プロセスのメモリ使用量を測定する方法を尋ねたところです。ただし、古くなっている場合は自由に質問と回答を編集してください。:)
DustinB 2014

1
注:完全に異なる回答を提供しますgnome-system-monitor
リバマー2018

131

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

cat /proc/1234/smaps

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


pmapはそれへのより簡単なインターフェースだと思います。
リバマー

126

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


niceはメモリとプロセスの
明確

非常にスマートで、非常にスマートなグループ化です。
ローマー、2014

うん、確かにかなりいい。私は見つけるps_memsmem例えば同時に、エンドユーザーの対策のために非常に便利。pmapの非常に詳細な出力は開発者向けです... exの各フォント、アドオン、ライブラリのFirefoxのメモリ使用量を取得できます。みなさんありがとうございます。@ Bash、@ thomasruther。
tuk0z 2015

これはこれまでのところ、出力に一致する唯一のものですgnome-system-monitor
ribamar

110

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

  • USS-固有のセットサイズ。これは、そのプロセスに固有の非共有メモリの量です(と考えるUのためのユニークなメモリ)。共有メモリは含まれません。したがって、これはプロセスが使用するメモリ量を過小評価しますが、共有メモリを無視したい場合に役立ちます。

  • PSS-プロポーショナルセットサイズ。これはあなたが望むものです。一意のメモリ(USS)と、そのメモリを共有するプロセスの数で割った共有メモリの割合を足し合わせます。したがって、プロセスごとに実際に使用されている物理メモリの量を正確に表すことができます-共有メモリは実際に共有として表されます。P物理メモリを表すと考えてください。

これが、psや他のユーティリティによって報告されたRSSとどのように比較されるか:

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

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


2
RSSの重要なポイントの1つは、最近のほとんどのアプリケーションが多くのコードページを共有していることです。すべての共有ライブラリ(libcやlibstdc ++など)は、それを使用するすべてのプロセスでカウントされます。また、実行中のプロセスのインスタンスが複数ある場合、そのコードはすべて二重にカウントされます。
David C.

1
正確には、これがRSSがプロセスごとの実際の物理メモリに関して過大な報告をする理由です。
thomasrutter 2014年

3
smemは私が必要としたものです。新しいプロセスインスタンスを起動するたびに-tを指定して実行すると、各インスタンスが消費するメモリを確認できます。クロムの場合:smem -t -P '/ opt / google / chrome'
xtian

smemのドキュメントを見つけるのに苦労しています。デフォルトでは、バイト、キロバイト、またはメガバイトで出力されますか?
ZN13 2017年

4
TL; DR:USS =プロセスが強制終了された場合に解放される物理メモリの量、PSS =既存のプロセスが強制終了されない場合にこのプロセスがシステムから必要とする物理メモリの量、RSS =アクセス可能な物理メモリの量このプロセス(ただし、常に排他的アクセスとは限りません)。
ミッコランタライネン2018

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

1
たとえば30秒間にメモリの25%以上を使用するプロセスのみが存在するようにリストをフィルタリングする方法はありますか?PHPEclipseデバッガーを使用しているときに、Chromeブラウザーなどの実行されていないプロセスを確認しようとしています。
ステファン

そのフィルタはすばらしいでしょう
aleix

1
できるだけ早く投稿します。
Lokendra Singh Rawat 2017

2
すごい!ただし、ループはx=2pidとユーザーも出力するように開始する必要があります。
Boris Brodski、

70

どうtimeですか?

ないバッシュの組み込みtimeが、あなたが見つけることができる1 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

私もです。これは、powercron.euでタスクのプロファイルを作成するために使用する方法です:)
Moonchild

5
brew install gnu-time次にgtime、macOSを使用している場合に使用します。
Nobu

4
欠点:プロセスの実行が完了するまで結果を取得できません。実行中のプロセスのリアルタイム監視には使用できません。
Makesh 2018

/ usr / bin / time -f '%M'
infomaniac

1
\ timeを使用して呼び出すこともできます(バックスラッシュを使用してシェルの内部時間を使用しないようにします)。
ラウル・サリナス- Monteagudo

39

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

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

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

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

あなたはどちらか、ヒープ(malloc関数などに)アプリケーションの使用状況を分析して、それを実行したい場合はmemprofかとkmtrace、アプリケーションのプロファイリングおよび最大の配分のための関数呼び出しツリーを検索します。詳細については、セクションを参照してください。


28

答えにリストされている解決策のほかに、Linuxコマンド「top」を使用できます。これは、実行中のシステムの動的リアルタイムビューを提供し、システム全体のCPUとメモリの使用率を、すべてのプログラムごとにパーセンテージで示します。

top

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

top -p <PID>

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

top | grep <PROCESS NAME>

「top」には、次のようなフィールドもあります。

VIRT-仮想イメージ(kb):タスクが使用する仮想メモリの総量

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

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

SHR-共有メモリサイズ(kb):タスクが使用する共有メモリの量。単に他のプロセスと共有される可能性のあるメモリを反映しているだけです。

参照はこちら


20

プロセスが使用するメモリの量を正確に特定することができないため、これに対する単一の答えはありません。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を使用すると、一度に十分なメモリ使用量の情報が得られると思います。一方、valgrindは、プログラムの存続期間を通じてメモリ使用量のより良いプロファイルを提供します


プロセスがVMで使用しているメモリの量を見つけようとしていて、それを使用してkubernetesのメモリ制限を設定したいので、この回答に同意します。したがって、pmap
Deepak Deoreが

16

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

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

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

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


これはすべてのプラットフォームでサポートされているわけではないことに注意してください。
CashCow 2010

Linuxのmanページ(linux.die.net/man/2/getrusage)によると、getrusageはSVr4、4.3BSD、およびPOSIX.1-2001仕様の一部です(POSIXはutimeおよびstimeフィールドのみを指定していることに注意してください)。非UNIXプラットフォームでの作業にそれを期待していない(他のプラットフォーム用のUNIXの機能を提供するCygwinのような環境を経由して、おそらく、除きます。)
デビッド・C.

@DavidC。OPはLinuxについて質問しています。
Alexis Wilke

@CashCow、つまり、LinuxでのC / C ++の関数をgetpid()知らないからgetprocessid()です。
Alexis Wilke

12

Valgrindは詳細情報を表示できますが、ターゲットアプリケーションの速度を大幅に低下させ、ほとんどの場合、アプリの動作を変更します。
Exmapはまだ知りませんでしたが、情報を取得するためにカーネルモジュールが必要なようです。これは障害になる可能性があります。

誰もがWRTの「メモリ使用量」を知りたいのは次のとおりだと思います...
Linuxでは、単一のプロセスが使用する物理メモリの量は、次のカテゴリに大別できます。

  • Ma匿名マップメモリ

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

    • .pプライベート
      • .dダーティ==ファイルmmmap書き込みメモリプライベート
      • .c clean ==マップされたプログラム/ライブラリテキストプライベートマップ
    • .sを共有
      • .dダーティ==ファイルのマッピングされた書き込みメモリを共有
      • .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

10

試す3つの方法:

  1. ps aux --sort pmem
    出力をでソートします%MEM
  2. ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
    パイプを使用して並べ替えます。
  3. top -a
    上位の並べ替えを開始します %MEM

ここから抜粋)


2
topそしておそらく他の人たちは実際にプロセスが使用しているメモリを正確に表現していないでしょう。たとえば、64GiBのRAMがあり、postgresそれぞれに16GiB RESと25%MEMを報告する10個のプロセスがあります。もちろん、すべてが25%を使用しているわけではありません...それぞれに15GiB SHRもあり、それを共有しているようです。
sudo 2016年

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

5
kshは標準シェルです。デスクトップユーザーまたは最小限の目的でLinuxディストリビューションにデフォルトでインストールされていない場合がありますが、ほとんどすべてのunix- / linux OSで1つのコマンドだけです。(すなわち、すべてのBSD、すべての実際のUNIX、RHEL、SLES、Debian、Ubuntu、OSX)
Florian Heigl

このファイルには、デフォルトでrootユーザーのみがアクセスできます。
ドミトリーギン

以下は、上記のsed | awk内容をBusybox v1.23.2に書き直したものであり、動作します。 sed -n 's/^Size:\s\+\(\S\+\) .*/\1/p' /proc/$1/smaps | awk '{s+=$1} END {print s}'
JánSáreník16年

1
@Catskul-POSIX標準では、標準シェルを、Bourneシェルの拡張バージョンであるKornシェルの厳密なサブセットとして指定しています。
ceph3us 2016年

8

私は使用していhtopます。Windowsタスクマネージャーに似た非常に優れたコンソールプログラムです。


私は使用してhtopおり、topよりも優れていますが、異なるアプリからのすべてのスレッドをグループ化せずに表示します。
ソリン

1
$ htop -p $(pgrep <your process name> | xargs | tr '' '、')
AAAfarmclub

6

プロセスが大量のメモリを使用していない場合(これが原因であると予想される場合、または他のコマンドがこの最初の兆候を示しているため)、プロセスが短時間の停止に耐えることができる場合は、 gcoreコマンドを使用します。

gcore <pid>

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

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

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


6

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

5

以下のコマンドラインは、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

より「現実の」使用状況の適切なテストは、アプリケーションを開いて実行vmstat -sし、「アクティブメモリ」統計を確認することです。アプリケーションを閉じ、数秒待ってからvmstat -s再度実行します。ただし、多くのアクティブなメモリが解放されたことが明らかにアプリによって使用されていました。


3
これはpsよりも優れていますか?psのすべての制限があり、さらに不正確です
レスターチャン

典型的なUnixシステムには、常に多くのプロセスが開始および終了しています。空きRAMを予測することはできません。
ラウル・サリナス- Monteagudo

4

valgrindを取得します。実行するプログラムを指定すると、メモリ使用量について多くのことがわかります。

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


いいえ、valgrindを実行中のプロセスに「アタッチ」することはできません。これは仕様によるものです。
Dima Tisnek

3

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

これにより、継続的に変更が検索され、印刷されます。

ここに画像の説明を入力してください


3

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


3

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


2
PSIZE ["このプロセス(またはユーザー)の比例メモリサイズ] atop -Rを表示するには、を使用して上から起動します。ユーザーごとのサマリープッシュを表示するにはp、メモリ使用量でソートするには、上から「M」を押します。これにより、smemと同様の数値が得られます。
Markus Strauss


1

別の投票 ここでは、valeyndによって生成された結果を解釈するのに役立つAlleyoopなどのツールを使用できることを付け加えておきます。

私は常に2つのツールを使用しており、リーンでリークのないコードを常に誇らしげに見せています。


1

この質問は、現在実行中のプロセスを調べることに関するもののようですが、アプリケーションが最初から最後まで使用するピークメモリを確認したいと思いました。valgrindの他に、はるかに簡単なtstimeを使用できます。「ハイウォーター」メモリ使用量(RSSおよび仮想)を測定します。この答えから。


ほとんどのアプリケーション(つまり、malloc()およびmallocのようなメモリライブラリを使用するアプリケーション)は、プロセスが終了するまでOSにページを返しません。したがって、PS(またはプロセスのヒープを掘り下げないその他のツール)で表示される量は、最高水準点になります。
David C.

0

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

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

要件:

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

0

/ prox / xxx / numa_mapsはそこにいくつかの情報を提供します:N0 = ??? N1 = ???。しかし、この結果は触れられたものだけを数えるので、実際の結果よりも低いかもしれません。


-1

ubuntuで利用可能な組み込みの「システムモニター」GUIツールを使用する


1
少なくとも16.04以降は非常にうまく機能しています。それはトップに非常によく似ていますが、使用されるメモリは極端に正確ではありません...
Alexis Wilke
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.