记一次解决缓存不释放导致内存耗光问题

1 前言

通过脚本备份数据和系统,笔者遇到两项缓存过高不释放而导致内存使用过高问题,Zabbix截图如下,

记一次解决缓存不释放导致内存耗光问题

- 第一次是由每小时往挂载的Window共享里面存放备份文件引起

- 第二次是由每周备份系统过度地频繁读写文件系统引起缓存不释放引起

2 挂载Window共享备份引发的缓存问题

2.1 问题描述

挂载Window的共享成为Linux服务器的备份目录,发现备份后缓存过高,挂载范例如下,

1
mount -t cifs -o username=user1%pwd1 //backupSer/backup/backup/

2.2 排查方法

1)使用free命令可以发现cached占用情况,

1
free -m

显示如下:

1
2
3
4
             total       used       free     shared    buffers     cached
Mem:          7872       7732        139          0        190       6312
-/+ buffers/cache:       1229       6642
Swap:         4047          0       4047

注:留意cached项非常高

2)进一步的,使用slabtop可以发现cifs模块占用了大量的缓存(忘记截图保留了……O(∩_∩)O哈哈~,见谅哈!)

1
slabtop

注:查看SIZE和NAME项

2.3 排查故障

尝试手动卸载发现缓存被释放

1
umount /backup

2.4 解决方案

改用autofs去按需要自动挂载和卸载(非本文核心内容,这里不详述,自己研究)


3 频繁读写文件系统引发的Cache问题

3.1 问题描述

用tar命令备份系统,由于频繁读写文件系统,物理内存占用不被释放

3.2 排查方法

1)查看缓存占用情况

1
free -m

显示如下:

1
2
3
4
             total       used       free     shared    buffers     cached
Mem:          7872       7732        139          0        190       6312
-/+ buffers/cache:       1229       6642
Swap:         4047          0       4047

2)进一步的,使用slabtop没有发现占用了大量缓存的模块

3.3 补充知识

free -m打印的结果,

1
2
3
4
             total       used       free     shared    buffers     cached
Mem:          7872       7732        139          0        190       6312
-/+ buffers/cache:       1229       6642
Swap:         4047          0       4047

如上所示,

cached项反映的是pagecache的使用情况

buffers项反映的是inode和dentry等文件系统metadata的使用情况


网络上有3种释放方法:

1
2
3
4
5
6
7
8
#释放pagecache
echo 1 > /proc/sys/vm/drop_caches  
 
#释放inode和dentry等metadata  
echo 2 > /proc/sys/vm/drop_caches  
 
#释放pagecache和inode/dentry
echo 3 > /proc/sys/vm/drop_caches

3.4 解决方案

1
2
3
4
sync
sync
sync
echo 1 > /proc/sys/vm/drop_caches

注:建议不要释放inode和dentry,笔者在CentOS 6.8中尝试使用过,会导致虚拟机死机(当然,这有可能是个特例)










本文转自 tanzhenchao 51CTO博客,原文链接:http://blog.51cto.com/cmdschool/1962465,如需转载请自行联系原作者
上一篇:TextView中DrawableXXX图片无法设置大小的解决方案


下一篇:Java设计模式之观察者模式