萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 記憶體 Cache 深度分析:原理、工具與實戰排查

Linux 將空閒記憶體積極用作頁面快取以加速檔案 I/O,導致 free -h 顯示的 "available" 遠大於 "free",而 "cached" 佔用極大。這是**特性而非缺陷**。但當 Cache 異常膨脹 (甚至超過物理記憶體大小,因計算方式包含 tmpfs/共享記憶體) 或疑似記憶體洩漏時,需深度分析 Cache 內容。本文介紹 linux-ftools (fincore) 工具實戰分析 Cache 組成,驗證「Linux 會緩存被編輯過的檔案」結論。

初始 Cache 狀態

背景知識:Linux 頁面快取機制

  • Page Cache : 核心將讀取過的檔案頁面保留在記憶體,後續讀取直接命中,不經磁碟。
  • 回收機制 : 記憶體壓力時,核心透過 kswapd/direct reclaim 回收乾淨頁 (可直接丟棄) 或回寫髒頁後回收。
  • 統計指標 : /proc/meminfo 中 Cached = Page Cache + Slab (可回收部分);Shmem (tmpfs、共享記憶體) 也計入 Cached。
  • 超過物理記憶體: Cached 可能 > 總記憶體,因包含 Shmem (佔用實體頁但不計入 Used) 及重複計算情況。

工具鏈:linux-ftools (fincore)

fincore 能顯示指定檔案在 Page Cache 中的駐留頁數與比例,原理是透過 mincore() 系統調用逐頁檢查。

安裝步驟 (源碼編譯)

# 1. 下載源碼 (GitHub: davidtvaughan/linux-ftools)
wget https://github.com/davidtvaughan/linux-ftools/archive/refs/heads/master.zip
unzip master.zip
cd linux-ftools-master

# 2. 修正換行符 (若為 Windows 格式)
# dos2unix configure Makefile.in *.c *.h  # 或用 sed

# 3. 編譯安裝
chmod 755 -R .
./configure
make && sudo make install

# 安裝至 /usr/local/bin/linux-fincore

核心命令語法

linux-fincore [options] FILE...
# 關鍵選項:
#   --pages=false       不顯示每頁詳情,只顯示摘要
#   --summarize         顯示總計行
#   --only-cached       僅顯示有快取頁面的檔案
#   *                   當前目錄所有檔案

實戰分析流程

1. 基線觀測

# 進入測試目錄
cd /tmp/test_cache
linux-fincore --pages=false --summarize --only-cached *

編輯大檔後 Cache 飆升

2. 觸發 Cache 變化

使用 vim 開啟一個 110MB 大檔 (wildfly-8.1.0.Final.tar.gz),不存檔直接退出。vim 會將整個檔案讀入記憶體進行語法高亮、語法分析等,導致該檔案頁面大量進入 Page Cache。

3. 分析 Cache 組成

linux-fincore --pages=false --summarize --only-cached *

輸出關鍵欄位:

  • filename:檔名
  • size:檔案大小 (Bytes)
  • total_pages:檔案總頁數 (4KB/頁)
  • cached_pages:駐留 Page Cache 頁數
  • cached_size:駐留大小 (Bytes)
  • cached_perc:快取佔比

結果顯示 wildfly-8.1.0.Final.tar.gz 100% 進入快取 (cached_perc=100.00),cached_size 略大於檔案大小 (含元資料開銷)。

fincore 分析結果

核心結論

  1. Linux 確實會緩存被讀取/編輯過的檔案內容至 Page Cache,哪怕只是 vim 開啟檢視。
  2. Cached 巨大通常是正常現象,代表熱點資料在記憶體中,**無需人為清理**。核心會在記憶體壓力時自動回收。
  3. 若確需釋放 (如測試磁碟真實效能):
    echo 1 > /proc/sys/vm/drop_caches   # 僅釋放 Page Cache
    echo 2 > /proc/sys/vm/drop_caches   # 僅釋放 inode/dentry cache
    echo 3 > /proc/sys/vm/drop_caches   # 釋放所有 (Page Cache + inode + dentry)
    # 生產環境謹慎使用,會造成 I/O 風暴
        
  4. 若懷疑記憶體洩漏,應觀察 Active/Inactive、Slab、KernelStack、PageTables 等 /proc/meminfo 細項,而非單看 Cached。

擴展工具推薦

  • vmtouch : 更強大的檔案快取控制工具,可鎖定檔案在記憶體、查看/刷出快取。vmtouch -v /path/to/file。
  • pcstat (Go) : 跨平台檔案快取統計,輸出 JSON 易整合。
  • bpftrace/eBPF : 核心級動態追蹤,可分析 mark_page_accessed、account_page_dirtied 等熱點路徑。

總結

Linux Page Cache 是效能加速器而非負擔。使用 linux-fincore / vmtouch 可精準定位哪些檔案佔用快取空間,驗證應用行為 (如備份掃描導致熱點資料被擠出)。**除非明確知道在做什麼,否則不要手動清理 Cache**;應關注 Available 記憶體是否充足,以及應用實際效能指標 (延遲、吞吐)。

copyright © 萬盛學電腦網 all rights reserved