buffer和cache怎么让你们解释的那么难理解?

  对于一个即将踏上“系统运维”或者更加高大尚的工作“系统调优”,如果这不跟这两哥们搞好关系了,坑的不只有内存,更坑的是你拿着调优的钱却干着随时被调的活。因为作为一个系统运维人员来说监控和优化IO性能这是最有可能你生存下来的技能,为啥呢?因为你不仅给老板省了钱,还提高了机器的工作效率。。虽然钱都进了老板兜里,但你渐渐地植入了他深深地脑海里,总有一天你比钱重要!好了闲话少扯,接下来说说这两个哥们到底是什么?

  之前我自己也对到底buffer和cache是什么,有什么不同,什么时候用buffer,什么时候用cache存在疑惑,不能说不知道,只是别人问起来说起来,我知道,但是讲讲他们的区别,还真是说不出来。无奈查了好多资料,要么太底层要么含糊不清,学术再权威再有见地,让读者理解不了也白搭,这就跟一个牛逼的程序,你再怎么运行在内核空间,但如果你不提供一个用户空间的接口,用的人不能通过一种调用接口认识你,那说明你确实牛,牛到使用的人不知道你是什么。服务的最终是面向用户的,你天天说些机器语言,你真的快乐吗?所以我谈谈我自己对buffer和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上的数据立刻写到磁盘里。

  接下来说一下Linux上怎么查看buffer/cache,怎么flush...cache ?

[[email protected] ~]# free -m

                    total   used   free  shared  buffers  cached
Mem:      727    359     367     0          36       171
-/+ buffers/cache:     152     575 
Swap:          2047     0      2047

第一部分Mem行:

total:内存总数

used:已经使用的内存数

free:空闲的内存数

shared:可用的共享内存

buffers:内存缓冲数

cached:内存缓存数

第二部分:(-/+ buffers/cache)

used:除去被用作buffers和cache内存后已用的内存

free:用作buffers和cache的内存加上Mem部分空闲的内存数

第三部分:(Swap)

用一部分磁盘当做内存用的“内存”

现在我们来做一下数据统计

total=Mem_used+Mem_free

Mem_used=Mem_buffers+Mem_cached+(-/+ buffers/cache)_used

Mem_free=(-/+ buffers/cache)_free-Mem_buffers-Mem_cached

通过以上等式,我们可以知道:

  1.buffers和cache也是RAM划分出来的一部分地址空间

  2.buffers和cache的地址空间也可作为空闲内存的组成部分,这意味着我们可以通过向内核传参释放一部分内存给其他进程

  3.由于buffers/cache 是一种动态的内存地址空间,所以已用空间和空余空间有绝对使用,绝对空余空间,算上buffers/cache的相对已用空间和相对空余空间四个概念。

如何释放缓存吗?我们知道Linux的一个重要思想是一切皆文件,比如各种输入输出设备:键盘,鼠标,网卡,显示器,打印机,U盘,console口,在linux的国度里都可为其创建一个文件作为访问设备的入口,而内核的各种参数也被映射成了文件,不过内核参数这种文件比较特殊,在linux上有两个伪文件系统:/proc,/sys。

  /proc:内核状态和统计信息的输出接口:同时还提供一个配置接口,/proc/sys/ 一些文件可接受用户指定一个新的value来实现对内核某功能或特性的配置:切记不能用文本编辑器去打开,我们可以通过以下三种方式可以去修改:

1).sysctl [options] [var=[value]]

      var格式 x.x.x... 命令默认的根目录是 /proc/sys

      sysctl -a :查看所有根目录下的内核参数(可以送给grep来检索需要的内核参数)

      sysctl  var: 查看指定内核参数的值(如果你很熟悉这个目录你可以直接指所要改的内核                                      选项)

      sysctl -w var=value:设定内核参数var等于value的值

  2).cat /proc/sys/Path/var_file

    echo "value" > /proc/sys/Path/var_file  (通过重定向)

注意!以上两种方式的设定仅即时生效,内核重新加载就会失效,如果想让永久生效需要修改其配置文件

  3) 配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf (*是代表所有)这个可以vim,比如我们通             过vim 打开并让其有数据包转发功能,我们可以修改以下这个参数

     # Controls IP packet forwardin

  net.ipv4.ip_forward = 1

   修改完我们可以通过sysctl -p [/etc/sysctl.conf] 让其内核重读配置文件使其修改的value立即生          效。

知道了修改内核参数,接下来我们清理以下buffers/cache

[[email protected] ~]# echo 1 > /proc/sys/vm/drop_caches

[[email protected] ~]# free -m
                  total   used   free   shared   buffers     cached
Mem:          727    177     549      0         0             27
-/+ buffers/cache: 150     577
Swap:        2047    0     2047

我们看到命令执行后buffers为0,cached也只有27M。

总结:

1.buffer和cache都是为了解决互访的两种设备存在速率差异,使磁盘的IO的读写性能或cpu更加高效,减少进程间通信等待的时间

