Heng30的博客
搜索 分类 关于 订阅

Linux中的Buffer和Cache有什么区别?

2025-02-18

在编程的时候,经常听见buffercache,很多时候我们都不区分它们。但在操作系统中,它们是完全不同的两个概念。下面我带大家来看看它们两个到底是什么多西?

下面是free -h的输出。可以看到有buff/cache的输出信息

               total        used        free      shared  buff/cache   available
Mem:            30Gi        10Gi       4.8Gi       938Mi        16Gi        20Gi
Swap:           15Gi       1.0Gi        15Gi

通过man free来查看:

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的信息都是从/proc/memeinfo文件中获取的。buffer是内核使用的缓冲区。cache是页缓存和slab管理的缓存。不过给出的信息还是比较模糊的,需要进一步进行探索。

通过man proc_meminfo

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

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

上面就更加详细的说明了buffer了。它是磁盘的写缓冲区,且每个buffer块大小不能大于20M。而cache是磁盘的*读缓存页,并且不包括交换缓存

通过上面的内容还是没法很好的理解buff/cache的含义。下面通过一个实验更进一步探索。

  • 清空缓存:echo 3 > /proc/sys/vm/drop_caches

  • 启动vmstat监控虚拟内存使用情况: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 gu
     0  0    268 2376920   4912 419948    0    0     0     0  283  104  0  0 100  0  0  0
     0  0    268 2377264   4912 419948    0    0     0     0  181   98  0  0 100  0  0  0
     0  0    268 2377264   4912 419948    0    0     0     0  169   46  0  0 100  0  0  0
     0  0    268 2377560   4912 419948    0    0     0     0  112   34  0  0 100  0  0  0
    
    
  • 运行dd if=/dev/urandom of=/tmp/a.dat bs=1M count=1024命令生成一个大文件,看buffercache的变化情况。

    procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st gu
     1  1    268 2381436   5324 419816    0    0   132     0  252  150  0  0 100  0  0  0
     2  2    268 2092648   5516 704412    0    0   284  4140  663  250  0  0 85 14  0  0
     3  1    268 1725108   5548 1069384   0    0    48 307160 3377  697  0  7 69 23  0  0
     1  0    268 1377348   5592 1413124   0    0   704 405504 4158  982  0 10 66 24  0  0
     0  0    268 1287428   5628 1496420   0    0    44 331776 1704  412  0  3 85 11  0  0
     0  0    268 1284220   7344 1502124   0    0  7372   296 2322  972  0  0 96  3  0  0
    

    在上面的过程中buffer5M增加到7M,大约2M的增加量。而cache400M增加11.5G,大约1G的增加量。

  • 运行sudo dd if=/tmp/a.dat of=/dev/zero bs=1M count=1024命令,将一个大文件写入设备,看buffercache的变化情况。

    procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st gu
     0  0    268 2376536  10884 427724    0    0     0     0  142   32  0  0 100  0  0  0
     1  0    268 2376536  10884 427724    0    0     0    60   76   24  0  0 100  0  0  0
     0  0    268 2376536  10884 427724    0    0     0     0  233   40  0  0 100  0  0  0
     0  2    268 1831780  11044 969308    0    0 542020   112 3529 1690  0  2 89  9  0  0
     0  0    268 1315820  11060 1476496    0    0 506880    80 3445 1669  1  2 92  5  0  0
     0  0    268 1315820  11060 1476496    0    0     0     0  171   27  0  0 100  0  0  0
    

    在上面的过程中buffer10M增加到11M,大约1M的增加量。而cache420M增加11.5G,大约1G的增加量。

总结

无论是从磁盘读取文件,还是将文件写入磁盘都会使用buffer和cache。而且cache的使用量远大于buffer的使用量。 因为内存的访问速度比磁盘要块。cache可以很快使用完被释放,短时间的大量使用是能够接受的。而buffer写入磁盘的速度较慢,分配过多内存会长时间得不到释放,严重影响机器的性能。