当前位置: 首页 > 科技观察

Linux内存中的缓冲区(Buffer)和缓存(Cache)_0

时间:2023-03-13 04:42:37 科技观察

缓冲区和缓存的定义:缓冲区:是对原始磁盘块的暂存,即将缓存的数据写入磁盘。它通常不是很大(大约20MB)。这样内核就可以将分散的写入集中起来,从而统一优化磁盘写入。例如,可以将多个小写合并为一个大写等。缓存:是从磁盘读取文件的页缓存,用于缓存从文件读取的数据。这样,下次访问这些文件数据时,可以直接从内存中快速取回,而不必再次访问慢盘。但是让我问你,因为Buffer只是将写入磁盘的数据缓存。反过来,它是否也缓存从磁盘读取的数据?或者Cache是??从文件中读取数据的缓存,那么它是否也缓存了写入文件的数据呢?如果你能回答以上两个问题,你可以跳过这篇文章,我想你已经对Buffer和Cache有了很好的了解。但如果你不能,请留在我身边以获得进一步的解释。free命令查看系统内存使用情况,你第一个想到的命令大概是free,例如:$free-htotalusedfreesharedbuff/cacheavailableMem:1.9G1.0G394M2.6M491M728MSwap:0B0B0B显然,输出包括物理内存Mem和Swap的具体使用情况(如总内存、已用内存、缓存、可用内存等)。Cache是??Buffer和Cache的总和。我们来看看freemanpage中Buffer和Cache的定义:buffersMemoryusedbykernelbuffers(Buffersin/proc/meminfo)cacheMemoryusedbypagecacheandslabs(CachedandSReclaimablein/proc/meminfo)buff/cachebuffers和cache的总和我们可以看到free命令的源数据实际上是存放在proc/meminfo文件中的。前面提到过,/proc是Linux内核提供的一个特殊的文件系统,它的作用就像是用户与内核进行交互的接口。/proc文件系统也是许多性能工具的最终数据源。在manproc中,缓冲区和缓存定义如下:页面缓存)。不包括SwapCached....SReclaimable%lu(自Linux2.6.19起)Slab的一部分,可能会被回收,例如缓存。SUnreclaim%lu(自Linux2.6.19起)Slab的一部分,不能被回收关于内存压力。至此,您可能认为您找到了我的问题的答案,“Buffer”只是一个用于将数据写入磁盘的缓存,而“Cache”只是用于从文件缓存中读取数据。但其实“Buffer”也可以用来读,“Cache”也可以用来写。实验我们将在这里做两个实验,写缓存和读缓存。写入缓存让我们登录到我们的Linux主机并准备好两个终端。在终端1,让我们先清除缓存:这里的/proc/sys/vm/drop_caches是一个通过proc文件系统修改内核行为的例子。写3表示清理各种缓存,比如文件页、目录项、Inode。还是在终端1,我们启动vmstat2命令:buff和cache就是我们前面看到的Buffer和Cache,单位是KB。bi和bo表示块设备的读写大小,单位为blocks/s。由于Linux中的块大小是1KB,所以这个单位相当于KB/s。接下来,切换到终端2,运行如下命令:现在切换回终端1,观察buff和cache的变化:通过观察vmstat的输出,我们发现在运行dd命令时,Cache一直在增长,而Buffer基本保持不变。读取缓冲区现在,让我们做第二个实验。再次清除终端1中的缓存:同样在终端1中,再次启动vmstat2命令:可以看到buff现在为0。现在在终端2中,运行以下命令:然后,回到终端1观察:观察vmstat的输出,会发现在读磁盘的时候(也就是bi>0的时候),Buffer和Cache都在增加,但是明显Buffer的增长要快很多。这意味着当从磁盘读取数据时,数据被缓存在Buffer中。现在我们几乎可以得出一个结论:读取文件时数据会缓存在Cache中,读取磁盘时数据会缓存在Buffer中。结论你应该发现这里虽然描述了Buffer和Cache,但它们仍然不能涵盖所有细节。现在我们已经了解了以下两点:Buffer:它既可以作为“写入磁盘的数据缓存”,也可以作为“从磁盘读取的数据缓存”。缓存:既可以作为“读取文件的页面缓存”,也可以作为“写入文件的页面缓存”。