Linux中Buffer和Cache的区别

Posted wbo112

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux中Buffer和Cache的区别相关的知识,希望对你有一定的参考价值。

Linux中Buffer和Cache的区别

free命令中会有一项buff/cache,

通过man free可以看到这里的关于buff/cache的介绍

buff/cache包含两部分

buffers:内核缓存区用到的内存,对应/proc/meminfoBuffers的值

cache:内核页缓存和Slab用到的内存,对应/proc/meminfoCachedSReclaimable之和。

执行man proc可以看到关于/proc/meminfo的说明。

Buffers是对原始磁盘块的临时缓存,通常不会特别大(20M左右)。

Cached是从磁盘读取文件的页缓存

SReclaimableSlab的一部分。

Slab包括两部分,其中的可回收部分,用SReclaimable记录,而不可回收的部分,用SUnreclaim表示。

案例:

基于Ubuntu 20.04.1 LTS

执行apt install sysstat,安装sysstat包。

写入场景:

执行echo 3 >/proc/sys/vm/drop_caches清空系统缓存。

写入/proc/sys/vm/drop_caches表示清理文件页,目录项,Inodes等各种缓存。

执行vmstat 1每1秒输出1组数据。

buffcache 就是我们前面看到的 BuffersCache,单位是 KB

bibo 则分别表示块设备读取和写入的大小,单位为块 / 秒。因为 Linux 中块的大小是 1KB,所以这个单位也就等价于 KB/s

1.1、将数据写入文件测试

新开一个shell窗口,执行 dd if=/dev/urandom of=/tmp/file bs=1M count=500,通过读取随机设备,生成一个 500MB 大小的文件。

回到vmstat的窗口,会看到在 dd 命令运行时, Cache 在不停地增长,而 Buffer 基本保持不变。

可以看到cache刚开始增长,块设备 I/O 很少。而过一段时间后,才会出现大量的块设备写。

由于dd命令写出512000KB,所以bo的大小至少会等于512000KB,有可能会大于这个值,这是由于系统中其他进程也会写文件,比如第一行的bo的380。

多次执行的话,就会看到dd命令对应的bo的值就是512000KB。

这里也可以看到cache先增长,后面才会有bo增长。这是由于先写入cache缓存, 此时不会和磁盘进行交互, 当需要将缓存数据刷入磁盘时, 才会发生块写入此时bo值会升高

1.2、将数据写入磁盘测试

echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/urandom of=/dev/sdb1 bs=1M count=2048 #注意:这个是直接写到磁盘上,会导致历史数据全部丢失。建议找一个空盘测试

再次观察vmstat的记录,可以看到buffcache 都在增长,但显然 buff 的增长快得多。

这里的结果和man命令的说明是一致的。写文件时会用到 Cache 缓存数据,而写磁盘则会用到 Buffer 来缓存数据。

读取场景:

刚才是文件和磁盘读取时候buffcache的变化,现在我们再看看写操作的情况。

2.1、从文件中读取数据测试

执行下面的命令。

# 首先清理缓存
echo 3 > /proc/sys/vm/drop_caches
# 运行dd命令读取文件数据
dd if=/tmp/file of=/dev/null

再次观察vmstat的记录

就可以看到这次还是cache有明显的增长,也就是我们读取内存的大小(512000KB),不过这次由于我们是读取,所以bi有明显的增长也会是512000KB。

上面是读取文件,我们再看看读取磁盘。

2.2、从磁盘中读取数据测试

执行下面给的命令

# 首先清理缓存
echo 3 > /proc/sys/vm/drop_caches
# 运行dd命令读取文件
dd if=/dev/sda1 of=/dev/null bs=1M count=1024

可以看到,buffbi有明显的增长。也就是我们读取内容的大小1024000KB

结论:

从上面也可以看到:

Buffer: 如果没有经过文件系统,直接从磁盘读取、写入数据,就会体现到Buffer中。既可以用作“将要写入磁盘数据的缓存”,也可以用作“从磁盘读取数据的缓存”。

Cache :如果经过文件系统,从磁盘读取、写入数据,就会体现到Cache中。既可以用作“从文件读取数据的页缓存”,也可以用作“写文件的页缓存”。

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

