Linux free 命令中的 cache 和 buffer 指的是什么?

free 输出:

Linux free 命令中的 cache 和 buffer 指的是什么?

total

内存总量,等同于 /proc/meminfo 中的 MemTotalSwapTotal之和。

used

已使用的内存。计算公式为:used = total – free – buffers – cache

free

未被使用的物理内存,等同于 /proc/meminfo 中的 MemFreeSwapFree

shared

一般是临时文件系统使用的内存,等同于 /proc/meminfo 中的 Shmem(自内核 2.6.32 版本可用,不可用则显示为 0)

available

是从应用程序的角度看到的可用内存数量。

Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。

当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。

buffer/cache

查阅 man free 和 /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.

Buffer 可以用作”将要写入磁盘数据的缓存”,也可以用作”从磁盘读取数据的缓存”。
Cache 可以用作”从文件读取数据的页缓存”,也可以用作”写文件的页缓存”。
Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们都可以用在读请求中,也会用在写请求中。

具体查看buffer/cache的大小

# cat /proc/meminfo 
  ...
  Buffers:          174448 kB
  Cached:          1914600 kB
  ...

利用 vmstat 命令 探究Buffer 和 Cache
  • 清理文件页,目录项,Inodes等各种缓存

    echo 3 > /proc/sys/vm/drop_caches
    

  • 再第一个终端执行vmstat命令

    # vmstat -w 1  # -w 后跟刷新间隔
    procs ----------------memory-----------------------swap-- -----io----...
     r  b  swpd   free      buff   cache     si   so    bi    bo  ...
     2  0  0      1315212   7692    247288    0    0     5    31  ...  
     2  0  0      1315212   7692    247304    0    0     0     0  ...
    
    

    • swpd:使用的虚拟内存数量
    • si:一部分内存从swap分区(磁盘)被移动到了内存
    • so:一部分内存被移动到了swap分区(磁盘)
    • bi:从块设备收到的快数量(磁盘->内存)
    • bo:发送到块设备的块数量(内存->磁盘)

    空闲的系统下,

  • 向磁盘写文件测试
    再第二个终端执行dd,通过读取随机设备,生成一个 1024MB 大小的文件

    # dd if=/dev/urandom of=/tmp/file bs=1M count=1024
    

    观察第一个终端的Buffer 和 cache 的变化

    r  b   swpd   free        buff   cache    si   so    bi    bo   
    0  0   0      1309856     9008   251504    0    0     0     0  
    0  0   0      1309888     9008   251508    0    0     0     0  
    1  1   0      1158160     9024   402264    0    0    76    6308 
    1  1   0      1008280     9044   552152    0    0    16    167980  
    1  1   0       845100     9052   715320    0    0     8    145412 
    1  1   0       665056     9064   895312    0    0    12    108544  
    1  1   0       509152     9068   1051080   0    0    4     141320  
    1  2   0       387088     9080   1173224   0    0    8     82040  
    1  1   0       262840     9088   1297424   0    0    4     145516  
    0  1   0       243836     9092   1317456   0    0    4     98312  
    

    会发现:

    • Cache 在不停地增长,而 Buffer 基本保持不变。
  • 直接裸写磁盘,绕过文件系统
    第二终端执行如下:

    # echo 3 > /proc/sys/vm/drop_caches
    # dd if=/dev/urandom of=/dev/vda1 bs=1M count=2048
    

    再观察第一个终端输出:

    会发现:

    • 写磁盘时(也就是 bo 大于 0 时),Buffer 和 Cache 都在增长,但显然 Buffer 的增长快得多。

所以综上2个例子:
Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。

  • 让free持续运行一段时间

free -s 3  # 每隔3s执行一次、

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...