Linux buffer/cache解读

 cache与buffer解读


cache出现的原因与功能 计算机硬件中CPU、内存、磁盘是最主要的三大部分,其中,CPU发展到今天,执行速度最快,而内存相对CPU而言,就慢多了,CPU执行的指令是从内存取出的,计算的结果也要写回内存,但内存的响应速度如果跟不上CPU的话,CPU只能无所事事的等待了。这样一来,再快的CPU也发挥不了效率。

同理,内存中的数据也要回写到磁盘的,相对于机械硬盘HDD,内存的速度可快多了。这就又出现了问题,磁盘的低速读写速度,相比内存条的二进制电压变化速度,那就是蒸汽机和火箭速度的差别。这样巨大差异,即使内存读写速度再快,还是要被磁盘的低速读写拖后腿。

可以看到CPU,内存,磁盘读写速度都是不同的。

假设有两个需要交互的设备A和B,a用来交互的接口速率假设为1000m/s,b用来交互的速率为500m/s,这会出现两种情况。

a从b当中取1000m的文件,结果就需要2s,对于a来说本来1s就要完成的工作,但是还需要额外的等待1s,等待b取出剩余500m的空闲时间内,这个a只能无所事事什么都干不了,这是一种情况。

第二种情况就是a给b一个1000m的文件,它的结果也是需要2s,对于a来说本来也是需要1s来完成的工作却由于b的接受速度太慢,1s内只能接受500m,那么剩下的500m还得等剩下的1s读取,这样a又浪费1s的时间什么也干不了。

产生这样的结果主要是因为b跟不上a的脚步。

可以在a和b之间加一个区域,加了一个cd这样的区域,这样能够跟上a的脚步,也能够照顾b的感受。其实就是在cd上加两个交互的接口,一个是c接口,一个是d接口。c接口的速率是接近于c设备的,d接口的速率接近于d设备。

所谓Cache,就是“为了弥补高速设备和低速设备之间的矛盾”而设立的一个中间层。因为在现实里经常出现高速设备要和低速设备打交道,结果被低速设备拖后腿的情况。

buffer出现的原因以及与cached的比较


buffer,它存在的目的适用于速度快的设备往速度慢的设备输出东西。例如内存的数据要写到磁盘,cpu寄存器里的数据写到内存。缓冲(buffers)是根据磁盘的读写设计的,它把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。

总结:

1)、cached是cpu与内存间的,buffer是内存与磁盘间的,都是为了解决速度不对等的问题

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

3)buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的

4)在应用场景上,buffer是由各种进程分配的,被用在如输入队列等方面。 

Linux内存管理中page cache与buffer cache机制


下面我们结合cpu、内存、磁盘IO来看一下这种读、写缓存模型,如右图所示:

从图中可以看出,有读、写两条线。磁盘数据会被读取到Page cache进行缓存,程序要读取数据的时候,可以直接从Page cache读取,这是读取数据的一条线路。

此外,当page cache的数据需要刷新时,page cache中的数据会交给buffer cache,而Buffer cache中的所有数据都会定时刷新到磁盘。这些写入数据的另一条线。 

 page cache是文件系统层面的缓存,它从磁盘里面读取的内容都会存储在这里,这样应用程序在读取磁盘的内容就会非常的快,因为直接从pagecahce里面读取就行了,比如通过find命令查找某些文件,某些内容的时候,第一次查找的速度比较慢,第二次执行的时候瞬间就完成了,原因就是查找的文件都被缓存到pagecahce里面去了,再次查找就从内存里面读取这些文件,这样速度就会快很多。

buffer其实是磁盘和块设备的一个缓冲,这部分内存数据是最终要写入到磁盘的,不是及时写入磁盘的,它是等系统空闲或者buffer达到了一定大小的时候,统一写到磁盘当中的,所以系统断电的时候这部分数据可能会丢失。所以为了防止数据的丢失,在关机的时候多执行几次sync的命令,这样做的就是立刻将buffer中数据写入磁盘,操作系统也有定时同步的机制,它也会定时的去执行sync命令将内存 buffer/cahce数据刷到磁盘。

pagecache示例


示例 应用程序读取数据 

现在有个python脚本,比较简单

 执行之前先清空缓存,再执行两次脚本

第一次1.162,第二次0.046,这就是pagecahe的功能,因为第一次执行没有pagecahe缓存到page cache里面,所以时间就比较长,第二次执行因为数据缓存到pagecache里面了,那么再次执行从pagecache里面读取数据。

示例 打开文件

可以打开一个文件,文件里面的内容就被缓存到pagecache里面了,所以可以看到cache增加了。(缓存具体文件的内容)

示例 块设备内容

可以看到缓存的是块设备的内容,将块设备的内容,缓存到buffer里面去。

cache与buffer解读


free命令中buffers和cached的解读 先看一张图:

Linux是最大限度的将物理内存映射到缓存,待需要使用内存的时候,可以以最快的速度获取内存并使用,在available和buff/cache两列值的对比,可以看出,available是在buff/cache基础上减去了shared以及buffer内存损耗剩下的内存资源,这部分内存资源可以留给应用程序使用。所以查看内存是否充足,只需要关注available一列即可。 

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/125774896