我做了两个实验。
第一个实验(Ubuntu 20.04,ext4文件系统):
- 运行命令
free -h -w
:
$ free -h -w
total used free shared buffers cache available
Mem: 30Gi 2,6Gi 25Gi 106Mi 126Mi 2,1Gi 27Gi
- 运行命令
sudo find / | grep something
- 再次运行命令
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):
- 运行命令
free -h -w
:
$ free -h -w
total used free shared buffers cache available
Mem: 30Gi 2,6Gi 24Gi 106Mi 1,2Gi 2,6Gi 27Gi
- 运行命令
dd if=/dev/nvme0n1p2 of=/dev/null bs=1M count=500
- 你的磁盘将是另一个这里 - 再次运行命令
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的缓存。结果,输出中的cache
和buffers
列都free
增加了。