linux7buffer和cache
现象:作为hdfs集群的主节点,越来越卡
排查:CPU,mem
CPU正常,检查内存情况,发现如下
如上截图:发现程序可用内存为91G,但是部分swap分区被占用。于是引出如下思考,free -h这条命令的输出到底代表什么?
total:是代表系统总的物理内存
used: 代表使用的内存
free:未被任何应用使用的真实空闲物理内存
shared:被共享的物理内存
buff/cache:缓冲、缓存区内存数,缓存在应用之中
avaliable:真正剩余的可被程序应用的内存数;
系统剩余内存为:available
free 与 available 的区别
free
是真正尚未被使用的物理内存数量。available
是应用程序认为可用内存数量,available = free + buffer + cache
(注:只是大概的计算方法)
Linux 为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。
但当应用程序申请内存时,如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来满足应用程序的请求。这就是稍后要说明的 buffer 和 cache。
buff 和 cache 的区别
从字面上和语义来看,buffer名为缓冲,cache名为缓存。我们知道各种硬件存在制作工艺上的差别,所以当两种硬件需要交互的时候,肯定会存在速度上的差异,而且只有交互双方都完成才可以各自处理别的其他事务。假如现在有两个需要交互的设备A和B,A设备用来交互的接口速率为1000M/s,B设备用来交互的接口速率为500M/s,那他们彼此访问的时候都会出现以下两种情况:(以A来说)
一.A从B取一个1000M的文件结果需要2s,本来需要1s就可以完成的工作,却还需要额外等待1s,B设备把剩余的500M找出来,这等待B取出剩下500M的空闲时间内(1s)其他的事务还干不了
二.A给B一个1000M的文件结果也需要2s,本来需要也就1s就可以完成的工作,却由于B,1s内只能拿500M,剩下的500M还得等下一个1sB来取,这等待下1s的时间还做不了其他事务。
那有什么方法既可以让A在‘取’或‘给’B的时候既能完成目标任务又不浪费那1s空闲等待时间去处理其他事务呢?我们知道产生这种结果主要是因为B跟不上A的节奏,但即使这样A也得必须等B处理完本次事务才能干其他活(单核cpu来说),除非你有三头六臂。那有小伙伴可能会问了,能不能在A和B之间加一层区域比如说ab,让ab既能跟上A的频率也会照顾B的感受,没错我们确实可以这样设计来磨合接口速率上的差异,你可以这样想象,在区域ab提供了两个交互接口一个是a接口另一个是b接口,a接口的速率接近A,b接口的速率最少等于B,然后我们把ab的a和A相连,ab的b和B相连,ab就像一座桥把A和B链接起来,并告知A和B通过他都能转发给对方,文件可以暂时存储,最终拓扑大概如下:
现在我们再来看上述两种情况:
对于第一种情况A要B:当A从B取一个1000M的文件,他把需求告诉了ab,接下来ab通过b和B进行文件传送,由于B本身的速率,传送第一次ab并没有什么卵用,对A来说不仅浪费了时间还浪费了感情,ab这家伙很快感受到了A的不满,所以在第二次传送的时候,ab背着B偷偷缓存了一个一模一样的文件,而且只要从B取东西,ab都会缓存一个拷贝下来放在自己的大本营,如果下次A或者其他C来取B的东西,ab直接就给A或C一个货真价实的赝品,然后把它通过a接口给了A或C,由于a的速率相对接近A的接口速率,所以A觉得不错为他省了时间,最终和ab的a成了好基友,说白了此时的ab提供的就是一种缓存能力,即cache,绝对的走私!因为C取的是A执行的结果。所以在这种工作模式下,怎么取得的东西是最新的也是我们需要考虑的,一般就是清cache。例如cpu读取内存数据,硬盘一般都提供一个内存作为缓存来增加系统的读取性能
对于第二种情况A给B:当A发给B一个1000M的文件,因为A知道通过ab的a接口就可以转交给B,而且通过a接口要比通过B接口传送文件需要等待的时间更短,所以1000M通过a接口给了ab ,站在A视图上他认为已经把1000M的文件给了B,但对于ab并不立即交给B,而是先缓存下来,除非B执行sync命令,即使B马上要,但由于b的接口速率最少大于B接口速率,所以也不会存在漏洞时间,但最终的结果是A节约了时间就可以干其他的事务,说白了就是推卸责任,哈哈而ab此时提供的就是一种缓冲的能力,即buffer,它存在的目的适用于当速度快的往速度慢的输出东西。例如内存的数据要写到磁盘,cpu寄存器里的数据写到内存。
看了上面这个例子,那我们现在看一下在计算机领域,在处理磁盘IO读写的时候,cpu,memory,disk基于这种模型给出的一个实例。我们先来一幅图:(我从别家当来的,我觉得,看N篇文档 不如瞄此一图)
page cache:文件系统层级的缓存,从磁盘里读取的内容是存储到这里,这样程序读取磁盘内容就会非常快,比如使用grep和find等命令查找内容和文件时,第一次会慢很多,再次执行就快好多倍,几乎是瞬间。但如上所说,如果对文件的更新不关心,就没必要清cache,否则如果要实施同步,必须要把内存空间中的cache clean下
buffer cache:磁盘等块设备的缓冲,内存的这一部分是要写入到磁盘里的。这种情况需要注意,位于内存buffer中的数据不是即时写入磁盘,而是系统空闲或者buffer达到一定大小统一写到磁盘中,所以断电易失,为了防止数据丢失所以我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据立刻写到磁盘里。
总结:
1.buffer和cache都是为了解决互访的两种设备存在速率差异,使磁盘的IO的读写性能或cpu更加高效,减少进程间通信等待的时间
2.buffer:缓冲区-用于存储速度不同步的设备或优先级不同的设备之间传输数据,通过buffer可以减少进程间通信需要等待的时间,当存储速度快的设备与存储速度慢的设备进行通信时,存储快的设备先把数据缓存到buffer上,等到系统统一把buffer上的数据写到速度慢的设备上。常见的有把内存的数据往磁盘进行写操作,这时你可以查看一下buffers
3.cache:缓存区-用于对读取速度比较严格,却因为设备间因为存储设备存在速度差异,而不能立刻获取数据,这时cache就会为了加速缓存一部分数据。常见的是CPU和内存之间的数据通信,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而Cache保存着CPU刚用过的数据或循环使用的部分数据,这时Cache中读取数据会更快,减少了CPU等待的时间,提高了系统的性能。
借阅于大佬的文档:https://www.cnblogs.com/M18-BlankBox/p/5326484.html
buff --->buffer cache 存储速度快的设备往存储慢的设备通信 快的往慢的写
cache--> page cache 读取速度快的设备与读取速度慢的设备通信 快的读慢的
linux7buffer和cache的更多相关文章
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
- [Java 缓存] Java Cache之 DCache的简单应用.
前言 上次总结了下本地缓存Guava Cache的简单应用, 这次来继续说下项目中使用的DCache的简单使用. 这里分为几部分进行总结, 1)DCache介绍; 2)DCache配置及使用; 3)使 ...
- Spring cache简单使用guava cache
Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...
- 笔记:Memory Notification: Library Cache Object loaded into SGA
笔记:Memory Notification: Library Cache Object loaded into SGA在警告日志中发现一些这样的警告信息:Mon Nov 21 14:24:22 20 ...
- ABP源码分析十三:缓存Cache实现
ABP中有两种cache的实现方式:MemroyCache 和 RedisCache. 如下图,两者都继承至ICache接口(准确说是CacheBase抽象类).ABP核心模块封装了MemroyCac ...
- [Java 缓存] Java Cache之 Guava Cache的简单应用.
前言 今天第一次使用MarkDown的形式发博客. 准备记录一下自己对Guava Cache的认识及项目中的实际使用经验. 一: 什么是Guava Guava工程包含了若干被Google的 Java项 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】
系列目录 上次的探讨没有任何结果,我浏览了大量的文章和个别系统的参考!决定用Cache来做,这可能有点难以接受但是配合mvc过滤器来做效果非常好! 由于之前的过滤器我们用过了OnActionExecu ...
- HTML5离线缓存(Application Cache)
HTML5离线缓存又名Application Cache,是从浏览器的缓存中分出来的一块缓存区,要想在这个缓存中保存数据,可以使用一个描述文件(manifest file),列出要下载和缓存的资源. ...
- 第三篇 Entity Framework Plus 之 Query Cache
离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...
随机推荐
- 使用mint ui 的picker解决城市三级联动
<mt-popup v-model="popupVisible" position="bottom"> <div class="po ...
- 【go进阶】一个简单的go服务器实现
光阴似箭,日月如梭,在昨天我终于拿到了自己忙活了半个月的工资. 据说在7月25日有一颗小行星掠过地球,如果真的撞上来,估计31号我就不是乐呵呵的了,应该是直接没了. 如下的代码运行起来就是一个微型go ...
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
1.nginx 配置模板 server { listen ; client_max_body_size 512M; proxy_set_header Connection ""; ...
- Java字节流文件封装
/** * 字节流封装方法 */ import java.io.FileInputStream; import java.io.FileNotFoundException; import jav ...
- 【Spring Cloud】Spring Cloud使用总结
项目概要 项目环境信息 IDEA ultimate 2018.3.2 springboot 2.1.7.RELEASE springCloud Greenwich.SR2 Eureka 介绍 基于ne ...
- luoguP1352没有上司的舞会(树形DP)
题目链接:https://www.luogu.org/problemnew/show/P1352 题意:给定n个结点,每个结点有一个权值,给n-1条边,n个结点构成一棵树.并且规定一个结点的父结点如果 ...
- OI模板のpoke流[大型考试复习必备/kl]
数论 快速乘: ll qmul(ll x,ll y,ll mod) { ll ans=0; while(y) { if(y&1) (ans+=x)%=mod; y>>=1; (x+ ...
- 2019中山纪念中学夏令营-Day2[JZOJ]
博客的开始,先聊聊代码实现: 每次比赛以后,要有归纳错误的习惯. 错误小结: 1.读入:scanf(“%c”)会读入回车和空格,但cin不会. 2.对于二维数组的输入,不能把m,n搞混了,会引起严重的 ...
- Head First PHP&MySQl第一章代码
HTML: <!doctype html> <html lang="zh-cn"> <head> <meta charset=" ...
- c++学习之对象和类——构造函数和析构函数
再认真理一遍~ 0.类 这里先来定义一个类,便于后面的理解.参考C++ Primer Plus class Stock { private: std::string company; long sha ...