812

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

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

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

見方によってはps、プロセスの実際のメモリ使用量を報告していません。実際に行っていることは、実行中のプロセスが 1 つしかない場合に、各プロセスが実際にどれだけのメモリを消費するかを示すことです。もちろん、典型的な Linux マシンでは、常に数十のプロセスが実行されpsいます

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

4

32 に答える 32

404

または同様のツールを使用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 の (既定の) ツールを使用します。

于 2008-09-25T03:33:27.753 に答える
317

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

sudo pmap -x <process pid>
于 2010-05-12T04:08:37.917 に答える
199

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

$ ps aux

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

にアクセスして、 /procファイル システムから詳細な統計情報を取得することもできます/proc/$pid/status

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

/proc/19420$ 猫の状態
名前: ファイアーフォックス
状態:S(寝ている)
Tgid: 19420
ピッド: 19420
ピッド: 1
トレーサーピッド: 0
ユーザー ID: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FD サイズ: 256
グループ: 4 6 20 24 25 29 30 44 46 107 109 115 124 1000
VmPeak: 222956kB
VmSize: 212520 kB
VmLck: 0kB
VmHWM: 127912kB
VmRSS: 118768kB
VmData: 170180 kB
VmStk: 228kB
VmExe: 28kB
VmLib: 35424 kB
VmPTE: 184kB
スレッド: 8
シグQ: 0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
署名ブロック: 0000000000000000
署名: 0000000020001000
SigCgt: 000000018000442f
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
Cpus_allowed: 03
Mems_allowed: 1
Voluntary_ctxt_switches: 63422
nonvoluntary_ctxt_switches: 7171

于 2008-09-25T03:49:42.410 に答える
143

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

cat /proc/1234/smaps

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

于 2009-08-06T09:43:38.970 に答える
133

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

于 2008-09-25T13:46:51.307 に答える
130

プロセスごとの USS と PSS を計算するpsの代わりにsmemを使用します。おそらくPSSが必要です。

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

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

psやその他のユーティリティによって報告された RSS との比較:

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

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

于 2012-12-06T23:10:37.167 に答える
81

を使用し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
于 2015-11-04T21:51:08.933 に答える
41

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

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

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

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

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

于 2009-09-29T09:47:23.367 に答える
40

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

top

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

top -p <PID>

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

top | grep <PROCESS NAME>

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

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

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

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

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

ここを参照してください。

于 2015-05-18T08:58:38.230 に答える
21

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

于 2008-09-29T02:44:26.503 に答える
18

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

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

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

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

于 2010-09-08T09:56:21.233 に答える
9

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

于 2012-10-09T10:20:18.823 に答える
9
#!/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
于 2011-08-09T17:50:09.323 に答える
6

より「実際の」使用法をテストするには、アプリケーションを開いて を実行しvmstat -s、「アクティブなメモリ」の統計を確認します。アプリケーションを閉じ、数秒待ってからvmstat -s再度実行してください。

解放されたアクティブ メモリの量は、明らかにアプリケーションによって使用されていました。

于 2011-03-07T08:29:30.683 に答える
6

以下のコマンド ラインは、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}'
于 2013-03-04T07:59:15.623 に答える
5

Valgrindを取得します。実行するプログラムを渡すと、メモリ使用量について多くの情報が表示されます。

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

于 2008-09-25T04:21:57.590 に答える
5

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

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

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

于 2014-08-07T13:35:44.273 に答える
2

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

于 2014-10-02T15:55:19.200 に答える
2

ここでValgrindにもう 1 票を投じますが、 Alleyoopのようなツールを使用して、Valgrind によって生成された結果を解釈できることを付け加えたいと思います。

私は常に 2 つのツールを使用しており、無駄のない、漏れのないコードを誇らしげに示しています ;)

于 2008-09-25T14:02:06.527 に答える
0

関連する質問への回答に基づいています。

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

要件:

  • プロセスを実行しているデバイスがsnmpインストールされ、実行されている必要があります
  • snmp以下のスクリプトを実行する場所からのリクエストを受け入れるように設定する必要があります(ファイルsnmpd.confで設定できます)
  • 監視するプロセスのプロセス ID (PID) を知っておく必要があります。

ノート:

  • HOST-RESOURCES-MIB::hrSWRunPerfCPUは、このプロセスによって消費されるシステムの CPU リソースの合計のセンチ秒数です。マルチプロセッサ システムでは、この値は実 (ウォール クロック) 時間の 1 センチ秒で 1 センチ秒以上増加する可能性があることに注意してください。

  • HOST-RESOURCES-MIB::hrSWRunPerfMemは、このプロセスに割り当てられた実際のシステム メモリの合計量です。

プロセス監視スクリプト

echo "IP address: "
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
于 2016-01-19T07:55:19.113 に答える
0
  • 最後になりましたが、htopを使用してください。

    sudo apt-get update
    sudo apt-get install htop
    
  • 以下のコマンドを使用して htop を実行します。

    htop
    
于 2020-10-21T14:34:27.907 に答える