美文网首页技术学习
Linux buffer 和cache 区别

Linux buffer 和cache 区别

作者: Vackine | 来源:发表于2021-01-31 23:19 被阅读0次
    
    # 不同版本的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 区别

        本文链接:https://www.haomeiwen.com/subject/jtmdtltx.html