“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 欄位是什麼?但這裡的答案不適合我。

他們告訴「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的快取。結果,輸出中的cachebuffers列都free增加了。

相關內容