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 記憶體管理深度解析:虛擬記憶體、glibc 配置器、頁面回收與效能調校

編輯:Linux 教學

核心架構:兩級記憶體管理

  • 線性區(虛擬記憶體):進程看到的連續位址空間(如 0x00c73000-0x00c88000),不佔用實體頁框。
  • 實體頁框:真實的 RAM 頁面(通常 4 KB),由核心頁面分配器管理。

核心採用 延遲分配:malloc() 僅在虛擬位址空間預留區域(VMA),實際 Page Fault 觸發時才分配實體頁框。

程式碼視角的記憶體生命週期

char *p = malloc(2048);   // 僅建立 VMA,無實體頁框
strcpy(p, "123");         // 觸發 Page Fault,分配 1 個頁框(4 KB),填入內容
free(p);                  // 釋放 VMA,核心回收對應實體頁框

系統呼叫層級

  • brk/sbrk:調整堆疊頂端(heap top),擴展/縮減資料段。
  • mmap/munmap:建立/移除獨立映射區(大塊記憶體、共享庫、檔案映射)。
  • 進程僅操作虛擬位址,實體記憶體管理對進程完全透明。

glibc 記憶體配置器

批發與零售模型

  • 向核心「批發」大塊虛擬記憶體(mmap 或 sbrk)。
  • 進程 malloc/free 為「零售」,從配置器免費列表切分/合併區塊。
  • 減少系統呼叫開銷,提升配置效率。

大小分流策略

請求大小後端系統呼叫特性
< 128 KB (可調 M_MMAP_THRESHOLD)brk/sbrk堆疊連續增長,易產生碎片
≥ 128 KBmmap獨立映射區,無碎片,釋放即歸還核心

記憶體碎片與釋放困境

堆疊頂端若有活躍配置,下方釋放的大量空閒區塊 無法歸還核心(brk 僅能下調堆疊頂端)。此為「記憶體空洞」問題,長期運行的 Daemon 需注意。

Chunk 中繼資料

struct chunk {
    size_t size;   // 區塊大小(含中繼資料)
    // ... flags, fd, bk 等
};
// 使用者指標 p 指向 chunk 之後的資料區
// free(p) 時:chunk = p - sizeof(size_t) 即可取得大小

最小配置單位 16 bytes(含中繼資料),對齊需求。

glibc 除錯與偵測工具

  • Hook 機制:__malloc_hook、__free_hook、__malloc_initialize_hook 注入自訂邏輯。
  • 統計資訊:mallinfo() 回傳 struct mallinfo(arena、ordblks、uordblks、fordblks 等)。
  • mtrace:環境變數 MALLOC_TRACE=file.log,程式呼叫 mtrace() 記錄所有配置/釋放,事後用 mtrace (Perl 腳本) 分析洩漏。

程式碼段與動態連結庫記憶體

  • ELF 執行檔分 代碼段 (RX) 與 資料段 (RW)。
  • loader 以 mmap 映射,按需分頁 載入實體頁框。
  • 共享庫(.so)在系統中 單一實體副本,多進程共享代碼段頁框(Copy-on-Write 處理資料段)。
  • dlopen/dlclose 可動態載入/卸載庫,釋放實體頁框(靜態連結則常駐)。

記憶體使用量測量與解讀

/proc 指標

# 系統整體
cat /proc/meminfo

# 單一進程 (PID)
cat /proc//status   # VmSize, VmRSS, VmData, VmStk, VmExe, VmLib
cat /proc//statm    # 頁數統計:Size, Resident, Share, Text, Lib, Data, DT
cat /proc//maps     # 完整虛擬位址映射表

free 指令解讀關鍵

              total  used  free  shared buff/cache available
Mem:          1023M  926M  97M     0    134M      735M
Swap:         1959M   89M 1870M
  • available = free + buffers + cached - 低水位保留,為真正可分配給新進程的記憶體。
  • buff/cache 可隨時回收,不等於洩漏。

進程記憶體評估陷阱

  • VmRSS 包含共享庫頁框,多進程重複計算。
  • PSS (Proportional Set Size) 將共享頁框按比例分攤,較精準(smem、ps -eo pid,ppid,cmd,pss)。
  • 子進程 fork() 後 Copy-on-Write,初期 RSS 幾乎相同,寫入才分離。

核心參數調校(/proc/sys/vm/)

參數預設建議調整場景
swappiness60資料庫/低延遲服務 → 1~10(減少 Swap)
vfs_cache_pressure100大量檔案操作 → 50~200(加速 inode/dentry 回收)
min_free_kbytes依 RAM預留緊急頁框,防 OOM killer 誤殺
overcommit_memory0 (heuristic)2 (strict) + overcommit_ratio 嚴格控制超配
nr_hugepages0資料庫/虛擬化 → 設定 HugePages 減少 TLB Miss

常見問題診斷流程

  1. 記憶體耗盡:dmesg | grep -i oom → 找出被殺進程 → 分析 /proc//smaps 定位洩漏區塊。
  2. 效能抖動:vmstat 1 觀察 si/so、wa、pgfault → 判斷是否頻繁 Swap/主要缺頁。
  3. 進程 RSS 持續增長:pmap -x 觀察匿名映射增長 → 搭配 gdb 或 valgrind 定位代碼路徑。

總結

Linux 記憶體管理以「虛擬位址空間 + 延遲分配 + 頁面回收」為核心。glibc 配置器以批發/零售模型降低系統呼叫開銷,但引入碎片與空洞問題。理解 VmRSS/PSS/available 等指標真實含義,善用 /proc、vmstat、valgrind、mtrace 工具鏈,配合核心參數調校,才能在高併發、長期運行的生產環境中駕馭記憶體,避免 OOM 與效能抖動。

Copyright © Windows教程網 All Rights Reserved