今天客户反应通过监控,发现服务器内存使用率非常高,超过90%,使用free命令查看确实是这样,但是通过top命令查看,发现内存&cpu使用都非常少,服务器和应用完全没有高压的状况。
网上找了些资料,成功解决了问题,将方式记录如下:
首先使用free命令查看内存使用状况
used=total-free 即 total=used+free
实际内存占用:used-buffers-cached 即total-free-buffers-cached
实际可用内存:buffers+cached+free
现在看起来是非常正常的,因为这是处理过的结果。所以从上面的可以看出buffers和cached的量是不用查的,只需要处理used的量就好.
used主要有rss、slab、pagetables
我们实际进程使用的物理页面应该用resident set size来算的,遍历所有的进程,就可以知道所有的所有的进程使用的内存。我们来实验下RSS的使用情况:
$ cat RSS.sh
#/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`
echo $RSS"KB"
$ ./RSS.sh
从这里可以得到应用使用的内存的结果。
echo `cat /proc/slabinfo |awk 'BEGIN{sum=0;}{sum=sum+$3*$4;}END{print sum/1024/1024}'` MB
从这里可以看到slab的内存使用
echo `grep PageTables /proc/meminfo | awk '{print $2}'` KB
从这里可以看到page tables的大小
我的服务器上看到主要是slab比较大,有10来个g。
然后使用slabtop查看发现dentry的量最大,以下是其它服务器弄来的截图。
这台服务器运行了很长时间了。以前也没有说过这方面问题。一时半会也没法去看是什么原因导致的,只能手动释放一次内存看看结果了。
echo 0 >/proc/sys/vm/drop_caches
设置值说明:
0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存
我使用了2
然后使用free -m查看。发现已经正常了。然后我重新改成了0。事后发现slaptop里面dentry竟然没有新增了。感觉有点奇怪,但是服务一切正常。就没有去深究了。。
不懂运维技术,只能自己google 百度。欢迎大神留言指教。。
网友评论