2.buffer:缓冲区-用于存储速度不同步的设备或优先级不同的设备之间传输数据,通过buffer可以减少进程间通信需要等待的时间,当存储速度快的设备与存储速度慢的设备进        行通信时,存储快的设备先把数据缓存到buffer上,等到系统统一把buffer上的数据写到速度慢的设备上。常见的有把内存的数据往磁盘进行写操作,这时你可以查看一下            buffers

    3.cache:缓存区-用于对读取速度比较严格,却因为设备间因为存储设备存在速度差异,而不能立刻获取数据,这时cache就会为了加速缓存一部分数据。常见的是CPU和内存          之间的数据通信,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而Cache保存着CPU刚用过的数据或循环使用的部分数据,这时Cache          中读取数据会更快,减少了CPU等待的时间,提高了系统的性能。

问题:

1.buffers和cache是必须的吗?

   2. 怎么清除buffers和cache?

   3. 当buffers值一段时间增长很快说明什么?cache一段时间增长很快说明说么?

 

 

               

    

时间: 2024-12-26 16:13:48

buffer和cache怎么让你们解释的那么难理解?的相关文章

Linux内存学习之buffer和cache的区别详解

本文和大家分享的主要是linux 中 内存buffer 和 cache 的区别相关内容,一起来看看吧,希望对大家 学习linux有所帮助. 细心的朋友会注意到, 当你在 linux 下频繁存取文件后 , 物理内存会很快被用光 , 当程序结束后 , 内存不会被正常释放 , 而是一直作为 caching. 这个问题 , 貌似有不少人在问 , 不过都没有看到有什么很好解决的办法 . 那么我来谈谈这个问题 . 先来说说free 命令 [[email protected] ~]# free -m tota

linux buffer与cache区别

A buffer is something that has yet to be "written" to disk. A cache is something that has been "read" from the disk and stored for later use. 更详细的解释参考:Difference Between Buffer and Cache cache 和 buffer的区别: Cache: 1.高速缓存硬件,是位于CPU与主内存间的一

Linux操作系统中内存buffer和cache的区别--从free命令说起(转)

原文链接:http://os.51cto.com/art/200709/56603.htm 我们一开始,先从Free命令说起. Free free 命令相对于top 提供了更简洁的查看系统内存使用情况: $ free total used free shared buffers cachedMem: 255268 238332 16936 0 85540 126384-/+ buffers/cache: 26408 228860Swap: 265000 0 265000 Mem:表示物理内存统计

buffer和cache有什么本质区别

在free命令展示机器的内存消耗情况,会像这样展示 buffered 和cached本质内容有什么区别呢? 我没搞明白.我觉得需要追根溯源会更加理解本质. 英文是这样解释 A buffer is something that has yet to be "written" to disk.  这些数据准备写到磁盘的,但还没有写到磁盘,缓存在内存中. 之所以有这样的机制,因为频繁地写入磁盘,会造成磁盘i/0,所以一般数据不会马上写入到磁盘去,而是定期积累到一定量后写入磁盘去. buffe

linux buffer 与 cache 的区别

linux buffer 与 cache 的区别.A buffer is something that has yet to be "written" to disk.A cache is something that has been "read" from the disk and stored for later use.两者都是RAM中的数据.简单来说,buffer(缓冲)是即将要被写入磁盘的,而cache(缓存)是被从磁盘中读出来的 缓冲(buffers)

Linux下的buffer与cache

最近在做监控项目的时候,有同事跟我说"你看Linux性能也不好嘛,内存使用率总是达到80%,我在windows下也没这种状况",我跟他解释,因为Linux系统,是尽可能的使用内存,内存不是拿来看的,是需要拿来用的,而对于windows,无论你的windows内存是多少,它还是会用硬盘交换文件来读(即使内存空间还有很多空余),而对于Linux,在查看内存使用率的时候,只要没有用到swap空间,我们就认为内存暂时不会紧缺. 那Linux下的buffer与cache到底是什么?又有什么区别了

Linux操作系统中内存buffer和cache的区别

Free free 命令相对于top 提供了更简洁的查看系统内存使用情况: $ free total             used         free     shared     buffers     cached Mem:     255268     238332     16936     0             85540     126384 -/+ buffers/cache: 26408 228860 Swap:  265000         0        

【转】free命令、buffer与cache的区别

freefree 命令相对于top 提供了更简洁的查看系统内存使用情况: # free total used free shared buffers cached Mem: 255988 231704 24284 0 6432 139292 -/+ buffers/cache: 85980 170008 Swap: 746980 0 746980 Mem:表示物理内存统计 -/+ buffers/cached:表示物理内存的缓存统计 Swap:表示硬盘上交换分区的使用情况,这里我们不去关心.系统

Buffer与Cache

Buffer(缓冲) Buffer(缓冲)是为了提高内存和硬盘(或者其他I/O设备)之间的数据交换的速度而设计的.根据磁盘的读写设计的.把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,提高性能. 主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以*减少响应次数*,通常其中的数据在操作完成之后,buffer不会被继续使用:(比如从网上下电影,你不能下一点点数据就写一下硬盘,而是积攒一定量的数据以后一整块一起写,不然硬盘都要被你玩坏了)缓和冲击嘛.