美文网首页
Linux free 命令中的 cache 和 buffer 指

Linux free 命令中的 cache 和 buffer 指

作者: wayyyy | 来源:发表于2023-04-23 00:00 被阅读0次

    free 输出:


    free.png
    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执行一次、
    

    相关文章

      网友评论

          本文标题:Linux free 命令中的 cache 和 buffer 指

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