优秀的编程知识分享平台

网站首页 > 技术文章 正文

Linux查看哪些文件/目录在内存缓存中的方法

nanyue 2025-02-20 17:14:35 技术文章 4 ℃

有时候我们会遇到内存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:当然还有其他用法,比如手动把文件从磁盘加载到内存,和将文件永久保持在内存等功能,可以自行去实践,这是一个很实用的小工具,分享给大家。

最近发表
标签列表