有时候我们会遇到内存buffer/cache占用很大的场景,我们如何定位哪些文件和目录在占用buffer/cache,从而排查和解决buffer/cache占用过高的问题。
如上图,我们展示了a.txt存在于内存的buffer/cache缓存中的一个简单示意。正常应用层读取文件都必须先从后备存储(磁盘)中把要读取的文件先加载到内存的buffer/cache中,然后才进行读取,写入时也是先写入buffer/cache中的对应文件页中,然后通过内核write-back线程定期刷到后备存储中。
现在有这样一个场景:free -h 查看内存占用很高,而且90%是被buffer/cache占用了,这时候我们要排查和解决问题,首先就是要定位哪些文件和目录在内存buffer/cache中,再进一步找出占用空间较大的哪些文件和目录,从而进行后续操作,比如手动将这些文件刷入磁盘然后从缓存中清除,从而释放内存空间。
这个需求通过linux自带的命令和对系统相关文件的读写无法实现,我们需要借助一个第三方工具,这里介绍一个,叫vmtouch。
vmtouch工具介绍:
作用:
1、查看文件系统缓存情况
2、将文件或目录加载到内存中,提高访问速度,并减少对磁盘的读取操作
安装:
git clone https://github.com/hoytech/vmtouch.git
cd vmtouch
make
sudo make install
ln -s /usr/local/bin/vmtouch /bin/vmtouch
使用:
1、加载文件或目录到内存中:
vmtouch -vt /path/to/file
2、查看文件的缓存情况:
vmtouch -v /path/to/file
3、将一个文件完全缓存到内存中
vmtouch -vt access.log
4、删除内存中文件的缓存
vmtouch -ve access.log
5、固化文件到内存缓存,并以启动守护模式
vmtouch -dl /var/www/htdocs/critical
vmtouch使用示例:
1、我们执行下面命令查看/root目录下的buffer/cache数据
vmtouch -v /root
如上图,代表有408M在内存的buffer/cache中,目录总大小503M,在缓存中的文件占该目录总大小的比81%。
2、找到该目录的大文件1.img,执行
vmtouch -v ./1.img
输出:Resident Pages: 6521/8000 407M/500M 81.5%,说明主要是1.img在占用buffer/cache。
3、先执行sync把脏数据刷入磁盘,然后执行下面命令从缓存中清除1.img
sync && vmtouch -ve ./1.img
4、最后再执行vmtouch -v ./ 查看执行结果
发现缓存占用大小只有448K了,说明1.img已经从缓存中清除了,最后执行free -h查看,发现buff/cache一栏增加了407M,说明我们成功从缓存中清除了1.img,从而达到释放缓存的来缓解内存的目的。
end:当然还有其他用法,比如手动把文件从磁盘加载到内存,和将文件永久保持在内存等功能,可以自行去实践,这是一个很实用的小工具,分享给大家。