文章目錄
- 內存介紹
- buff/cache 與匿名頁
- Swap(交換空間):內存的臨時倉庫
- 內存回收與Swap機制
- 內存頁的兩種類型
- 內核回收決策流程
- 如何解讀內存狀態
- drop_caches 參數說明
- 實踐操作
- 查看內存狀態
- 查看Swap狀態
- 釋放 buff/cache 緩存
內存介紹
當使用 free 命令:查看內存使用時,會出現:
參數 | 含義 |
---|---|
total | 內存總數 |
used | 已用內存 |
free | 空閑內存 |
shared | 共享內存 |
buff/cache | 緩存(buffer+cache) |
available | 可用內存 |
buff/cache 與匿名頁
Linux 內存頁分為兩類:
類型 | 體現位置 | 來源 | 回收方式 |
---|---|---|---|
文件頁 | buff/cache | 文件內容/元數據 | 丟棄/寫回文件,不進Swap |
匿名頁 | used-buff/cache | 程序堆/棧 | 寫入Swap |
- buff/cache:即文件頁(Page Cache + Buffer Cache)總和,用于加速文件和塊設備訪問。
- 匿名頁:程序運行時動態分配的內存(如堆、棧),不包含在buff/cache中,是Swap的主要來源。
自 Linux 2.4 起,Page Cache 和 Buffer Cache 已合并為統一的文件緩存系統。[
Swap(交換空間):內存的臨時倉庫
- 本質:一塊特殊的磁盤空間(分區或文件),作為物理內存耗盡時的緊急備用。
- 作用:當物理內存不足時,內核會把內存中不活躍的"匿名頁"(見下文)暫時寫入 Swap,從而釋放物理內存給更需要的進程。
- 代價:硬盤讀寫速度遠慢于內存。頻繁使用 Swap 會導致系統性能急劇下降(卡頓),這個現象稱為"顛簸"(Thrashing)。
內存回收與Swap機制
內存頁的兩種類型
程序占用的內存可分為兩類,內核對它們有不同的回收策略:
-
文件頁 (File-backed Pages)
- 內容:程序代碼、讀取的文件等,即 Page Cache 的主要組成部分。
- 特點:在硬盤上有對應的源文件(“老家”)。
- 回收方式:內存不足時,干凈頁直接丟棄(下次從源文件讀回),臟頁(修改過)先寫回源文件再丟棄。這類內存不會進入 Swap。
-
匿名頁 (Anonymous Pages)
- 內容:程序的堆、棧等動態分配的內存(如
malloc
或new
申請的)。 - 特點:在硬盤上沒有源文件(憑空創造)。
- 回收方式:內存不足時,如果這部分內存不活躍,內核會將其寫入 Swap 分區,這是它們唯一的"臨時避難所"。
- 內容:程序的堆、棧等動態分配的內存(如
內核回收決策流程
當內存緊張時,內核會遵循以下優先級進行回收:
- 首先,回收文件頁 (Page Cache):這是成本最低的操作,優先回收。
- 最后,交換匿名頁 (Swap Out):只有在回收文件頁后內存仍然不足的情況下,才會把不活躍的匿名頁寫入 Swap。
如何解讀內存狀態
buff/cache
占用高:通常是好事。表明 Linux 正在充分利用空閑內存加速文件讀寫,系統會在需要時自動回收。swap
被使用:是一個警示信號。表明物理內存不足以容納所有活躍程序的匿名內存,需要關注應用是否存在內存泄漏或配置不當。buff/cache
高 +swap
被使用:典型應用內存占用過度的表現。
drop_caches 參數說明
- 手動釋放緩存可用于臨時解決問題或測試,但生產環境慎用,它可能掩蓋真正的內存問題。
- /proc/sys/vm/drop_caches 文件用于手動釋放緩存:
- 0:默認,自動管理
- 1:釋放頁緩存(page cache)
- 2:釋放目錄項和 inode
- 3:釋放所有緩存
提示: 釋放緩存前建議先執行
sync
,確保數據寫入磁盤。
實踐操作
查看內存狀態
# 以 MB 單位顯示內存使用情況
free -m
查看Swap狀態
# 查看當前啟用的swap空間(分區或文件)
swapon -s
釋放 buff/cache 緩存
# 查看當前內存狀態
free -m# 同步緩存到磁盤
sync# 只釋放頁緩存
echo 1 > /proc/sys/vm/drop_caches
# 釋放目錄項和 inode
echo 2 > /proc/sys/vm/drop_caches
# 釋放所有緩存(常用)
echo 3 > /proc/sys/vm/drop_caches
# 恢復為自動管理
echo 0 > /proc/sys/vm/drop_caches
風險提示: 生產環境不建議頻繁手動釋放緩存,頻繁清理可能掩蓋應用層內存問題,建議優先優化應用程序內存管理。