Linux内存分析与清理

文章作者:Tyan
博客:noahsnail.com  |  CSDN  |  简书

1. free命令

Linux中查看内存的命令为free,命令如下:

1
2
3
4
$ 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

1
2
3
4
5
6
/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命令。

1
2
3
sync && echo 1 > /proc/sys/vm/drop_caches
sync && echo 2 > /proc/sys/vm/drop_caches
sync && echo 3 > /proc/sys/vm/drop_caches

参考资料

1.http://www.linuxde.net/2011/07/402.html

如果有收获,可以请我喝杯咖啡!