Linux中Buffer/Cache清理

Linux中的buff/cache可以被手动释放,释放缓存的代码如下:

 https://lentil1016.cn/linux%E4%B8%ADbuffer-cache%E6%B8%85%E7%90%86/
1
2
3
echo 1 > /proc/sys/vm/drop_caches;
echo 2 > /proc/sys/vm/drop_caches;
echo 3 > /proc/sys/vm/drop_caches;

结论说完了,下面开始讲故事了

刚刚开始使用linux的时候,知道查看内存的命令是free,但是不知道出来的几列数值是什么意思,前辈曾经教我说最后一列available列出的才是真正的可用的空闲内存,free加上buff/cache等于available,我当然记住了这个结论,但是从结果看来我并没有理解这个结论。

 
1
2
3
4
$ free -h
              total        used        free      shared  buff/cache   available
Mem:            94G         31G         60G         25M        2.3G         61G
Swap:            0B          0B          0B

在大约8个月前,公司启动了软件容器化的进程,我作为公司容器化的技术支持,制定了第一套K8s集群的硬件设施要求,由于担心金额过高批不下来,第一期只计划购买了两台性能比较好的机器,一台作为master兼worker,令一台作为纯worker,两台机器总共配置了200GB内存,我本以为这些内存足够使用了,然而在过去的八个月里,这几台机器的内存很快的就被测试环境跑满了。

K8s集群内存监控

这导致测试服务的部署开始断断续续的出现一些恼人的问题,比如会触发OOMkiller,然后杀掉一些有状态的软件。比较倒霉的时候还会杀掉集群的SDN软件flanneld,触发一个3.x版本上的内核bug,导致整个节点的容器沙箱无响应,只能重启机器。虽然这个沙箱无响应的问题后来通过升级4.14内核解决了,但根本的内存瓶颈问题还是没有解决。

不过因为我一直有其他的开发任务,而且这个环境大多数时间用的还算正常,扛得下压力,所以我没有深究过。一直到前几天测试想要部署一套新的环境时,测试部的领导找到我,咨询我再申请几台机器应该要什么配置的时候,我才打算查一查是怎么回事。

多数内存被缓存占用

ssh登陆到K8s的节点上一看,发现可用内存还是很多的,但是大多数都被缓存申请过去了,比例已经达到了令人发指的2/3。但按理说这不会造成问题,因为linux会在内存占用较高的时候自动释放这些内存,那问题是什么呢?

buff/cache是用于加速程序运行的,有一些硬盘/网络上的数据加载的速度比较慢,因此会被缓存到高速的内存中,以免去重复加载的时间消耗。buff/cache在内存占用过高的时候会被系统自动清理, 但是这种清缓存的工作也并不是没有成本。清缓存必须保证cache中的数据跟对应文件中的数据一致,所以伴随着cache清除的行为的,一般都是要做大量硬盘读写的。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。 硬盘读写就意味着高延迟,这个延迟通常会达到几毫秒到数秒。

例如本次清理持续了大约10秒

在正常的场景中,这种延迟是不会有太大问题的,因为正常的服务都是一点一点开辟内存的,而且受制于人的操作速度,服务也一般不会突然全部启动。然而对于容器部署就会遇到一个问题,容器开辟内存使用的是Cgroup。如果说进程开内存像买房子,Cgroup开内存就比较像圈地,如果给容器指定了500MB内存,那这个容器启动,系统里就有500GB内存被划走到某个名下,不给别人用了。如果这些容器恰好还是批量部署的,那机器的内存申请量就会出现一个阶梯式的激增,这时候系统开始清理buf就不太来得及了,就只能祭出杀器——OOMKiller。这样就造成了一些部署的问题。

最后由于测试环境对效率的要求并不高,所以我决定牺牲效率换内存空闲量,建了一个清理缓存的定时任务,经过一周的测试,这两台机器上没有再出现过OOMkill。

添加crontab定时任务

不过虽然问题已经解决了,领导还是打算阔一倍内存,贫穷真的限制了我的想象力。

以及部分Linux 官网内容

Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to become free.
To free pagecache, use
 echo  > /proc/sys/vm/drop_caches;
 to free dentries and inodes, use
echo  > /proc/sys/vm/drop_caches;
to free pagecache, dentries and inodes, use
 echo  >/proc/sys/vm/drop_caches.

Because this is a non-destructive operation and dirty objects are not freeable, the user should run sync first.

---------------------

本文来自 skate 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/wyzxg/article/details/7279986?utm_source=copy 

