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 命令輸出詳解、Buffers/Cache 機制與監控最佳實踐

編輯:Linux 教學

Linux 記憶體管理採用「主動緩存、被動回收」策略,導致 free 輸出的 used 极高 (常超 90%),誤以為記憶體不足。本文深度解析 free -m 三行數據含義、Buffers/Cache 區別、真實可用記憶體計算公式、/proc/meminfo 關鍵指標、監控告警閾值設定與常見誤區,助你建立正確的記憶體觀。

free -m 輸出三行數據全解析


$ free -m
                 total       used       free     shared    buffers     cached
Mem:            1002        769        232          0         62        421
-/+ buffers/cache:  286        715
Swap:           1153          0       1153

第一行 Mem:內核視角的物理記憶體分配

欄位含義本例數值
total物理記憶體總量1002 MB
used已分配給進程 + 內核緩存 (buffers + cached)769 MB
free完全空閒、未被任何頁框佔用232 MB
sharedtmpfs 佔用 (舊內核顯示 0,新內核顯示實際值)0 MB
buffersBlock Device 緩存 (元數據、目錄項、inode 表)62 MB
cachedPage Cache (文件頁面內容、mmap 文件、頁面緩存)421 MB

關係:total = used + free (1002 = 769 + 232)

第二行 -/+ buffers/cache:應用程序視角的真實可用記憶體

欄位計算公式含義本例數值
used (-buffers/cache)Mem.used - buffers - cached進程實際佔用的「匿名頁 + 堆/棧 + 共享內存」等不可回收內存286 MB
free (+buffers/cache)Mem.free + buffers + cached應用程序可申請到的記憶體上限 (含可回收緩存)715 MB

核心結論:真實記憶體壓力看第二行 used (286 MB),而非第一行 used (769 MB)。 只要 free (+buffers/cache) 充足且 Swap 不活躍,系統即健康。

第三行 Swap:交換分區使用情況

  • used = 0 表示無內存壓力觸發換頁。
  • 持續 Swap used > 10% total 或 si/so (vmstat) 頻繁非零,才意味著物理記憶體不足需擴容。

Buffers vs Cache:兩大緩存機制區別

維度Buffers (Buffer Cache)Cache (Page Cache)
緩存對象磁碟塊 (Block) - 元數據、目錄結構、inode、位圖文件頁面 (Page) - 文件內容、mmap 區域、可執行文件代碼段
典型場景文件系統掛載/卸載、目錄遍歷、inode 查找、Journal 寫入讀寫文件內容、執行程式碼、共享庫加載、mmap 數據庫
回收優先級較低 (元數據修改需同步回寫)較高 (唯讀頁面可直接丟棄,髒頁需回寫)
查看命令cat /proc/meminfo | grep -i buffercat /proc/meminfo | grep -i ^cached

/proc/meminfo 關鍵指標速查


MemTotal:        1026048 kB
MemFree:          237568 kB
MemAvailable:     732140 kB  # 核心指標:內核估算的可分配給新進程內存 (含可回收緩存、預留)
Buffers:           63484 kB
Cached:           431156 kB
SwapCached:            0 kB
Active:           312456 kB  # 近期活躍頁面
Inactive:         298764 kB  # 非活躍頁面 (優先回收)
Active(anon):     156780 kB
Inactive(anon):   145236 kB
Active(file):     155676 kB
Inactive(file):   153528 kB
Unevictable:           0 kB  # mlock/VM 鎖定不可回收
Mlocked:               0 kB
SwapTotal:       1180668 kB
SwapFree:        1180668 kB
Dirty:               124 kB  # 待回寫髒頁
Writeback:             0 kB
AnonPages:        289456 kB  # 匿名頁 (堆/棧/共享內存) - 真實進程佔用核心
Mapped:            45672 kB  # mmap 映射
Shmem:             12344 kB  # tmpfs/shared memory
Slab:              56784 kB  # 內核 Slab 分配器 (inode/dentry cache 等)
SReclaimable:      42312 kB  # Slab 中可回收部分
SUnreclaim:        14472 kB  # Slab 中不可回收
KernelStack:        2344 kB
PageTables:         5672 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1693692 kB  # 記憶體過度提交限制
Committed_AS:     567892 kB  # 當前提交總量
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
HugePageSize:       2048 kB
DirectMap4k:       4096 kB
DirectMap2M:     1044480 kB

黃金指標:MemAvailable (內核 3.14+ 提供) 最接近真實可用內存,監控告警應以此為準。

監控告警最佳實踐

指標健康閾值告警閾值嚴重閾值採集方式
MemAvailable / MemTotal> 30%< 20%< 10%node_exporter / free -m
Swap Used / Swap Total= 0%> 5%> 20%node_exporter / free -m
pgpgin/pgpgout (vmstat)低且平穩持續上升劇烈波動vmstat 1 / node_exporter
si/so (vmstat)0> 0 持續> 100/svmstat 1
Dirty / MemTotal< 5%> 10%> 20%/proc/meminfo
OOM Killer 事件0> 0> 0dmesg / journalctl -k

常見誤區避雷

  1. 誤區:「free 顯示 used 90%,內存不足了!」
    真相:看 -/+ buffers/cache 行的 free 或 MemAvailable。
  2. 誤區:「Swap 被使用就是內存不足。」
    真相:內核會主動換出長期不活躍匿名頁釋放 Page Cache,少量 Swap used 正常。
  3. 誤區:「清理 Cache 能提升性能。」
    真相:echo 3 > /proc/sys/vm/drop_caches 會導致後續讀取變慢,僅用於基準測試前重置。
  4. 誤區:「Java -Xmx 設多大,進程就佔多大。」
    真相:JVM 進程 RSS = Heap + Metaspace + CodeCache + ThreadStacks + DirectByteBuffer + JNI + GC 開銷,通常 1.5-2x Heap。

總結

Linux 記憶體管理的精髓在於 將空閒內存最大化利用為緩存 (Buffers/Cache),並在應用需要時毫秒級回收。正確讀懂 free、/proc/meminfo、vmstat,關注 MemAvailable、Swap 活躍度、OOM 事件,才能建立科學的容量規劃與告警體系,避免因誤讀指標導致不必要的擴容或業務中斷。

Copyright © Windows教程網 All Rights Reserved