文章作者:Tyan
博客:noahsnail.com | CSDN | 简书
1. free命令
Linux中查看内存的命令为free
,命令如下:
1 | $ free -h |
每一列的解释如下:
- total:内存总数
- used:已经使用的内存数
- free:空闲的内存数
- shared:当前已经废弃不用
- buffers Buffer:缓存内存数
- cached Page:缓存内存数
可以看出buff/cache
占用的内存份额很大,有时候程序运行结束后,大量内存仍位于buff/cache
中,有时运行程序会导致内存不足,因此需要将这部分内存释放出来。
2. Linux中的缓存分类
要清理Linux中的cache,首先要明白buff和cache的区别(free中的buff/cache),以及pagecache,dentries和inodes的区别。
buff
作为buffer cache的内存,是块设备的读写缓冲区cache
作为page cache的内存,文件系统的cache。Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中。pagecache
页面缓存(pagecache)可以包含磁盘块的任何内存映射。这可以是缓冲I/O,内存映射文件,可执行文件的分页区域——操作系统可以从文件保存在内存中的任何内容。Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。
dentries
表示目录的数据结构inodes
表示文件的数据结构
总结:cached是cpu与内存间的,buffer是内存与磁盘间的,都是为了解决速度不对等的问题。buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。
缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过sync命令手动清空缓冲。
3. 清理cache
1 | /proc/sys/vm/drop_caches (since Linux 2.6.16) |
/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。/proc/sys/vm/drop_caches
中的默认值为0,值为1时表示可以释放pagecache缓存,值为2时可以释放pagecache和inode缓存,值为3时可以释放pagecache, dentries和inodes缓存。当然在释放内存之前需要执行sync
命令。
1 | sync && echo 1 > /proc/sys/vm/drop_caches |
参考资料