服务器设置和教程 · 1 8 月, 2025

Linux記憶體的動態申請與釋放

引言

本文旨在探討Linux記憶體管理的核心機制,並結合香港伺服器的實際應用場景,分析如何優化記憶體使用。香港作為亞太地區的重要互聯網樞紐,其伺服器需處理高負載和高併發請求,記憶體管理的優化對效能與穩定性至關重要。


1. Linux記憶體分配基礎:夥伴系統 (Buddy System)

  • Linux 使用 夥伴系統 管理實體記憶體。

  • 系統將記憶體劃分為不同大小的塊(通常以 4KB 為單位),透過 合併與分割 滿足記憶體請求。

    • 範例: 申請 8KB 記憶體時,系統可能從 16KB 塊中分割出所需部分。

  • 研究顯示:

    • 該方法在管理記憶體碎片上有效。

    • 但較大粒度可能導致浪費,尤其在小記憶體分配頻繁的場景。

  • 香港伺服器視角:

    • 理解夥伴系統有助於管理員監控與優化記憶體使用。

    • 高負載下,伺服器頻繁分配/釋放記憶體,夥伴系統效率直接影響效能。

    • 應用場景: Web 伺服器處理大量短暫連線時,記憶體分配延遲可能導致回應時間延長。


2. 核心空間的記憶體分配:Slab 分配器

  • 解決問題: 核心空間的小記憶體分配(如 8 位元組)非常常見,直接使用夥伴系統效率低下。

  • 機制: Slab 分配器將記憶體劃分為 快取區,每個快取區對應特定資料結構或大小範圍(如 kmalloc-32 用於 32 位元組分配)。

  • 三種實現: slabslubslob,分別針對不同場景優化。

  • 證據顯示: Slab 分配器顯著提升小記憶體分配效率。

  • 香港伺服器視角:

    • 核心小記憶體分配直接影響整體效能,尤其在處理高併發請求時。

    • 應用場景: 網路伺服器每個連線可能需分配小記憶體塊,高效的 Slab 分配器能減少開銷,提升回應速度。

  • 與夥伴系統的關係:

    • Slab 從夥伴系統獲取大塊記憶體(如 4KB),再切割為小塊管理。

    • 兩者在演算法上是平等的,Slab 作為 二級管理器,專注於小記憶體分配。


3. 核心記憶體申請函式:kmalloc vs. vmalloc

特性kmallocvmalloc
記憶體連續性實體位址連續虛擬位址連續,實體位址可能不連續
典型大小小塊(數百位元組 ~ 數千位元組)大塊(數 MB 以上)
映射狀態分配後已映射,無需額外頁表操作分配後設定頁表映射
適用區域適合低端記憶體區適合高端記憶體區
  • 伺服器視角:

    • 選擇合適方法至關重要。

    • 應用場景:

      • Web 伺服器需大量小塊記憶體 → kmalloc 更高效。

      • 資料庫伺服器處理大塊資料 → vmalloc 更適合。

    • 管理員需根據應用需求,權衡效能與記憶體連續性。


4. 使用者空間的記憶體分配:malloc 與惰性分配 (Lazy Allocation)

  • 機制:

    1. 使用者空間透過 malloc 申請記憶體。

    2. Linux 採用 惰性分配malloc 成功時僅分配虛擬位址空間不立即分配實體記憶體。

    3. 實際存取記憶體時觸發頁錯誤 (Page Fault)

    4. 核心才分配實體記憶體頁面。

  • 研究顯示: 此機制提高記憶體利用率,尤其在記憶體緊張時。

  • 伺服器視角:

    • 此機制非常實用,允許伺服器快速分配大量記憶體而不立即佔用資源。

    • 應用場景: 服務啟動時宣告分配 100MB,實際使用時才分配實體頁面,非常適合高併發場景。


5. Linux 伺服器記憶體快取管理

  • 挑戰: 快取是提升效能的重要機制,但過多快取可能佔用記憶體,影響效能。

  • 常見快取清理方法:

    • 📁 清理頁面快取、目錄項快取與 inode 快取:

      bash
      sudo sync; echo 3 > /proc/sys/vm/drop_caches

      (先同步磁碟資料再釋放快取)

    • 📊 監控記憶體使用: 使用 htop 或 top 工具,即時檢視記憶體佔用,識別高記憶體行程。

    • ⚙️ 調整應用快取設定: 如 Apache、Nginx 的快取策略,控制快取大小與過期時間。

    • 💾 資料庫優化: 調整 MySQL 的 innodb_buffer_pool_size 或 PostgreSQL 快取參數。

  • 記憶體優化方法:

    • 🖥️ 增加實體記憶體: 若頻繁使用 swap,考慮硬體升級。

    • ⚙️ 調整記憶體頁面快取策略: 修改 vm.swappiness 參數(例如設為 10)以減少交換操作。

    • 🧩 記憶體分配優化: 使用記憶體池 (Memory Pool) 技術減少碎片,避免頻繁 malloc/free

    • 🔍 記憶體洩漏監控: 使用 valgrind 或 heaptrack 檢測並修復記憶體洩漏。

  • 伺服器視角:

    • 處理高負載與高併發請求時,優化記憶體使用可顯著提升效能與穩定性。

    • 上述方法在此類環境中尤為重要。


6. 記憶體不足時的處理:OOM 機制

  • 機制: 當記憶體嚴重不足時,Linux 核心啟動 OOM Killer (Out-Of-Memory Killer)

  • 運作方式: 根據行程的記憶體使用量和優先順序計算 OOM 評分評分越高的行程越優先被終止以釋放資源。

  • 管理介入: 管理員可透過調整 /proc/<pid>/oom_score_adj 的值來保護關鍵行程(設定為負值)或標記優先終止的行程(設定為正值)。

  • 伺服器視角:

    • 管理 OOM 機制至關重要,因伺服器通常執行多個關鍵服務。

    • 終止重要行程可能導致服務中斷甚至系統癱瘓。

    • 應用場景: 若 Web 服務行程被意外終止,將中斷使用者存取;需調整設定確保關鍵服務穩定性。


結論

綜上所述,Linux 記憶體管理機制涵蓋廣泛,從底層的 夥伴系統 到專精小記憶體的 Slab 分配器,從核心的 kmalloc/vmalloc 到使用者空間的 惰性分配,再到緊急情況的 OOM 機制。結合 香港伺服器 面對高負載、高併發的特性,優化記憶體使用需著重於:

  • 快取管理策略

  • 記憶體分配方法選擇

  • OOM 機制調整

透過合理配置與優化,管理員能最大化利用有限資源,為使用者提供高效且穩定的服務。