[linux]Cache太高解决办法


在Linux系统中,咱们常常用free命令来查看系统内存的使用状态。在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态:html

1.png

这里的默认显示单位是kb,个人服务器是128G内存,因此数字显得比较大。这个命令几乎是每个使用过Linux的人必会的命令,但越是这样的命令,彷佛真正明白的人越少(我是说比例越少)。通常状况下,对此命令输出的理解能够分这几个层次:node

  1. 不了解。这样的人的第一反应是:天啊,内存用了好多,70个多G,但是我几乎没有运行什么大程序啊?为何会这样?Linux好占内存!缓存

  2. 自觉得很了解。这样的人通常评估过会说:嗯,根据我专业的眼光看的出来,内存才用了17G左右,还有不少剩余内存可用。buffers/cache占用的较多,说明系统中有进程曾经读写过文件,可是没关系,这部份内存是当空闲来用的。bash

  3. 真的很了解。这种人的反应反而让人感受最不懂Linux,他们的反应是:free显示的是这样,好吧我知道了。神马?你问我这些内存够不够,我固然不知道啦!我特么怎么知道你程序怎么写的?服务器

根据目前网络上技术文档的内容,我相信绝大多数了解一点Linux的人应该处在第二种层次。你们广泛认为,buffers和cached所占用的内存空间是能够在内存压力较大的时候被释放当作空闲空间用的。但真的是这样么?在论证这个题目以前,咱们先简要介绍一下buffers和cached是什么意思:网络

什么是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。post

明白了这两套缓存系统的区别,就能够理解它们究竟均可以用来作什么了。优化

什么是page cache?

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

什么是buffer cache翻译

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

如何回收cache?

Linux内核会在内存将要耗尽的时候,触发内存回收的工做,以便释放出内存给急需内存的进程使用。通常状况下,这个操做中主要的内存释放都来自于对buffer/cache的释放。尤为是被使用更多的cache空间。既然它主要用来作缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的状况下,固然有必要清空释放cache,做为free空间分给相关进程使用。因此通常状况下,咱们认为buffer/cache空间能够被释放,这个理解是正确的。

可是这种清缓存的工做也并非没有成本。理解cache是干什么的就能够明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放因此伴随着cache清除的行为的,通常都是系统IO飙高。由于内核要对比cache中的数据和对应硬盘文件上的数据是否一致,若是不一致须要写回,以后才能回收。

在系统中除了内存将被耗尽的时候能够清缓存之外,咱们还可使用下面这个文件来人工触发缓存清除的操做:

[root@tencent64 ~]# cat /proc/sys/vm/drop_caches 
1

方法是:

echo 1 > /proc/sys/vm/drop_caches

固然,这个文件能够设置的值分别为一、二、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分配器中的缓存对象。

优化后截图以下:

2.png

相关文章
相关标签/搜索