Linux使用free命令buff/cache过高

摘要:
在Linux系统中,我们经常使用free命令来检查系统内存的使用状态。通常,此操作中的主内存释放来自缓冲区/缓存的释放。特别是,使用了更多的缓存空间。因此,一般来说,我们认为可以释放缓冲区/缓存空间。这种理解是正确的。echo3˃/proc/sys/vm/drop_Caches:指示清除页面缓存和slab分配器中的缓存对象。图3。echo 1˃/proc/sys/vm/drop_Caches执行echo 2˃/proc/sys/vm/drop_Caches,其中绿色框是标记已更改的部分。这一次,只有缓冲区从0变为1,缓存基本上没有改变。执行echo 1、2、3到/proc/sys/vm/drop_ Caches以实现不同的清理目的。

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

Linux使用free命令buff/cache过高第1张

其实:buffers/cache占用的较多,说明系统中有进程曾经读写过文件,但是不要紧,这部分内存是当空闲来用的

Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放cache,作为free空间分给相关进程使用。所以一般情况下,我们认为buffer/cache空间可以被释放,这个理解是正确的。
但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。所以伴随着cache清除的行为的,一般都是系统IO飙高。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。
在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作:

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分配器中的缓存对象。

 

echo N>/proc/sys/vm/drop_caches清理缓存

引言:在内核窗口—proc文件系统这篇笔记中,我们介绍了/proc主要体现进程及内核信息状态。与/proc下其它文件的“只读”属性不同的是,管理员可对/proc/sys子目录的许多文件内容进行修改,以更改内核的运行特性。写入操作一般类似于 echo DATA >/path/to/your/filename的格式进行。这里以echo N>/proc/sys/vm/drop_caches为例介绍说明。

一、问题现象:

echo N > /proc/sys/vm/drop_caches , 当N数值不同时,free –m存在差异

1.1、echo写入数值之前—free-m内容

首先查看/proc/sys/vm/drop_caches的默认值,以便可以修改回来

Linux使用free命令buff/cache过高第2张

图1、/proc/sys/vm/drop_caches默认值

然后free-m查看此时内存使用情况,对于各字段含义,可以参考:linux free命令使用

 Linux使用free命令buff/cache过高第3张

 图2、未更改数据时free -m内容

 

1.2、echo写入不同数据—free-m内容

执行echo 1 > /proc/sys/vm/drop_caches, 其中绿色框是标记发生改变的部分,由于buffers 和 cached数值变化,第一行free和used均发生变化。

Linux使用free命令buff/cache过高第4张

图3、echo 1 > /proc/sys/vm/drop_caches

 

执行echo 2 > /proc/sys/vm/drop_caches, 其中绿色框是标记发生改变的部分,这次仅有buffers由0变为1,cached基本没有变化。

 Linux使用free命令buff/cache过高第5张

图4、echo 2 > /proc/sys/vm/drop_caches

 

执行echo 3 > /proc/sys/vm/drop_caches, 这次基本上,和写入2区别不大,没有什么变化。

Linux使用free命令buff/cache过高第6张

图5、echo 3 > /proc/sys/vm/drop_caches

二、现象解释:

  前面我们执行echo N > /proc/sys/vm/drop_caches,再free –m查看内存使用情况,输入不同的N值,free –m内存中缓存buffers会有差异,现在我们就是要解释/proc/sys/vm、drop_caches, 这个文件到底是什么?另外可以写入哪些数值,具体适用于什么场景。

2.1、内核文档说明

  查看linux内核文档,可以得到以下信息:

Linux使用free命令buff/cache过高第7张

 图6、linux内核文档关于drop_caches的说明

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

  向/proc/sys/vm/drop_caches中写入内容,会清理缓存。建议先执行sync(sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)。执行echo 1、2、3 至 /proc/sys/vm/drop_caches, 达到不同的清理目的。

