## 引言
在 Linux 系統中,記憶體管理是系統效能調校的核心環節。無論是運行於香港伺服器的高負載應用,還是輕量級嵌入式設備,**記憶體與磁碟間的分頁交換機制**都至關重要。本教學將從三大面向深入解析:
1. 分頁類型
2. 交換行為
3. 快取機制
幫助開發者優化香港伺服器上的應用程式效能。
—
## 一、分頁類型與記憶體分配
Linux 將記憶體分頁分為兩大類別:
### 1. 檔案背景分頁(File-backed Pages)
| 特性 | 說明 |
|———————|———————————————————————-|
| **關聯對象** | 直接關聯磁碟檔案(如:可執行檔程式碼、透過 `read/write` 或 `mmap` 操作的文件) |
| **儲存位置** | 存放於 **頁面快取(Page Cache)** 中 |
| **記憶體釋放機制** | 記憶體不足時,內容直接寫回對應磁碟檔案 |
| **核心作用** | 作為記憶體與磁碟間的緩衝區 |
### 2. 匿名分頁(Anonymous Pages)
| 特性 | 說明 |
|———————|———————————————————————-|
| **關聯對象** | 無對應磁碟檔案(如:行程的堆積 Heap、堆疊 Stack、寫入時複製 CoW 後的資料段) |
| **記憶體釋放機制** | 記憶體不足時,交換至 **Swap 分割區** 或 **Swap 檔案** |
| **伺服器應用** | 合理配置 Swap 可緩解記憶體壓力,提升系統穩定性 |
—
## 二、檔案讀寫與頁面快取的交互
Linux 透過兩種機制處理檔案 I/O,均依賴頁面快取:
### ▶️ read/write 方式
“`mermaid
graph LR
A[應用程式呼叫 read] –> B[檔案載入頁面快取]
B –> C[資料複製到使用者空間緩衝區]
D[應用程式呼叫 write] –> E[資料寫入頁面快取]
E –> F[異步同步至磁碟]
“`
– **優勢**:減少直接磁碟 I/O
– **適用場景**:資料庫、Web 應用等伺服器常見負載
### ▶️ mmap 方式
“`mermaid
graph LR
A[檔案映射至行程虛擬位址空間] –> B[應用程式直接操作記憶體]
B –> C[頁面快取維護記憶體-磁碟映射]
“`
– **核心優勢**:避免核心與使用者空間的資料複製
– **高效場景**:香港伺服器上的即時資料處理應用
—
## 三、分頁交換與效能調校
當記憶體不足時,Linux 啟動分頁交換機制(Swapping):
### 1. 分頁替換與 LRU 演算法
– **決策機制**:採用 **最近最少使用(LRU)** 演算法評估分頁使用頻率
– **交換規則**:
– 檔案背景分頁 → 寫回原始檔案
– 匿名分頁 → 寫入 Swap 空間
– **調校參數**:
“`bash
# 調整匿名分頁與檔案分頁回收優先級(預設值=60)
echo 10 > /proc/sys/vm/swappiness # 降低值優先回收頁面快取
“`
### 2. Swap 空間類型對比
| 類型 | 運作原理 | 適用場景 | 效能影響 |
|————–|———————————-|—————————–|——————|
| **Swap 分割區** | 匿名分頁寫入磁碟專用空間 | 通用伺服器環境 | 磁碟 I/O 有延遲 |
| **zRAM** | 在記憶體建立壓縮交換空間 | 嵌入式系統/記憶體受限的伺服器 | 減少磁碟 I/O 提升效能 |
### 3. 頁面快取效能實證
“`bash
# 實驗步驟:比較快取清除前後的執行效能
echo 3 > /proc/sys/vm/drop_caches # 清除頁面快取
time python hello.py # 首次執行(無快取)
time python hello.py # 二次執行(有快取)
“`
– **結果對比**:
– 首次執行:高 I/O 開銷,耗時長(需從磁碟載入)
– 二次執行:低 I/O 開銷,耗時短(直接存取快取)
—
## 四、記憶體監控與調校策略
### ▶️ 監控指令範例
“`bash
$ free -h
total used free shared buff/cache available
Mem: 48G 1.6G 46G 140M 640M 46G
Swap: 4.0G 0B 4.0G
“`
### ▶️ 關鍵指標解析
| 欄位 | 技術說明 |
|—————|————————————————————————–|
| **buff/cache** | 包含頁面快取(檔案系統加速)與緩衝區(裸分割區存取加速) |
| **available** | 應用程式實際可用記憶體(含可回收快取),比 free 欄位更具參考價值 |
> **伺服器運維建議**:高併發場景需定期監控,避免分頁交換造成的效能瓶頸
—
## 五、實戰案例:Web 伺服器效能調校
### 問題情境
頻繁分頁交換導致 Web 伺服器回應延遲
### 優化三部曲
1. **診斷記憶體分佈**
“`bash
pidof nginx # 查詢行程 ID
cat /proc/<PID>/smaps | grep -i swap # 分析匿名分頁佔比
“`
2. **調整 swappiness**
“`bash
# 降低匿名分頁交換優先級(適合 I/O 密集型應用)
sysctl vm.swappiness=10
“`
3. **啟用 zRAM 加速**
“`bash
# 啟用記憶體壓縮交換(依發行版指令配置)
modprobe zram
zramctl –find –size 2048M
“`
總結:關鍵效能優化原則
理解檔案背景分頁與匿名分頁交換差異
根據應用類型選擇
read/write或mmapI/O 模式透過
swappiness微調分頁回收策略記憶體受限時啟用 zRAM 降低 I/O 延遲
定期監控
available記憶體指標