Linux buffer 和cache 区别


# 不同版本的free输出可能会有所不同
$ free
              total        used        free      shared  buff/cache   available
Mem:        8169348      263524     6875352         668     1030472     7611064
Swap:             0           0           0

free 的输出包含了物理内存 Mem 和交换分区 Swap 的具体使用情况,比如总内存、已用内存、缓存、可用内存等。其中缓存是 Buffer 和 Cache 两部分的总和 。

其中buffer 和cache 的区别是:

  • Buffer 既可以用作“将要写入磁盘数据的缓存”,也可以用作“从磁盘读取数据的缓存”。
  • Cache 既可以用作“从文件读取数据的页缓存”,也可以用作“写文件的页缓存”。

简单来说,Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。

Buffer 和 Cache 分别缓存磁盘和文件系统的读写数据。

  • 从写的角度来说,不仅可以优化磁盘和文件的写入,对应用程序也有好处,应用程序可以在数据真正落盘前,就返回去做其他工作。
  • 从读的角度来说,既可以加速读取那些需要频繁访问的数据,也降低了频繁 I/O 对磁盘的压力。

磁盘和文件的区别

磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件。

其实 Linux 中“一切皆文件”,而文章中提到的“文件”是普通文件,磁盘是块设备文件

在读写普通文件时,会经过文件系统,由文件系统负责与磁盘交互;而读写磁盘或者分区时,就会跳过文件系统,也就是所谓的“裸I/O“。这两种读写方式所使用的缓存是不同的,也是本文提到的 Cache 和 Buffer 区别。

note 操作命令


# 清理文件页、目录项、Inodes等各种缓存
$ echo 3 > /proc/sys/vm/drop_caches
# /proc/sys/vm/drop_caches ,是通过 proc 文件系统修改内核行为的一个示例,写入 3 表示清理文件页、目录项、Inodes 等各种缓存。

# vmstat 输出
# 每隔1秒输出1组数据
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0 7743608   1112  92168    0    0     0     0   52  152  0  1 100  0  0
0  0      0 7743608   1112  92168    0    0     0     0   36   92  0  0 100  0  0

# 内存相关的输出
# buff 和 cache 就是指 Buffers 和 Cache,单位是 KB。
# bi 和 bo 则分别表示块设备读取和写入的大小,单位为块 / 秒。因为 Linux 中块的大小是 1KB,所以这个单位也就等价于 KB/s。

# dd 模拟
# dd 读取随机设备,生成一个 500MB 大小的文件,写入文件
$ dd if=/dev/urandom of=/tmp/file bs=1M count=500

# 清理缓存
$ echo 3 > /proc/sys/vm/drop_caches
# 然后运行dd命令向磁盘分区/dev/sdb1写入2G数据,
# 注意: /dev/sdb1 该设备的之前数据将会被清空
$ dd if=/dev/urandom of=/dev/sdb1 bs=1M count=2048

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

# 清理缓存
$ echo 3 > /proc/sys/vm/drop_caches
# 运行dd命令从设备读取数据
$ dd if=/dev/sda1 of=/dev/null bs=1M count=1024

你可能感兴趣的:(Linux buffer 和cache 区别)