Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 記憶體管理精要:徹底搞懂 free、/proc/meminfo 與緩存機制

編輯:Linux 教學

為什麼 free 顯示的 free 記憶體總是很少?

初次使用 free 的運維常會驚訝:「我的記憶體快用光了!」實則不然。Linux 採用「記憶體不用白不用」的積極緩存策略:將閒置記憶體主動用作 Buffer(塊設備緩存) 與 Cache(頁面緩存/目錄項緩存),以加速檔案讀寫。這部分記憶體在應用程式需要時可毫秒級回收,實質上屬於「可用記憶體」。

核心指標解讀:free 輸出三行的真實含義

              total        used        free      shared  buff/cache   available
Mem:         3266180     3250004       16176           0      2778884      2795064
Swap:        2048276       80160     1968116
行視角used 含義free/available 含義
第 1 行 (Mem) 作業系統核心視角 核心已分配給進程 + 核心內部結構 + Buffer + Cache 完全未被觸碰的物理頁框數
第 2 行 (-/+ buffers/cache) 應用程式視角(最關鍵) 進程實際佔用的物理記憶體(不含可回收緩存) 真正可供新進程分配的記憶體 = free + buffers + cached
第 3 行 (Swap) 交換分區視角 已換出到磁碟的匿名頁面 剩餘交換空間

公式驗證:
available (2795064) = free (16176) + buffers (110652) + cached (2668236)
used (471116) = total (3266180) - available (2795064)

進階監控:/proc/meminfo 關鍵欄位詳解

欄位含義運維關注點
MemTotal物理記憶體總量容量規劃基準
MemFree未分配頁框(對應 free 第 1 行 free)過低觸發 kswapd 回收
Buffers塊設備元資料緩存(inode、目錄項等)通常較小,幾十 MB
Cached頁面緩存(檔案內容、mmap 映射)主要記憶體消費者,可積極回收
SwapCached已換出但仍在記憶體中的頁面非零表示曾發生換入
Active / Inactive活躍/非活躍頁面(LRU 列表分類)Inactive 為首選回收目標
Dirty待寫回磁碟的髒頁面大量堆積時觸發 pdflush/kworker 寫回
Writeback正在寫回磁碟的頁面持續高值暗示 I/O 瓶頸
Mappedmmap 映射的記憶體(含共享庫)大型進程記憶體佔用參考
Slab核心 Slab 分配器佔用(inode、dentry 等)持續增長可能洩漏
Committed_AS核心承諾分配的虛擬記憶體總量超過 CommitLimit 觸發 OOM Killer
VmallocTotal/Used/Chunk核心虛擬地址空間(vmalloc 區)使用情況模組載入、大記憶體分配相關
HugePages_*大頁面(HugeTLB)統計資料庫、Java Heap 優化關鍵

何時會觸發 Swap?

當 可用記憶體(available)低於水位線 時,核心喚醒 kswapd 執行頁面回收:

  1. 優先回收 Clean Page(乾淨頁):直接丟棄 Cache/Buffer,無需寫磁碟。
  2. 次之回收 Dirty Page(髒頁):觸發寫回磁碟(writeback),延遲較大。
  3. 最後回收 Anonymous Page(匿名頁):寫入 Swap 分區,代價最高。

水位線可透過 /proc/sys/vm/min_free_kbytes(預設約總記憶體 1~3%)間接調整,或直接修改 vm.swappiness(0~100,預設 60)控制 Swap 激進程度。

進程級記憶體分析:/proc/PID/ 實戰

  • /proc/PID/status:人類可讀摘要,含 VmRSS(常駐集大小)、VmSize(虛擬地址空間)、VmSwap(換出大小)。
  • /proc/PID/smaps:每個 VMA 區域的詳細 RSS/PSS/Dirty/Referenced/AnonHugePages 統計,定位記憶體洩漏、透明大頁效果的利器。
  • /proc/PID/smaps_rollup(Kernel 4.1+):smaps 聚合版,快速獲取進程級 PSS/RSS/Swap。

常用指令速查表

指令用途推薦參數
free快速概覽-h(人類可讀)、-w(分欄 buffers/cache)、-s 1(每秒刷新)
vmstat系統級記憶體/CPU/IO 綜合1 10(每秒採樣 10 次)、-a(顯示 active/inactive)
pidstat進程級記憶體/CPU/I/O-r 1(記憶體)、-u 1(CPU)、-d 1(I/O)
smem基於 PSS 的真實記憶體佔用報表-tk(樹狀+KB)、-p nginx(按進程名過濾)
numastatNUMA 節點記憶體分佈-m(顯示每節點 meminfo)、-p PID

總結

Linux 記憶體管理的核心哲學是「積極緩存、按需回收」。運維不應盯著 free 第一行的 free 值發愁,而應關注 available(可用記憶體)、Swap 活動頻率、Dirty 頁面堆積 以及 進程級 RSS/PSS 趨勢。掌握 /proc/meminfo 與 /proc/PID/smaps 的讀法,才能在記憶體壓力、OOM Killer、效能抖動等疑難雜症中游刃有餘。

Copyright © Windows教程網 All Rights Reserved