操作系统的资源总是有限,必要时可进行监视,也有利于调查一些问题。内存监控的工具除了全能的top、ps、vmstat之外,还有几个专用的工具:
free
/proc/meminfo
/proc/<pid>/smaps
以监控进程的使用内存为例。在统计某个进程的内存使用时,可以利用smaps,它包含了该进程目标程序和共享库的内存分配和使用。监控时,分别统计shared和private部分的内存,然后相加就是该进程使用的内存。其中,shared包含clean和dirty两部分,private也一样。
监控进程内存的脚本mem_monitor.sh, 每隔10s输出变化后的内存使用状况。源码如下:
#! /bin/sh
PROCNAME=$1
PROCID=`ps -ef | grep $PROCNAME | grep -v grep | grep -v /bin/sh | awk '{print $2}'`
LOG_FILE=${PROCNAME}_memory.log
TEMP=0
while true; do
cd /proc/$PROCID
Shared_Clean=`cat smaps | grep Shared_Clean | awk 'BEGIN{x=0} {x=x+$2} END{print x}'`
Shared_Dirty=`cat smaps | grep Shared_Dirty | awk 'BEGIN{x=0} {x=x+$2} END{print x}'`
Private_Clean=`cat smaps | grep Private_Clean | awk 'BEGIN{x=0} {x=x+$2} END{print x}'`
Private_Dirty=`cat smaps | grep Private_Dirty | awk 'BEGIN{x=0} {x=x+$2} END{print x}'`
SHARED_TOTAL=`expr $Shared_Clean + $Shared_Dirty`
PRIVATE_TOTAL=`expr $Private_Clean + $Private_Dirty`
TOTAL=`expr $SHARED_TOTAL + $PRIVATE_TOTAL`
if [ "${TEMP}" != "${TOTAL}" ]; then
CURRDATE=`date`
echo "pid: $PROCID, Name: $PROCNAME, Date: $CURRDATE"
echo "Shared: $SHARED_TOTAL kB, Private: $PRIVATE_TOTAL kB, Total: $TOTAL kB"
TEMP="${TOTAL}"
fi
sleep 10
done >> ~/$LOG_FILE
测试运行:
./mem_monitor.sh myprocess &