![“free -h”指令輸出中緩衝區增加的原因](https://rvso.com/image/192257/%E2%80%9Cfree%20-h%E2%80%9D%E6%8C%87%E4%BB%A4%E8%BC%B8%E5%87%BA%E4%B8%AD%E7%B7%A9%E8%A1%9D%E5%8D%80%E5%A2%9E%E5%8A%A0%E7%9A%84%E5%8E%9F%E5%9B%A0.png)
我做了兩個實驗。
第一個實驗(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 欄位是什麼?但這裡的答案不適合我。
他們告訴「buffers 列包含有關文件的元資料」 - 但這是錯誤的,因為它是「快取」列,它計算 inode、dentry 和 buffer_head 的板(實際上是文件的元資料)。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
增加了。