[转帖] Linux buffer 和 cache相关内容的更多相关文章

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

    Linux中buff/cache内存占用过高解决办法 https://www.cnblogs.com/rocky-AGE-24/p/7629500.html /proc/sys/vm/drop_cac ...

  2. [svc]linux buffer和cache的区别

    通俗理解buffer,cache Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而 ...

  3. Linux buffer and cache

    A buffer is something that has yet to be "written" to disk. A cache is something that has ...

  4. [转帖]Linux下批量替换文件内容方法

    Linux下批量替换文件内容方法 https://www.cnblogs.com/fjping0606/p/4428850.html 刚才用到的命令 原作者写的挺好的记录一下 以后 用. 1:查找fi ...

  5. linux中Makefile文件相关内容

    第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...

  6. linux mce的一些相关内容和用户态监控的设计方法

    之所以想起写一点关于mce的东西,倒不是因为遇到mce的异常了,之前遇到过很多mce的异常,内存居多,但没有好好记录下来,写这个是因为参加2018 clk南京会议的一点想法. void __init ...

  7. Linux系统的Cache工作原理和管理机制

    Linux系统Cache 管理是 Linux 内核中一个很重要并且较难理解的组成部分.本文详细介绍了 Linux 内核中文件 Cache 管理的各个方面,希望能够帮助到你. 操作系统和文件 Cache ...

  8. free中buffer 与 cache 的区别

    通常人们所说的Cache就是指缓存SRAM. SRAM叫静态内存,“静态”指的是当我们将一笔数据写入SRAM后,除非重新写入新数据或关闭电源,否则写入的数据保持不变. 由于CPU的速度比内存和硬盘的速 ...

  9. Linux中Buffer和Cache的区别

    1. Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而  Cache保存着CPU刚 ...

随机推荐

  1. 会话控制(session和cookie)、跨页面传值

    1.session  登录上一个页面以后,长时间没有操作,刷新页面以后需要重新登录. 特点:(1)session是存储在服务器:   (2)session每个人(登陆者)存一份: (3)session ...

  2. 【转载】COM 组件设计与应用(一)——起源及复合文件

    原文:http://vckbase.com/index.php/wv/1201.html COM 组件设计与应用 系列文章:http://vckbase.com/index.php/piwz?& ...

  3. HBase数据结构(读书笔记 )

    背景: 最近在做一些跟大数据相关的东西,涉及到数据的存储和分析,考虑各个方面,选择使用HBase进行存储,使用原生Java API进行数据分析,之后会陆续写一系列来说明最近做的东西,给像我这样未曾涉及 ...

  4. Redis之数据类型大全

    一:String类型 1.set方法:设置key对应的值为string类型的value,如果该key已经存在,则覆盖key对应的value值.所以在redis中key只能有一个. 127.0.0.1: ...

  5. python+appium 实现qq聊天的消息,滑动删除聊天消息

    有人问我,appium怎么去删除qq聊天的, 当时想到的是滑动, 可是具体的大概有个思路,于是乎,就想自己来实现下, 打开模拟器,开发者选项,找到显示坐标的 然后去打开qq获取要删除的消息的坐标后, ...

  6. 【Python Learning第一篇】Linux命令学习及Vim命令的使用

    学了两天,终于把基本命令学完了,掌握以后可以当半个程序员了♪(^∇^*) 此文是一篇备忘录或者查询笔记,如果哪位大佬看上了并且非常嫌弃的话,还请大佬不吝赐教,多多包涵 以下是我上课做的一些笔记,非常的 ...

  7. Android Studio 导入别人项目时候遇见的问题“Gradle DSL method not found: 'compile()'”

    Gradle DSL method not found: 'compile() 遇见这个问题截图: 解决: 在项目的根目录的build.gradle文件中是不是用了compile方法 如果有的话,剪切 ...

  8. GitLab篇之备份还原

    1. GitLab备份配置 输入以下命令,打开gitlab配置文件 [root@code-server ~]# vim /etc/gitlab/gitlab.rb 修改以下配置,gitlab有自动清理 ...

  9. python魔法方法大全

    1.python魔法方法详解: python魔法方法是可以修改重载的,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而 ...

  10. MYSQL 数据库结构优化

    数据库结构优化 优化数据大小 使表占用尽量少的磁盘空间.减少磁盘I/O次数及读取数据量是提升性能的基础原则.表越小,数据读写处理时则需要更少的内存,同时,小表的索引占用也相对小,索引处理也更加快速. ...