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

kswapd/direct reclaim 回收乾淨頁 (可直接丟棄) 或回寫髒頁後回收。/proc/meminfo 中 Cached = Page Cache + Slab (可回收部分);Shmem (tmpfs、共享記憶體) 也計入 Cached。Cached 可能 > 總記憶體,因包含 Shmem (佔用實體頁但不計入 Used) 及重複計算情況。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 僅顯示有快取頁面的檔案
# * 當前目錄所有檔案
# 進入測試目錄
cd /tmp/test_cache
linux-fincore --pages=false --summarize --only-cached *

使用 vim 開啟一個 110MB 大檔 (wildfly-8.1.0.Final.tar.gz),不存檔直接退出。vim 會將整個檔案讀入記憶體進行語法高亮、語法分析等,導致該檔案頁面大量進入 Page 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 略大於檔案大小 (含元資料開銷)。

vim 開啟檢視。Cached 巨大通常是正常現象,代表熱點資料在記憶體中,**無需人為清理**。核心會在記憶體壓力時自動回收。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 風暴
Active/Inactive、Slab、KernelStack、PageTables 等 /proc/meminfo 細項,而非單看 Cached。vmtouch -v /path/to/file。mark_page_accessed、account_page_dirtied 等熱點路徑。Linux Page Cache 是效能加速器而非負擔。使用 linux-fincore / vmtouch 可精準定位哪些檔案佔用快取空間,驗證應用行為 (如備份掃描導致熱點資料被擠出)。**除非明確知道在做什麼,否則不要手動清理 Cache**;應關注 Available 記憶體是否充足,以及應用實際效能指標 (延遲、吞吐)。