我认为我的LAMP应用程序可能存在内存泄漏问题(内存被占用、开始使用交换空间等)。如果我可以看到各个进程正在使用多少内存,这可能有助于解决我的问题。在*nix系统中,有没有一种方法可以让我查看这些信息?
我认为我的LAMP应用程序可能存在内存泄漏问题(内存被占用、开始使用交换空间等)。如果我可以看到各个进程正在使用多少内存,这可能有助于解决我的问题。在*nix系统中,有没有一种方法可以让我查看这些信息?
获取正确的内存使用情况比人们想象的更加棘手。我所能找到的最好方法是:链接:
echo 0 $(awk '/TYPE/ {print "+", $2}' /proc/`pidof PROCESS`/smaps) | bc
在这里,“PROCESS”是你想要检查的进程名称,“TYPE”是以下之一:
Rss
:常驻内存使用情况,包括该进程使用的所有内存以及与其他进程共享的所有内存。不包括交换空间;Shared
:该进程与其他进程共享的内存;Private
:该进程使用的私有内存,可以在此处查找内存泄漏;Swap
:该进程使用的交换内存;Pss
:比例集大小,是一个很好的总体内存指标。它是Rss调整后的共享值:如果一个进程具有1MiB的私有内存和20MiB共享内存,则Pss为1 + 20/10 = 3MiB其他有效的值包括Size
(即虚拟大小,几乎没有意义)和Referenced
(当前标记或访问的内存量)。
您可以使用watch
或其他bash脚本工具来监视您想要监视的进程的这些值。
有关smaps
的更多信息,请参见:http://www.kernel.org/doc/Documentation/filesystems/proc.txt。
echo 0 $(sudo awk '/TYPE/ {print "+", $2}' /proc/PID/smaps) | bc
- Bryanawk
来代替传递给bc
呢?在/proc/PID/smaps
文件中执行如下命令awk 'BEGIN { used=0 }; /TYPE/ { used += $2 } END { print used }'
将会以KB为单位输出所需的大小。请注意,此翻译已经尽可能简化和通俗易懂,但保留了原始意思,没有提供任何额外的解释或信息。 - Glen Solsberryps
似乎很简单: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
.zshrc
文件中。 - watzonargs:100
和--sort %mem
选项):mem()
{
ps -ef -o rss,pid,user | grep -v grep | grep -i "$@" | awk '{printf $1/1024 "MB"; $1=""; print }'
}```
- Bryanps
命令查找应用程序的进程ID,然后使用top -p1010
(将1010替换为实际的进程ID)。
RES列是已使用的物理内存,VIRT列是已使用的虚拟内存-包括库和交换内存。top -p\
ps -ef | grep -i $NAME_OF_PROCESS | grep -v grep | gawk '{print $2}'``。 - Trevor Boyd Smith首先获取pid:
ps ax | grep [process name]
然后:
top -p PID
你可以同时观看多个进程:top -p PID1 -p PID2
pmap $(pgrep -f -u username /usr/bin/gnome-shell)| sed -n -e 's/ total \+//p' | numfmt --from=iec
1724678144 - TiCPU如果您没有需要跟踪的当前或长时间运行的进程,您可以使用/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
gnu-time
软件包,Homebrew提供了正确的工具。它安装了一个叫做gtime
的实用程序,可以完成你所说的功能。 - voxobscuro更优雅的方法:
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
#!/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 "=================";
使用 top
或 htop
命令,并关注 "RES" (驻留内存大小) 列。
ps -F -C java
获取有关http的信息:
ps -F -C httpd
如果您的程序在运行这些命令之前就结束了,请打开另一个终端并运行:
while true; do ps -F -C myCoolCode ; sleep 0.5s ; done