“free -h”命令输出中缓冲区增加的原因

“free -h”命令输出中缓冲区增加的原因

我做了两个实验。

第一个实验(Ubuntu 20.04,ext4文件系统):

  1. 运行命令free -h -w
$ free -h -w
              total        used        free      shared     buffers       cache   available
Mem:           30Gi       2,6Gi        25Gi       106Mi       126Mi       2,1Gi        27Gi
  1. 运行命令sudo find / | grep something
  2. 再次运行命令free -h -w,观察“buffers”列显着增加(约 1G),“cache”列也增加(约 500M):
$ free -h -w
              total        used        free      shared     buffers       cache   available
Mem:           30Gi       2,6Gi        24Gi       106Mi       1,2Gi       2,6Gi        27Gi

第二个实验(同一台PC):

  1. 运行命令free -h -w
$ free -h -w
              total        used        free      shared     buffers       cache   available
Mem:           30Gi       2,6Gi        24Gi       106Mi       1,2Gi       2,6Gi        27Gi
  1. 运行命令dd if=/dev/nvme0n1p2 of=/dev/null bs=1M count=500- 你的磁盘将是另一个这里
  2. 再次运行命令free -h -w,观察缓冲区增加了 500M:
$ free -h -w
              total        used        free      shared     buffers       cache   available
Mem:           30Gi       2,6Gi        24Gi       115Mi       1,7Gi       2,6Gi        27Gi

所以问题是:为什么buffers在第一种情况下增加列,为什么在第二种情况下增加列?我读过这个free 输出中的 buffers 列是什么?但这里的答案不适合我。

他们说“缓冲区列包含有关文件的元数据” - 但这是错误的,因为“缓存”列计算了 inode、dentry 和 buffer_head(实际上是文件的元数据)的 slab。man free还告诉我们该cache列包含SReclaimable

他们还告诉“缓冲区列包含来自块设备的块的缓存” - 它看起来更像是事实,它解释了为什么buffers当我运行时增加dd,但它没有解释为什么buffers当我运行find命令时列增加。即使在这种情况下dd- 如果我们已经有文件缓存,为什么我们需要它?除了 DVD 磁盘之外,没有人可以直接从块设备读取数据或向块设备写入数据。

答案1

在这里找到了答案:如何确定缓冲区内存使用量过大的原因? 似乎Linux将文件的inode存储两次:第一次作为ext4_inode_cache/inode_cache在slab中(我观察到用命令增加了这些slab的大小slabtop),第二次在缓冲区中(因为inode是直接从块设备读取的,并且所有块都是直接从块设备读取的)块设备存储在缓冲区中)。因此,当我运行find命令时,linux从块设备读取inode的块,将它们保存在缓冲区中,然后在slab中创建inode的缓存。结果,输出中的cachebuffers列都free增加了。

相关内容