Linux内存分析free与cache清理
1、free命令
Linux中查看内存的命令为free,命令如下:
$ free -h
total used free shared buff/cache available
Mem: 62G 4.9G 627M 520K 57G 57G
Swap: 4.0G 335M 3.7G
每一列的解释如下:
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
/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to become free.
To free pagecache, use echo 1 > /proc/sys/vm/drop_caches;
to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to free pagecache, dentries and inodes, use echo 3 > /proc/sys/vm/drop_caches.
Because this is a non-destructive operation and dirty objects are not freeable, the user should run sync first.
/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命令。
sync && echo 1 > /proc/sys/vm/drop_caches
sync && echo 2 > /proc/sys/vm/drop_caches
sync && echo 3 > /proc/sys/vm/drop_caches