应用编程中,比较常见的错误是内存方面的问题,比如内存泄漏。内存问题带来的影响较广泛,大至内存耗尽(OutOfMemory)或系统崩溃,小至拖慢进程的运行速度。而且,很多系统为了加快进程的启动速度,采用了预加载技术,当诸多预加载的守护进程长时间不用的时候,这也会占用系统的一部分资源,包括内存。为了发现问题或调试程序,就很有必要监控系统的内存使用状况。系统内存的监控方法有free、ps、pmap、procfs等。
先看下众所周知的free工具。
free命令显示物理主内存和交换空间的内存统计数据。指定-t参数可以显示总内存数量,指定-b参数可以按字节为单位进行显示,使用-m则以兆为单位显示,默认情况下是以kB(千字节)为单位的。free命令也可以使用-s参数加一个延迟时间(单位:秒)连续运行,如下所示:
[workbox: /home/luojianh ]$ free -s 1
[workbox: /home/luojianh ]$ free -s 1
total used free shared buffers cached
Mem: 33264720 7356628 25908092 0 306756 3866276
-/+ buffers/cache: 3183596 30081124
Swap: 32764556 0 32764556
free加-t参数统计total值。
[workbox: /home/luojianh ]$ free -t
total used free shared buffers cached
Mem: 33264720 23963860 9300860 0 321508 4725668
-/+ buffers/cache: 18916684 14348036
Swap: 32764556 0 32764556
Total: 66029276 23963860 42065416
第一行Mem和第二行的差别在于buffers/cached,这两个是实际上未必在使用的内存。他们的关系是:
used1-used2=free2-free1=buffers+cached。
总共的物理内存为:total1=used1+free1=used2+free2。(1表示第一行,2表示第二行)
重点说明其中的buffers和cached字段。buffers是block device cache,cached是memory paging cache。前者是用于访问不同速度设备的缓冲,后者是用于访问文件的缓存(比访问flash等disk设备快得多!)。
用free命令监控系统的总体内存使用状况,shell脚本如下:
LOG_FILE=/tmp/memory_status.log
echo "Total Used UsingRate" >> ${LOG_FILE}
free -s 3 >> ${LOG_FILE}.tmp
while true; do
TOTAL=$(free -t | grep Mem | awk '{print $2}')
USED=$(free -t | grep cache: | awk '{print $3}')
RATE_USED=`expr $USED / $TOTAL`
echo "$TOTAL $USED $RATE_USED" >> ${LOG_FILE}
sleep 3
done
附带提一下,vmstat、top等系统命令也包含部分内存信息。如下所示。
root@base0:/root ]$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
8 1 0 2563344 467536 7745908 0 0 5 35 2 6 3 20 77 0 0
7 0 0 2564116 467576 7747912 0 0 2036 632 6620 437995 30 51 17 2 0
2 1 0 2589984 467632 7749200 0 0 408 0 3680 469111 24 58 17 2 0
8 0 0 2557996 467648 7750060 0 0 160 0 2187 480338 28 54 14 3 0
root@base0:/root ]$ top
top - 11:51:54 up 4 days, 11:11, 1 user, load average: 0.27, 0.37, 0.39
Tasks: 200 total, 1 running, 198 sleeping, 0 stopped, 1 zombie
Cpu(s): 0.1%us, 0.6%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 2543164k total, 1296080k used, 1247084k free, 7388k buffers
Swap: 0k total, 0k used, 0k free, 916580k cached
……
……