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中尝试使用过,会导致虚拟机死机(当然,这有可能是个特例)