linux内存在buff/cache中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux内存在buff/cache中相关的知识,希望对你有一定的参考价值。

参考技术A 两者都是RAM中的数据。简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。 缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。

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内存在buff/cache中的主要内容,如果未能解决你的问题,请参考以下文章

linux buff/cache

buff/cache设置上线

linux buff/cache 过高

已解决Linux中buff/cache(磁盘写/读缓存)占用大量内存导致用户进程内存不足

Linux中的buff/cache内存

已解决Linux中buff/cache(磁盘写/读缓存)占用大量内存导致用户进程内存不足