web-dev-qa-db-ja.com

Linuxでは、どのくらいのメモリプロセスが使用されているかをどのように見分けるのですか?

LAMPアプリケーションでメモリリークが発生している可能性があります(メモリが使い果たされる、スワップが使用されるなど)。さまざまなプロセスが使用しているメモリの量を確認できれば、問題の解決に役立つ可能性があります。この情報を* nixで表示する方法はありますか?

60

適切なメモリ使用量を取得することは、考えられるよりも複雑です。私 が見つけることができる最良の方法は です:

echo 0 $(awk '/TYPE/ {print "+", $2}' /proc/`pidof PROCESS`/smaps) | bc

「PROCESS」は検査するプロセスの名前、「TYPE」は次のいずれかです。

  • Rss:常駐メモリ使用量、このプロセスが他のプロセスと共有するすべてのメモリを含む、プロセスが使用するすべてのメモリ。スワップは含まれません。
  • Shared:このプロセスが他のプロセスと共有するメモリ。
  • Private:このプロセスで使用されるプライベートメモリ。ここでメモリリークを探すことができます。
  • Swap:プロセスで使用されるスワップメモリ​​。
  • Pss:Proportional Set Size、優れた全体的なメモリインジケータ。共有用に調整されたRss:プロセスに1MiBプライベートがあり、他の10個のプロセス間で20MiBが共有されている場合、Pssは1 + 20/10 = 3MiB

他の有効な値は、Size(つまり、ほとんど無意味な仮想サイズ)とReferenced(参照またはアクセス済みとして現在マークされているメモリの量)。

watchまたは他のbash-script-fuを使用して、監視するプロセスのこれらの値を監視できます。

smapsの詳細: http://www.kernel.org/doc/Documentation/filesystems/proc.txt

91

なぜ答えがそんなに複雑に見えるのか分かりません... psでこれを行うのはとても簡単なようです:

mem()
{                                                                                                      
    ps -eo rss,pid,euser,args:100 --sort %mem | grep -v grep | grep -i $@ | awk '{printf $1/1024 "MB"; $1=""; print }'
}

使用例:

$ mem mysql
0.511719MB 781 root /bin/sh /usr/bin/mysqld_safe
0.511719MB 1124 root logger -t mysqld -p daemon.error
2.53516MB 1123 mysql /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
45
Greg Slepak

psを使用してアプリケーションのプロセスIDを見つけてから、top -p1010(実際のプロセスIDを1010に置き換えます)。 RES列は使用済みの物理メモリであり、VIRT列はライブラリおよびスワップメモリ​​を含む使用済みの仮想メモリです。

詳細は「man top」を使用して見つけることができます

34
Zaz

最初にpidを取得します。

ps ax | grep [process name]

その後:

top -p PID

さまざまなプロセスを同時に見ることができます:

top -p PID1 -p PID2 
16
Peter

pmap を使用して、メモリ使用量を報告できます。

あらすじ:

pmap [ -x | -d ] [ -q ] pids... 
13

よりエレガントなアプローチ:

echo "Memory usage for PID <>:"; for mem in {Private,Rss,Shared,Swap,Pss};do grep $mem /proc/<pid>/smaps | awk -v mem_type="$mem" '{i=i+$2} END {print mem_type,"memory usage:"i}' ;done
7
user3707180

ありがとう。これを使用して、プロセスとそのメモリ使用量を監視するために使用できるこの単純なbashスクリプトを作成しました。

$ watch watchmypid.sh

#!/bin/bash
#

PROCESSNAME=changethistoyourprocessname
MYPID=`pidof $PROCESSNAME`

echo "=======";
echo PID:$MYPID
echo "--------"
Rss=`echo 0 $(cat /proc/$MYPID/smaps  | grep Rss | awk '{print $2}' | sed 's#^#+#') | bc;`
Shared=`echo 0 $(cat /proc/$MYPID/smaps  | grep Shared | awk '{print $2}' | sed 's#^#+#') | bc;`
Private=`echo 0 $(cat /proc/$MYPID/smaps  | grep Private | awk '{print $2}' | sed 's#^#+#') | bc;`
Swap=`echo 0 $(cat /proc/$MYPID/smaps  | grep Swap | awk '{print $2}' | sed 's#^#+#') | bc;`
Pss=`echo 0 $(cat /proc/$MYPID/smaps  | grep Pss | awk '{print $2}' | sed 's#^#+#') | bc;`

