LInux性能优化--内存(buffer 和 cache的区别)

当使用free工具输出的时候:
在这里插入图片描述
大部分指标都比较容易理解,但 Buffer 和 Cache 可能不太好区分。从字面上来说,Buffer 是缓冲区,而 Cache 是缓存,两者都是数据在内存中的临时存储。
不知道的情况,就查文档手册

buffers
Memory used by kernel buffers (Buffers in /proc/meminfo)

   cache  Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo)

   buff/cache
          Sum of buffers and cache

Buffers 是内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值。
Cache 是内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 Cached 与 SReclaimable 之和。
但是还是不清不楚的感觉,没有更具体的解释。
现在要怎么办呢?
因为系统性能数据的来源,都是来自/proc文件系统,那么通过查看/proc的手册,有没有更详细的信息呢?

Buffers %lu
Relatively temporary storage for raw disk blocks that shouldn’t get tremendously large (20MB or so).

Cached %lu
In-memory cache for files read from the disk (the page cache). Doesn’t include SwapCached.

SReclaimable %lu (since Linux 2.6.19)
Part of Slab, that might be reclaimed, such as caches.

SUnreclaim %lu (since Linux 2.6.19)
Part of Slab, that cannot be reclaimed on memory pressure.
1 Buffers 是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB 左右)。这样,内核就可以把分散的写集中起来,统一优化磁盘的写入,比如可以把多次小的写合并成单次大的写等等。
2 Cached 是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据。这样,下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。
3 SReclaimable 是 Slab 的一部分。Slab 包括两部分,其中的可回收部分,用 SReclaimable 记录;而不可回收部分,用 SUnreclaim 记录。
看起来是解决问题了,但是还有几个问题:
第一个问题,Buffer 的文档没有提到这是磁盘读数据还是写数据的缓存,而在很多网络搜索的结果中都会提到 Buffer 只是对将要写入磁盘数据的缓存。那反过来说,它会不会也缓存从磁盘中读取的数据呢?
第二个问题,文档中提到,Cache 是对从文件读取数据的缓存,那么它是不是也会缓存写文件的数据呢?
通过作实验来验证一下
环境:
1 操作系统 ubuntu 18.04
2 内存 4G
3 CPU 2核
4 sudo apt install sysstat
5 为了减少缓存的影响,记得在第一个终端中,运行下面的命令来清理系统缓存:
#清理文件页、目录项、Inodes等各种缓存
$ echo 3 > /proc/sys/vm/drop_caches
场景 1:磁盘和文件写案例
vmstat 1
在这里插入图片描述
buff 和 cache 就是我们前面看到的 Buffers 和 Cache,单位是 KB。
bi 和 bo 则分别表示块设备读取和写入的大小,单位为块 / 秒。因为 Linux 中块的大小是 1KB,所以这个单位也就等价于 KB/s。
这几个值在多次结果中一直保持不变。
到第二个终端执行 dd 命令,通过读取随机设备,生成一个 500MB 大小的文件:
$ dd if=/dev/urandom of=/tmp/file bs=1M count=500
在这里插入图片描述
发现,在 dd 命令运行时, Cache 在不停地增长,而 Buffer 基本保持不变。
在 Cache 刚开始增长时,块设备 I/O 很少,bi 只出现了一次 140 KB/s。而过一段时间后,才会出现大量的块设备写,比如 bo 变成了 10884。多次 I/O 写的结果加起来,才是 dd 要写的 500M 的数据。
把这个结果,跟我们刚刚了解到的 Cache 的定义做个对比,为什么前面文档上说 Cache 是文件读的页缓存,怎么现在写文件也有它的份?
先放下疑问,在进行下个实验
下面的命令对环境要求比较高,需要你的系统配置多块磁盘,并且磁盘分区 /dev/sda 还要处于未使用状态。如果你只有一块磁盘,千万不要尝试,否则将会对你的磁盘分区造成损坏。
#首先清理缓存
$ echo 3 > /proc/sys/vm/drop_caches
#然后运行dd命令向磁盘分区/dev/sdb1写入2G数据
$ dd if=/dev/urandom of=/dev/sda bs=1M count=2048
在这里插入图片描述
虽然同是写数据,写磁盘跟写文件的现象还是不同的。写磁盘时(也就是 bo 大于 0 时),Buffer 和 Cache 都在增长,但显然 Buffer 的增长快得多。
对比我们发现,写文件时会用到 Cache 缓存数据,而写磁盘则会用到 Buffer 来缓存数据。所以,回到刚刚的问题,虽然文档上只提到,Cache 是文件读的缓存,但实际上,Cache 也会缓存写文件时的数据。
场景 2:磁盘和文件读案例
#首先清理缓存
$ echo 3 > /proc/sys/vm/drop_caches
#运行dd命令读取文件数据
$ dd if=/tmp/file of=/dev/null
在这里插入图片描述
结论: Buffer 保持不变,而 Cache 则在不停增长
#首先清理缓存
$ echo 3 > /proc/sys/vm/drop_caches
#运行dd命令读取文件
$ dd if=/dev/sda1 of=/dev/null bs=1M count=1024
在这里插入图片描述
结论:Buffer 和 Cache 都在增长,但显然 Buffer 的增长快很多。这说明读磁盘时,数据缓存到了 Buffer 中
通过实验得出的结论:
1 Buffer 既可以用作“将要写入磁盘数据的缓存”,也可以用作“从磁盘读取数据的缓存”。
2 Cache 既可以用作“从文件读取数据的页缓存”,也可以用作“写文件的页缓存”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章