echo 1 > /proc/sys/vm/drop_caches

前言

发现这个问题是因为项目中开始时加载库有时候很快有时候又很慢,才发现这个问题。linux是先将库文件读到cache中去的,所以二次加载时会很快,造成时间不定。

正文

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

这里的默认显示单位是kb,-m是指定MB。 我的服务器是32G内存,所以数字显得比较大。这个命令几乎是每一个使用过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。

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

什么是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写回,而只需要写回修改的部分即可。

如何回收cache?

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

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

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

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

方法是:

[root@tencent64 ~]# echo 1 > /proc/sys/vm/drop_caches
  • 1

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

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

优化后截图如下:

原文链接

[1] http://www.cnblogs.com/rocky-AGE-24/p/7629500.html

buffer/cache 过大清除相关推荐

  1. Oracle性能调优之--Buffer cache 的调整与优化

    Oracle性能调优之--Buffer cache 的调整与优化 Buffer Cache是SGA的重要组成部分,主要用于缓存数据块,其大小也直接影响系统的性能.当Buffer Cache过小的时候, ...

  2. linux缓存buffer,【Linux】清理缓存buffer/cache

    运行sync将dirty的内容写回硬盘 sync 通过修改proc系统的drop_caches清理free的cache echo 3 > /proc/sys/vm/drop_caches ech ...

  3. linux清除内存buffer,Linux清理Buffer/Cache内存空间让系统变流畅

    Linux 中 Buffer/Cache内存占用过高解决方法 在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: ...

  4. buffer cache 深度解析

    本文首先详细介绍了oracle中buffer cache的概念以及所包含的内存结构.然后结合各个后台进程(包括DBWRn.CKPT.LGWR等)深入介绍了oracle对于buffer cache的管理 ...

  5. linux 系统的 cache 过大,解决方案

    linux buff/cache过大,清理脚本 2018年06月20日 13:44:53 taozhe666 阅读数:6500 三条指令: sync echo 1 > /proc/sys/vm/ ...

  6. Linux buffer/cache 内存占用过高的原因以及解决办法

    表现现象 在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个 CoreOS 的系统上,free命令的显示内容大概是这样一个状态: core@localhost ~ $ free ...

  7. Linux系统中的Page cache和Buffer cache

    Free命令显示内存 首先,我们来了解下内存的使用情况: Mem:表示物理内存统计 total:表示物理内存总量(total = used + free) used:表示总计分配给缓存(包含buffe ...

  8. oracle buffer block,8 Oracle深度学习笔记——BUFFER CACHE深入一

    8.Oracle深度学习笔记--BUFFER CACHE深入一 最近项目一直和ORACLE死磕,感觉总是找不到出口,只能多看书少说话了. 先记录多少是多少吧! BUFFER CACHE在ORACLE的 ...

  9. Oracle - 使用各种SQL来熟知buffer cache使用情况

    这篇文章是参照甲骨论老相老师的教学视频: http://v.youku.com/v_show/id_XMzkyMjE3NTA0.html 所做的学习笔记 1. 查看某个对象所占用buffer状态: 上 ...

最新文章

  1. PARAMETER FILE研究
  2. 8086汇编-实验3-编程、编译、链接、跟踪
  3. zabbix启动无效,无法监听10051
  4. .NET Core开发实战(第24课:文件提供程序:让你可以将文件放在任何地方)--学习笔记...
  5. MFC程序打开控制台
  6. XOR and Favorite Number(CF-617E)
  7. Bootstrap研究3-基础html元素
  8. [读书笔记] - 《深度探索C++对象模型》第6章 第7章
  9. 全网最全的 Java各类技术栈 架构图汇总(建议收藏)
  10. javax.servlet.http.HttpServletResponse接口(HTTP版本)
  11. paip.Adblock屏蔽onlinedown华军软件园的4秒下载广告总结..
  12. ResNet网络结构
  13. 提取Redis事件机制源码为我所用
  14. cesium 漫游飞行_Cesium 之三维漫游飞行效果实现篇
  15. tar,bz2,bzip等格式解压缩命令汇总
  16. java实现pdf转为word
  17. @Cacheable注解
  18. Raspberry - 解决中兴(ZTE)摄像头无法使用密码访问树莓派上的samba共享(NAS)
  19. NRF51802 PIN对PIN兼容NRF51822,主要的区别在于功耗
  20. Linux系统开启服务器BBR加速教程

热门文章

  1. 修改版——制作交叉编译工具链的方法总结
  2. 你的麦克风可能需要设置 未修复,问题已解决
  3. python2打开文件_Python 基础 -2.2 文件操作
  4. c语言1024是哪个字母,自己没事写的1024的C语言代码
  5. 计算机专业报考小学教师资格证的什么科目,教师资格证小学可以报考哪些科目?...
  6. 阿里云呼叫中心的开发
  7. 司马南点火下的联想困局:始于业务,止于人事
  8. 计算机操作员三级对职称有用吗,辛苦评定的职称,退休之后就没用了?其实还有三个作用你知道吗?...
  9. 【转】excel文件格式分析
  10. Laya微信小游戏开发问题汇总以及解决方案(一)