在Linux中,如何判断有多less内存进程正在使用?

我想我可能在我的LAMP应用程序中有内存泄漏(内存用完,交换开始使用等)。 如果我能看到各种进程正在使用多less内存,这可能会帮助我解决我的问题。 有没有办法让我在* nix中看到这些信息?

获取正确的内存使用情况比人们想象的要棘手。 我能find的最好的方法是 :

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

其中“过程”是您要检查的过程的名称,“types”是下列之一:

  • Rss :驻留内存使用情况,进程使用的所有内存,包括此进程与其他进程共享的所有内存。 它不包括掉期;
  • Shared :该进程与其他进程Shared内存;
  • Private :这个进程使用的私有内存,你可以在这里查找内存泄漏;
  • Swap :交换进程使用的内存;
  • Pss :比例组大小,一个很好的整体记忆指标。 这是Rss调整为共享:如果一个进程有1MiB私有和20MiB共享其他10个进程,Pss是1 + 20/10 = 3MiB

其他有效值是Size (即虚拟大小,这几乎是毫无意义的)和Referenced (当前标记为引用或访问的内存量)。

您可以使用watch或其他bash-script-fu来监视要监视的进程的值。

有关smaps更多信息: http : smaps

使用ps查找应用程序的进程ID,然后使用top -p1010 (用真实进程ID替代1010)。 RES列是使用的物理内存,VIRT列是使用的虚拟内存 – 包括库和交换内存。

更多信息可以用“man top”find

我不知道为什么答案看起来如此复杂……用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 

您可以使用pmap来报告内存使用情况。

概要:

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

先得到pid:

 ps ax | grep [process name] 

接着:

 top -p PID 

您可以同时观看各种stream程:

 top -p PID1 -p PID2 

谢谢。 我用这个来创build这个简单的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 "================="; 

更优雅的方法:

 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 

使用tophtop ,注意“RES”(驻留内存大小)栏。

你想要的工具是ps。 要获得有关Java程序正在执行的信息:

 ps -F -C java 

要获取有关http:

 ps -F -C httpd 

如果您的程序在您有机会运行之前就结束了,请打开另一个terminal并运行:

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

你可以使用pmap + awk

最有可能的是,我们感兴趣的是下面的示例pmap输出的最后一行(82564)中的第三列RSS内存。

 $ 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 rx-- [ anon ] ffffffffff600000 4 0 0 rx-- [ 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" }' 

为什么所有这些复杂的答案与各种shell脚本? 使用htop,它会自动改变尺寸,你可以select你想要显示的信息,它在terminal中工作,所以它不需要桌面。 例如:htop -d8

如果您没有当前或长时间运行的进程来跟踪,可以使用/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 

使用

  • 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