Sta*_*bie 63 unix linux memory-leaks memory-management
我想我的LAMP应用程序可能有内存泄漏(内存耗尽,交换开始被使用等).如果我能看到各种进程使用了多少内存,它可能有助于我解决我的问题.有没有办法让我在*nix中看到这些信息?
Giu*_*one 93
获得正确的内存使用比人们想象的要复杂.我能找到的最好方法是:
echo 0 $(awk '/TYPE/ {print "+", $2}' /proc/`pidof PROCESS`/smaps) | bc
Run Code Online (Sandbox Code Playgroud)
其中"PROCESS"是您要检查的进程的名称,"TYPE"是以下之一:
Rss
:驻留内存使用情况,进程使用的所有内存,包括此进程与其他进程共享的所有内存.它不包括交换;Shared
:此进程与其他进程共享的内存;Private
:这个进程使用的私有内存,你可以在这里查找内存泄漏;Swap
:交换进程使用的内存;Pss
:比例集大小,一个很好的整体内存指标.调整共享的Rss:如果一个进程有1MiB私有和20MiB在其他10个进程之间共享,则Pss为1 + 20/10 = 3MiB其他有效值是Size
(即虚拟大小,几乎没有意义)和Referenced
(当前标记为引用或访问的内存量).
您可以使用watch
或其他一些bash-script-fu来关注要监视的进程的值.
有关以下内容的更多信息smaps
:http://www.kernel.org/doc/Documentation/filesystems/proc.txt.
Gre*_*pak 47
我不知道为什么答案看起来那么复杂......这样做看起来很简单ps
:
mem()
{
ps -eo rss,pid,euser,args:100 --sort %mem | grep -v grep | grep -i $@ | awk '{printf $1/1024 "MB"; $1=""; print }'
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
$ 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
Run Code Online (Sandbox Code Playgroud)
Zaz*_*Zaz 35
使用ps
找到应用程序的进程ID,然后使用top -p1010
(替代1010为真正的进程ID).RES列是使用的物理内存,VIRT列是使用的虚拟内存 - 包括库和交换内存.
更多信息可以使用"man top"找到
Pet*_*ter 16
首先得到pid:
ps ax | grep [process name]
Run Code Online (Sandbox Code Playgroud)
然后:
top -p PID
Run Code Online (Sandbox Code Playgroud)
您可以在同一时间观看各种流程:
top -p PID1 -p PID2
Run Code Online (Sandbox Code Playgroud)
Sun*_*lly 13
您可以使用pmap报告内存使用情况.
概要:
pmap [ -x | -d ] [ -q ] pids...
Run Code Online (Sandbox Code Playgroud)
小智 7
更优雅的方法:
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
Run Code Online (Sandbox Code Playgroud)
小智 6
谢谢.我用它来创建这个简单的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 "=================";
Run Code Online (Sandbox Code Playgroud)
如果您没有要跟踪的当前或长时间运行的进程,则可以使用/usr/bin/time
.
这与 Bash 不同time
(如您所见)。
例如
# /usr/bin/time -f "%M" echo
2028
Run Code Online (Sandbox Code Playgroud)
这是“进程在其生命周期内的最大驻留集大小,以千字节为单位”(引自手册页)。也就是说,与等人中的RES相同top
。
您可以从中获得更多/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
Run Code Online (Sandbox Code Playgroud)
你想要的工具是ps。要获取有关 java 程序正在执行的操作的信息:
ps -F -C java
Run Code Online (Sandbox Code Playgroud)
获取有关http的信息:
ps -F -C httpd
Run Code Online (Sandbox Code Playgroud)
如果您的程序在您有机会运行这些程序之前就结束了,请打开另一个终端并运行:
while true; do ps -F -C myCoolCode ; sleep 0.5s ; done
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
115096 次 |
最近记录: |