vmware下内存丢失查找

有台服务器,4G内存的。 可以显示可用的内存数字有1070MB, 可机器上没有什么进程占用大量的内存啊,于是就慢慢开始找原因了。 然后用了之前yufeng提供的一段内存检查的代码来进行检查,看是否有slapinfo和pagetable占用的多。http://blog.yufeng.info/archives/2456

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#/bin/bash
for PROC in `ls /proc/|grep "^[0-9]"`
do
if [ -f /proc/$PROC/statm ]; then
TEP=`cat /proc/$PROC/statm | awk '{print ($2)}'`

RSS=`expr $RSS + $TEP`
fi
done
RSS=`expr $RSS * 4`
PageTable=`grep PageTables /proc/meminfo | awk '{print $2}'`
SlabInfo=`cat /proc/slabinfo |awk 'BEGIN{sum=0;}{sum=sum+$3*$4;}END{print sum/1024/1024}'`

echo $RSS"KB", $PageTable"KB", $SlabInfo"MB"
printf "rss+pagetable+slabinfo=%sMBn" `echo $RSS/1024 + $PageTable/1024 + $SlabInfo|bc`
free -m

可执行下来的结果,显示已用的vmrss+pagetable+slapinfo总共才1.4GB左右 于是想是不是一些inode占用了比较多的内存,于是在sysctl.conf中加入了如下参数将内存的caches,denties和inodes等信息sync到磁盘上

1
vm.drop_caches = 3 

可执行了sysctl后也就清理了50MB内存,那剩下的内存呢。 然后就查看/proc/meminfo,看看是否free命令有bug啊 看来这里也没有啊,这个结果跟free出来的结果是一致的。 于是就开始 /proc/PID/status 里面的vm部分进行累加计算,发现vmsize的累加的值跟这个内存使用的大小还是很接近的。

1
2
3
4
5
6
7
8
9
10
11
12
for PROC in `ls /proc/|grep "^[0-9]"`
do
if [ -f /proc/$PROC/status ]; then
TEP=`grep 'VmSize' /proc/$PROC/status |awk '{print ($2)}'`
if [ ! -n $TEP ];
then
TEP=0
fi
VMSIZE=`expr $VMSIZE + $TEP`
fi
done
echo $VMSIZE

这个时候想到,这个虚拟机是在vmware之上的,会不会是vmware的一个bug呢。放狗搜索了一把,还真果然很多人提到了这个问题。 https://access.redhat.com/site/solutions/43729 http://forums.opensuse.org/showthread.php/466043-memory-usage-problem-11-4-vmware 无论是opensuse还是rhel都有这个问题啊。 里面也说到最终的解决办法了,它是直接就关闭了,不过由于vmware-tools带了一些比较好的驱动等等,所以我这边还是先重启一下,后期再改一下guest memory manager部分。