本文和大家分享的主要是linux 中 内存buffer 和 cache 的区别相关内容,一起来看看吧,希望对大家 学习linux有所帮助。
细心的朋友会注意到, 当你在 linux 下频繁存取文件后 , 物理内存会很快被用光 , 当程序结束后 , 内存不会被正常释放 , 而是一直作为 caching. 这个问题 , 貌似有不少人在问 , 不过都没有看到有什么很好解决的办法 . 那么我来谈谈这个问题 .
先来说说free 命令
[[email protected] ~]# 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
那么我们来看看, 如果我执行复制文件 , 内存会发生什么变化 .
[[email protected] ~]# cp -r /etc ~/test/
[[email protected] ~]# 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 吃掉了 . 别紧张 , 这是为了提高文件读取效率的做法 .
为了提高磁盘存取效率, Linux 做了一些精心的设计 ,  除了对 dentry 进行缓存 ( 用于 VFS, 加速文件路径名到 inode 的转换 ),  还采取了两种主要 Cache 方式: Buffer Cache 和 Page Cache 。前者针对磁盘块的读写,后者针对文件 inode 的读写。这些 Cache 有效缩短了  I/O 系统调用 ( 比如 read,write,getdents)的时间。 "
那么有人说过段时间,linux 会自动释放掉所用的内存 , 我们使用 free 再来试试 , 看看是否有释放 >?
[[email protected] 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 来释放内存 . 操作如下 :
[[email protected] test]# cat /proc/sys/vm/drop_caches
首先,/proc/sys/vm/drop_caches 的值 , 默认为 0
[[email protected] test]# sync
手动执行sync 命令 ( 描述 : sync   命令运行  sync   子例程。如果必须停止系统,则运行  sync   命令以确保文件系统的完整性。  sync   命令将所有未写的系统缓冲区写到磁盘中,包含已修改的  i-node 、已延迟的块  I/O  和读写映射文件 )
[[email protected] test]# echo 3 > /proc/sys/vm/drop_caches
[[email protected] test]# cat /proc/sys/vm/drop_caches
3
将/proc/sys/vm/drop_caches 值设为 3
[[email protected] 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.
有关/proc/sys/vm/drop_caches 的用法在下面进行了说明
/proc/sys/vm/drop_caches (since Linux 2.6.16)
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 1 > /proc/sys/vm/drop_caches; to
free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to   free   pagecache,   dentries  and  inodes,  use  echo  3  >
/proc/sys/vm/drop_caches.
Because this is a non-destructive operation  and  dirty  objects
are not freeable, the user should run sync(8) first.
=========================================================================
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
 对于共享内存( Shared memory ),主要用于在 UNIX  环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存  ,笔者也没有去验证共享内存对上面等式的影响。如果你有兴趣,请参考: What is Shared Memory?
cache   和  buffer  的区别:
Cache  :高速缓存,是位于 CPU 与主内存间的一种容量较小但速度很高的存储器。  由于CPU  的速度远高于主内存,  CPU 直接从内存中存取数据要等待一定时间周期,  Cache  中保存着 CPU  刚用过或循环使用的一部分数据,当  CPU  再次使用该部分数据时可从  Cache  中直接调用  , 这样就减少了  CPU  的等待时间  ,  提高了系统的效率。  Cache  又分为一级  Cache(L1 Cache)  和二级  Cache(L2 Cache)  , L1 Cache  集成在  CPU  内部,  L2 Cache  早期一般是焊在主板上  ,  现在也都集成在  CPU  内部,常见的容量有  256KB  或  512KB L2 Cache  。
Buffer  :缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
Free  中的  buffer  和  cache  :(它们都是占用内存):
buffer :   作为  buffer cache  的内存,是块设备的读写缓冲区
cache:   作为  page cache  的内存  ,   文件系统的  cache
如果  cache   的值很大,说明  cache  住的文件数很多。如果频繁访问到的文件都能被  cache 住,那么磁盘的读  IO bi
会非常小。
==============================================================================================
cache 是高速缓存,用于 CPU 和内存之间的缓冲;
buffer 是 I/O 缓存,用于内存和硬盘的缓冲
cache 最初用于 cpu cache,  主要原因是 cpu  与 memory,  由于 cpu 快 ,memory 跟不上 , 且有些值使用次数多 , 所以放入
cache 中,主要目的是,重复使用 ,  并且一级 \ 二级物理 cache 速度快,
buffer  主要用于 disk  与  memory , 主要是保护硬盘或减少网络传输的次数(内存数据表现 dataSet).当然也可以提高速度(不会立即写入硬盘或直接从硬盘中读出的数据马上显示),重复使用,最初最主要的目的是保护 disk,
 asp.net 的 cache 有 outputcahe 与数据 cache,  主要目的是 重复使用,提高速度, outputcache 主要存储 Reader 后的页,一般是多次使用同一个 HTML ,建议不要 varybyparam ,不要存多 version,
数据cache, 如 dataSet, dataTable,  等
@page buffer="true",  使用 buffer ,让 buffer 满后再显示读出或写入, (c 中文件输出也是如此 , 主要目的是保护硬盘 ),  也可以提高下次的访问速度 .    在 client browse 端表现是 : true 是一次性显示 , 要么不显示 ,  中间等 , false 是一次显示一些 ,
这在网络输出也是如此表现.
对于文件访问c 中默认采用的是 buffer = true,  这与 asp.net 一样 ,
相当于Response.write(); 中当 buffer 满后输出 , 以减少网络的传输次数
来源:ChinaUnix 博客

以上是关于Linux中Buffer和Cache的区别的主要内容,如果未能解决你的问题,请参考以下文章

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

Linux中Buffer和Cache的区别

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

Linux中Buffer和Cache的区别

Linux中Buffer和Cache的区别

Linux中Buffer和Cache的区别