2.2、使用建议

  这里找到一份关于清理缓存的使用建议手工释放linux内存.

实际项目中告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断的,但free上面反而比较难查看。相反,如果在这个时候,我们告诉用户,修改系统的一个值,“可以”释放内存,free就大了。用户会怎么想?不会觉得操作系统“有问题”吗?所以说,我觉得既然核心是可以快速清空buffer或cache,也不难做到(这从上面的操作中可以明显看到),但核心并没有这样做(默认值是0),我们就不应该随便去改变它。

  一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了。

  我觉得,排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉buffer,以判断应用的内存使用情况;或应用已经不再提供支持,即使应用对内存的时候确实有问题,而且无法避免的情况下,才考虑定时清空buffer。(可惜,这样的应用通常都是运行在老的操作系统版本上,上面的操作也解决不了)。

三、小结:

  与/proc下其它文件的“只读”属性不同的是,管理员可对/proc/sys子目录的许多文件内容进行修改,以更改内核的运行特性。写入操作一般类似于 echo DATA >/path/to/your/filename的格式进行。本篇文章以echo N>/proc/sys/vm/drop_caches为例,介绍了写入不同数值,清理缓存的作用。

Linux使用free命令buff/cache过高第8张

免责声明:文章转载自《Linux使用free命令buff/cache过高》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇网易云信Duilib开发实践和Windows应用界面开发框架源码开源介绍DVWA环境下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux之安装Linux详细步骤

1.准备前说明本文采用的是CentOS6.8,64位的,虚拟机时VMvare,采用的是双网卡方式。至于双网卡的作用和nat,桥接和hostonly模式请参见我的另一篇文章。安装回环网卡&安装Linux前准备 2.废话不多说,开始了◆打开虚拟机,点击文件---》新建虚拟机 ◆出现如下内容。选择典型,单击下一步 ◆出现如下界面之后,我们选择“稍后...

vmware 安装 centos7 记录笔记

1, 安装centos 7, 到阿里云镜像下载centos 7 1、虚拟机的创建: 打开安装好的VMware (如果大家安装的VMware是英文版的也没关系,对号入座即可),选择“文件--->新建虚拟机”,如图: 这里选择“自定义”,下一步: 选择默认,下一步: 选择“第三项“稍后安装操作系统”,以后安装,方便进行配置。下一步: (注:上图中,...

Hello China操作系统的安装和使用

作为完全自主开发的面向嵌入式应用的操作系统,Hello China目前已发展到V1.75版本。目前具备比较完善的内核、文件系统(FAT32/NTFS)、图形用户界面、网络协议、模块化支持等功能。本文对V1.75在PC下的安装和使用进行描述,以与广大操作系统爱好者做一交流,同时希望能够通过实际应用,对这个操作系统进行测试。 Hello China在Window...

Linux按时间分割日志

一、由来:需要做一个定时任务定期从MySQL数据库同步数据到Oracle,5m/次,同步日志写在一个文件恐有不妥,故而需要分割,一般按天,这里为了调试,按分操作。 1.任务如下:分别指定任务的脚本,任务读取文件路径,任务日志输出; #vim kettle.sh 2 /usr/etc/tools/pendaho/data-integration/kitc...

Jenkins:Linux下安装部署步骤

【转载:https://www.cnblogs.com/code-juggler/p/9177805.html】 1. 准备环境   首先,需要jdk是必须要安装好的。本人使用的linux是centos,直接使用yum安装。   先找到合适的版本://至少1.8 yum search java | grep jdk   然后运行安装: yum instal...

(转载)VM下ubuntu安装vmtools

转自:http://blog.sina.com.cn/s/blog_6f047ff20100ut5l.html 1.必须在vmware中系统的选项卡里选择安装vmware tools2.然后在系统的光驱里会出现一张VMware tools的光盘3.进入Ubuntu系统4.把文件从光盘上拷贝到本地(名字记不到了,自己用tab补全。)    cd /media...