Mem=`echo "$Rss + $Shared + $Private + $Swap + $Pss"|bc -l`

echo "Rss     " $Rss
echo "Shared  " $Shared
echo "Private " $Private
echo "Swap    " $Swap
echo "Pss     " $Pss
echo "=================";
echo "Mem     " $Mem
echo "=================";
6
Paul Rubenstein

追跡するプロセスが現在または長時間実行されていない場合は、/usr/bin/time

これは、Bash timeとは異なります(後で説明します)。

例えば

# /usr/bin/time -f "%M" echo

2028

これは、「ライフタイム中のプロセスの最大常駐セットサイズ(キロバイト)」です(マニュアルページから引用)。つまり、topなどのRESと同じです。

/usr/bin/time

# /usr/bin/time -v echo

Command being timed: "echo"
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): 1988
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 77
Voluntary context switches: 1
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
4
Bell

pmap + awkを使用できます。

最も可能性が高いのは、以下のRSS出力例の最後の行の3列目であるpmapメモリ(82564)です。

$ pmap -x <pid>

Address           Kbytes     RSS   Dirty Mode   Mapping

....

00007f9caf3e7000       4       4       4 r----  ld-2.17.so
00007f9caf3e8000       8       8       8 rw---  ld-2.17.so
00007fffe8931000     132      12      12 rw---    [ stack ]
00007fffe89fe000       8       8       0 r-x--    [ anon ]
ffffffffff600000       4       0       0 r-x--    [ anon ]
----------------  ------  ------  ------
total kB          688584   82564    9592

次に、awkを使用してその値を抽出します。

$ pmap -x <pid> | awk '/total/ { print $4 "K" }'

pmap値はキロバイト単位です。メガバイト単位で必要な場合は、このようなことを行うことができます。

$ pmap -x <pid> | awk '/total/ { print $4 / 1024 "M" }'
4
Ilia Choly

topまたはhtopを使用し、「RES」(常駐メモリサイズ)列に注意してください。

4
Gunther Piez

必要なツールはpsです。 Javaプログラムが実行していることに関する情報を取得するには:

ps -F -C Java 

Httpに関する情報を取得するには:

ps -F -C httpd

これらを実行する機会が得られる前にプログラムが終了する場合、別のターミナルを開いて実行してください:

while true; do ps -F -C myCoolCode ; sleep 0.5s ; done
4
Brian C.

なぜさまざまなシェルスクリプトでこれらの複雑な答えがすべてあるのですか? htopを使用すると、サイズが自動的に変更され、表示する情報を選択でき、ターミナルで機能するため、デスクトップは不要です。例:htop -d8

2
ballsystemlord

つかいます

  • ps u `pidof $ TASKS_LIST`またはps u -C $ TASK
  • ps xu --sort%mem
  • ps h -o pmem -C $ TASK

例:

ps-of()
{
 ps u `pidof "$@"`
}

$ ps-of firefox
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
const    18464  5.9  9.4 1190224 372496 ?      Sl   11:28   0:33 /usr/lib/firefox/firefox

$ alias ps-mem="ps xu --sort %mem | sed -e :a -e '1p;\$q;N;6,\$D;ba'"
$ ps-mem 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
const     3656  0.0  0.4 565728 18648 ?        Sl   Nov21   0:56 /usr/bin/python /usr/lib/ubuntuone-client/ubuntuone-syncdaemon
const    11361  0.3  0.5 1054156 20372 ?       Sl   Nov25  43:50 /usr/bin/python /usr/bin/ubuntuone-control-panel-qt
const     3402  0.0  0.5 1415848 23328 ?       Sl   Nov21   1:16 nautilus -n
const     3577  2.3  2.0 1534020 79844 ?       Sl   Nov21 410:02 konsole
const    18464  6.6 12.7 1317832 501580 ?      Sl   11:28   1:34 /usr/lib/firefox/firefox

$ ps h -o pmem -C firefox
12.7
1
Costa