• free中buffer 与 cache 的区别


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

    由于CPU的速度比内存和硬盘的速度要快得多,所以在存取数据时会使CPU等待,影响计算机的速度。SRAM的存取速度比其它内存和硬盘都要快,所以它被用作电脑的高速缓存(Cache)。

    Buffer从英文直译过来的意思是“缓冲区”,这里我们将它称为缓冲,因为它不仅是个名词,还是个动词。
    缓冲区是存储一系列的数据的地方,客户端所获得的数据可以从程序的执行结果直接输出,也可以从缓冲区输出。
    但是这两种方式在速度上是有差异的:在web中,当一个asp程序被请求的次数不多时,二者基本上没有什么差异,至少我们感觉不出来。但是当有很多人请求一个asp程序时,速度可就不一样了。
    如果没有缓冲区,那么每个请求asp程序的人的客户端所得到的结果都是asp程序执行一次所得到的结果,而如果预先将asp程序缓冲,那么每个客户端所得到的结果就是缓冲区的结果,不是执行一次程序的结果。比如有1000个用户同时访问一个asp页面,如果这个asp程序没有缓冲,那么程序将被执行一千次,这样服务器的负荷就回加大,从而导致客户端打开页面速度变慢;如果这个asp程序被缓冲了,那么结果就不一样了,每个客户端直接从缓冲区获得数据,服务器将不会因为访问增加而增加程序执行次数,因此客户端打开页面的速度也就比上一种情况要快。这就是Buffer的好处。

    先来说说free命令 

    [root@server ~]# free -m 
    total used free shared buffers cached 
    Mem: 249 163 86 0 10 94 
    -/+ buffers/cache: 58 191 
    Swap: 511 0 511 

    其中: 

    total 内存总数 

    used 已经使用的内存数 

    free 空闲的内存数 

    shared 多个进程共享的内存总额 

    buffers Buffer Cache和cached Page Cache 磁盘缓存的大小 

    -buffers/cache 的内存数:used - buffers - cached 

    +buffers/cache 的内存数:free + buffers + cached 

    可用的memory=free memory+buffers+cached 

    有了这个基础后,可以得知,我现在used为163MB,free为86,buffer和cached分别为10,94 

    那么我们来看看,如果我执行复制文件,内存会发生什么变化. 

    [root@server ~]# cp -r /etc ~/test/ 
    [root@server ~]# free -m 
    total used free shared buffers cached 
    Mem: 249 244 4 0 8 174 
    -/+ buffers/cache: 62 187 
    Swap: 511 0 511 

    在我命令执行结束后,used为244MB,free为4MB,buffers为8MB,cached为174MB,天呐都被cached吃掉了.别紧张,这是为了提高文件读取效率的做法. 

    引 用http://www.wujianrong.com/archives/2007/09/linux_free.html"为了提高磁盘存取效 率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方 式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用 (比如read,write,getdents)的时间。" 

    那么有人说过段时间,linux会自动释放掉所用的内存,我们使用free再来试试,看看是否有释放>? 

    [root@server test]# free -m 
    total used free shared buffers cached 
    Mem: 249 244 5 0 8 174 
    -/+ buffers/cache: 61 188 
    Swap: 511 0 511 

    MS没有任何变化,那么我能否手动释放掉这些内存呢???回答是可以的! 

    /proc 是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改/proc中的文件,来对当前 kernel的行为做出调整.那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存.操作如下: 

    [root@server test]# cat /proc/sys/vm/drop_caches 

    首先,/proc/sys/vm/drop_caches的值,默认为0 

    [root@server test]# sync 

    手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件) 

    [root@server test]# echo 3 > /proc/sys/vm/drop_caches 
    [root@server test]# cat /proc/sys/vm/drop_caches 

    将/proc/sys/vm/drop_caches值设为3 

    [root@server test]# free -m 
    total used free shared buffers cached 
    Mem: 249 66 182 0 0 11 
    -/+ buffers/cache: 55 194 
    Swap: 511 0 511 

    再来运行free命令,发现现在的used为66MB,free为182MB,buffers为0MB,cached为11MB.那么有效的释放了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有一个守护进程定期清空缓冲内容(即写磁盘),也可以通过sync命令手动清空缓冲。举个例子吧:我这里有一个ext2的U盘,我往里面cp一个3M的 MP3,但U盘的灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。

    缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘

    其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有 内存可用。
    如果你希望手动去释放Cache Memory也是可以的

    如何手工释放Cache Memory(缓存内存), 用下面的命令可以释放Cache Memory:
    To free pagecache
         $sync; echo 1>/proc/sys/vm/drop_caches
    To free dentries and inodes:  
         $sync; echo 2>/proc/sys/vm/drop_caches
    To free pagecache, dentries and inodes:
         $sync; echo 3>/proc/sys/vm/drop_caches
    注意,释放前最好sync一下,防止丢失数据。

    2. 解释 free 命令
    free命令中的buffer和cache:(它们都是占用内存):
           buffer : 作为buffer cache的内存,是块设备的读写缓冲区
           cache: 作为page cache的内存, 文件系统的cache


    #这个命令行用来调查谁在加数据入page_cache
    [root@my031045 ~]# stap -e 'probe vfs.add_to_page_cache {printf("dev=%d, devname=%s, ino=%d, index=%d, nrpages=%d/n", dev, devname, ino, index, nrpages )}'
    ...
    dev=2, devname=N/A, ino=0, index=2975, nrpages=1777


      $ free

          total                used                 free                   shared               buffers             cached  
    Mem: 255268               238332               16936                       0               85540               126384
    -/+ buffers/cache:        26408                228860
    Swap: 265000              0                    265000

      Mem:表示物理内存统计

      -/+ buffers/cached:表示物理内存的缓存统计
      Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。
      系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存b并不是第一行free 标记的 16936Kb,它仅代表未被分配的内存。
      我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。
      total1:表示物理内存总量。
      used1:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
      free1:未被分配的内存。
      shared1:共享内存,一般系统不会用到,这里也不讨论。
      buffers1:系统分配但未被使用的buffers 数量。
      cached1:系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。
      used2:实际使用的buffers 与cache 总量,也是实际使用的内存总量。
      free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。

      可以整理出如下等式:
      total1 = used1 + free1
        total1 = used2 + free2
        used1 = buffers1 + cached1 + used2
        free2 = buffers1 + cached1 + free1
    可见,used2 是真正使用的, 比used1 小, used1 包含分配但未使用内存。
          free2 是真正可使用的。比free1 大,free1 未包含分配但未使用内存
    实验:
    读程序  看cache 会越来越大
    写程序  看buffer 会越来越大

    ————————————————
    版权声明:本文为CSDN博主「hejinjing_tom_com」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/hejinjing_tom_com/article/details/12199759

  • 相关阅读:
    oracle中获取当前整点和上一个小时整点,日期类型
    MYSQL中替换oracle中runum用法
    oracle 中备份表
    發生了不愉快的事情
    今年下雪了。。。
    VB.net下非常好用的实现FTP的类
    今年過節不回家了
    焕肤:不要暗沉
    不要打梦到的电话号码。。。
    關於IT職業的思考
  • 原文地址:https://www.cnblogs.com/klb561/p/11960374.html
Copyright © 2020-2023  润新知