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

这个命令几乎是每一个使用过Linux的人必会的命令,但越是这样的命令,似乎真正明白的人越少(我是说比例越少)。一般情况下,对此命令输出的理解可以分这几个层次:

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

自以为很了解。这样的人一般评估过会说:嗯,根据我专业的眼光看的出来,内存才用了1.7G左右,还有很多剩余内存可用。buffers/cache占用的较多,说明系统中有进程曾经读写过文件,但是不要紧,这部分内存是当空闲来用的。

真的很了解。这种人的反应反而让人感觉最不懂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。

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

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

方法是:

echo 1 > /proc/sys/vm/drop_caches

当然,这个文件可以设置的值分别为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分配器中的缓存对象。

优化后截图如下:

原文链接:https://www.cnblogs.com/rocky-AGE-24/p/7629500.html

mysql buff cache_Linux中buff/cache内存占用过高解决办法相关推荐

  1. Linux中buff/cache内存占用过高解决办法

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

  2. Linux中Cache内存占用过高解决办法

    在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: 这里的默认显示单位是kb,我的服务器是128G内存,所以数字显 ...

  3. linux缓冲区内容占用较多什么原因,Linux中Cache内存占用太高解决办法

    在Linux系统中,咱们常常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态:html 这里的默认显示单位是kb,个人服务器是128G内存,因 ...

  4. win10内存占用过高解决办法参考

    win10内存占用过高解决办法参考 1.问题描述: win10刚开机,浏览器和聊天工具等什么都不开,已用内存达75%左右了,开个浏览器能达到90%,电脑是8G内存的. 2. 方法:之前可能很焦躁,没查 ...

  5. Linux中buff/cache内存占用过高-手动清除释放内存

    buff/cache内存占用太高 我们在使用free -h或者(top命令)查看系统内存的时候,有时间会发现buff/cache很高,如下图 可以看到我总内存就1.8G,buff/cache就占用了1 ...

  6. linux下的buff/cache内存占用过高-手动清除释放内存

    buff/cache内存占用太高 我们在使用free -h或者(top命令)查看系统内存的时候,有时间会发现buff/cache很高,如下图: [root@nfs ~]# free -htotal u ...

  7. win10 dcom服务器进程占用cpu,WIN10CPU百分百,Windows10 DCOM占用过高解决办法 | 帮助信息-动天数据...

    WIN10CPU百分百,Windows10 DCOM占用过高解决办法 作者:dthost | 时间:2018-09-26 | 分类:未分类 | 14,361 次阅读 最近很多朋友在用WIN10,但是自 ...

  8. Spring cloud开发内存占用过高解决方法

    https://blog.csdn.net/wanhuiguizong/article/details/79289986 版权声明:本文为博主原创文章,转载请声明文章来源和原文链接. https:// ...

  9. 电脑内存占用过高怎么办 电脑内存占用过高解决方法

    电脑内存占用过高怎么办?1,点击开始按钮,在搜索框中,输入服务,在弹出的搜索结中,点击打开服务 2,这里有很系统自动加载的一些服务,有些服务我们是用不到的,但系统会自动加载,占用不少内存,我们可以把一 ...

最新文章

  1. Reveal.js一个用来做WEB演示文稿的框架
  2. FastStone Capture不止于完美截图体验
  3. 阿里巴巴分布式服务框架 Dubbo
  4. 求一个集合的所有子集 Python实现
  5. 第四十期:九个对Web开发者最有用的Python包,掌握这些,工资至少能涨涨
  6. java如何寻找main函数对应的类
  7. 记一次Task抛异常,调用线程处理而引发的一些随想
  8. 疑似小米10系列真机谍照首曝光:挖孔双曲面屏设计无疑
  9. idea怎么给项目改名_IDEA相关配置【java项目改造成web项目】
  10. CEPH RGW集群和bucket的zone group 不一致导致的404异常解决 及 使用radosgw-admin metadata 命令设置bucket metadata 的方法
  11. 如何使用 ggplot2 ?
  12. Atitit 机器学习算法分类 五大分类v5 t56.docx Atitit 机器学习算法分类 目录 1. 传统的机器学习算法 vs 深度学习 1 1.1. 传统的机器学习算法包括决策树、聚类、贝
  13. sql sever如何进行英文词频统计_英语语料库及词频表介绍
  14. 2022显卡、CPU天梯图
  15. 程序员的外包经验:印度、中国和菲律宾
  16. 【EXLIBRIS】名副其实
  17. 解决ubuntu系统使用vim时方向键乱跳问题
  18. 生成伪随机数的算法–线性同余法
  19. 【postgresql】数据聚合之PERCENTILE_CONT
  20. 彻底搞懂行内元素,块级元素,行内块元素~

热门文章

  1. FlyAI资讯:Uber正式开源分布式机器学习平台:Fiber
  2. glViewport函数和glOrtho函数的理解
  3. 直方图规定化——GML和SML映射规则
  4. ASP.NET Core Web项目连接MySQL数据库
  5. 解决Tomcat报错:SEVERE: Error listenerStart
  6. 用python处理股票龙头股_Python股票分析系列:基础股票数据操作(二)
  7. matlab中find函数用法
  8. webdriver java等待_等待下载完成在selenium webdriver JAVA
  9. php运维工程师面试题,小猿圈之初级运维工程师面试题
  10. macbook搭建java环境_MacBook从零开始搭建java环境