https://www.cnblogs.com/rocky-AGE-24/p/7629500.htmlhttps://www.cnblogs.com/rocky-AGE-24/p/7629500.html
https://www.cnblogs.com/easonscx/archive/2004/01/13/12610160.html

1
2
3
4
5
[root@localhost ~]# free -h
total used free shared buffers cached
Mem: 3.7G 3.5G 210M 52K 392M 2.6G
-/+ buffers/cache: 542M 3.2G
Swap: 4.0G 5.6M 4.0G

上面是centos6的内存状态,可以看到cached部分已经占用了2.6G,实际上了这台服务器只跑了一个静态官网,所有这就有问题啦。
在清理之前呢,先了解下buffercache

什么是buffer/cache?

buffer和cache是两个在计算机技术中被用滥的名词,放在不通语境下会有不同的意义。在Linux的内存管理中,这里的buffer指Linux内存的:Buffer cache。这里的cache指Linux内存中的:Page cache。翻译成中文可以叫做缓冲区缓存和页面缓存。在历史上,它们一个(buffer)被用来当成对io设备写的缓存,而另一个(cache)被用来当作对io设备的读缓存,这里的io设备,主要指的是块设备文件和文件系统上的普通文件。但是现在,它们的意义已经不一样了。在当前的内核中,page cache顾名思义就是针对内存页的缓存,说白了就是,如果有内存是以page进行分配管理的,都可以使用page cache作为其缓存来管理使用。当然,不是所有的内存都是以页(page)进行管理的,也有很多是针对块(block)进行管理的,这部分内存使用如果要用到cache功能,则都集中到buffer cache中来使用。(从这个角度出发,是不是buffer cache改名叫做block cache更好?)然而,也不是所有块(block)都有固定长度,系统上块的长度主要是根据所使用的块设备决定的,而页长度在X86上无论是32位还是64位都是4k。

明白了这两套缓存系统的区别,就可以理解它们究竟都可以用来做什么了。

什么是page cache?

Page cache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候。如果你仔细想想的话,作为可以映射文件到内存的系统调用:mmap是不是很自然的也应该用到page cache?在当前的系统实现里,page cache也被作为其它文件类型的缓存设备来用,所以事实上page cache也负责了大部分的块设备文件的缓存工作。

什么是buffer cache

Buffer cache则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。这意味着某些对块的操作会使用buffer cache进行缓存,比如我们在格式化文件系统的时候。一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,page cache的内容会被改变,而buffer cache则可以用来将page标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写(writeback)时,就不用将整个page写回,而只需要写回修改的部分即可。

如何释放缓存区内存的方法

1
2
3
4
5
6
7
8
9
10
11
1、清理pagecache(页面缓存)

[root@localhost ~]#echo 1 > /proc/sys/vm/drop_caches 或者 [root@localhost ~]# sysctl -w vm.drop_caches=1

2、清理dentries(目录缓存)和inodes

[root@localhost ~]# echo 2 > /proc/sys/vm/drop_caches 或者 [root@localhost ~]# sysctl -w vm.drop_caches=2

3、清理pagecache、dentries和inodes

[root@localhost ~]# echo 3 > /proc/sys/vm/drop_caches 或者 [root@localhost ~]# sysctl -w vm.drop_caches=3

这个文件可以设置的值分别为1、2、3。它们所表示的含义为:

1
2
3
echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。 

上面三种方式都是临时释放缓存的方法,要想永久释放缓存,需要在/etc/sysctl.conf文件中配置:vm.drop_caches=1/2/3,然后sysctl -p生效即可!
另外,可以使用sync命令来清理文件系统缓存,还会清理僵尸(zombie)对象和它们占用的内存

1
[root@localhost ~]# sync

/proc是一个虚拟文件系统,可以通过对它的读写操作作为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。也就是说我们可以通过调整/proc/sys/vm/drop_caches来释放内存。

drop_caches的值可以是0-3之间的数字,代表不同的含义:
0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存

清理以后的内存状态

1
2
3
4
5
[root@hdp-1.rpgmoba.com node_exporter]# free -h
total used free shared buffers cached
Mem: 3.7G 300M 3.4G 52K 8.7M 48M
-/+ buffers/cache: 242M 3.5G
Swap: 4.0G 5.6M 4.0G