Contents

Raspberry Pi 調整 swap 虛擬記憶體

Raspberry Pi 預設的 Swap 空間只有 100MB,在跑 Prometheus、Transmission 等較吃資源的服務時,記憶體加 Swap 加起來仍然不夠,容易導致服務被系統強制終止(OOM Kill)。本文說明如何調整 Swap 大小,並了解相關的注意事項。

為何需要調整 Swap

Swap(交換空間)是一種虛擬記憶體機制,當實體 RAM 不足時,作業系統會把部分記憶體內容搬移到 Swap 區,騰出空間給當前執行的程式。

Raspberry Pi 各型號的 RAM:

型號 RAM
Pi Zero / Zero 2 512MB
Pi 3B / 3B+ 1GB
Pi 4B 2GB / 4GB / 8GB

問題:Raspberry Pi OS 預設只設定 100MB Swap,對於需要長時間執行服務的情境遠遠不夠。

查看目前 Swap 使用情況

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 查看記憶體與 Swap 使用狀況(-h 顯示人類可讀格式)
free -h

# 輸出範例:
#               total        used        free      shared  buff/cache   available
# Mem:          927Mi       512Mi        85Mi        12Mi       329Mi       351Mi
# Swap:          99Mi        99Mi         0.0Ki

# 查看 Swap 詳細資訊
swapon -s

# 或用 cat 直接查看
cat /proc/swaps

調整 Swap 大小的步驟

Raspberry Pi OS 使用 dphys-swapfile 管理 Swap,設定檔在 /etc/dphys-swapfile

步驟一:編輯設定檔

1
sudo nano /etc/dphys-swapfile

找到 CONF_SWAPSIZE 這行,修改為想要的大小(單位:MB):

1
2
3
4
5
6
7
8
# 預設值(100MB,通常不夠用)
# CONF_SWAPSIZE=100

# 改為 512MB
CONF_SWAPSIZE=512

# 或改為 1024MB(1GB)
# CONF_SWAPSIZE=1024

也可以改用 CONF_SWAPFACTOR,讓 Swap 自動設定為 RAM 的倍數:

1
2
3
4
# 設定 Swap = RAM × 2(例如 RAM 1GB → Swap 2GB)
CONF_SWAPFACTOR=2

# 注意:使用 CONF_SWAPFACTOR 時需要先將 CONF_SWAPSIZE 這行注解掉

步驟二:重新啟動 dphys-swapfile 服務

1
2
3
4
5
6
# 停止並重新建立 Swap
sudo service dphys-swapfile stop
sudo service dphys-swapfile start

# 或直接 restart(會自動重建 swap file)
sudo service dphys-swapfile restart

步驟三:確認設定生效

1
2
free -h
# Swap 那行應該顯示新的大小

Swap 過大的缺點

雖然增加 Swap 可以避免 OOM 問題,但也有副作用:

  1. SD Card 壽命減少:Swap 會頻繁讀寫 SD Card,而 SD Card 的寫入次數(P/E 次數)有限,過度使用會加速老化。
  2. 效能低落:Swap 的速度遠低於 RAM,頻繁 Swap 會讓系統反應變慢。
  3. 掩蓋真正問題:Swap 用盡不代表 Swap 不夠,有時是記憶體洩漏(Memory Leak)的症狀。

建議

  • 一般情況設定 512MB 到 1GB 即可
  • 若 Swap 長期接近滿載,應考慮使用 USB SSD 取代 SD Card,或升級到更高 RAM 的型號
  • 可將 Swap 設定到 USB 外接儲存裝置上,延長 SD Card 壽命

監控 Swap 使用情況

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 即時監控
watch -n 5 free -h

# 查看哪些程式佔用最多記憶體
ps aux --sort=-%mem | head -10

# 查看 Swap 使用量(分程序)
for file in /proc/*/status; do
  awk '/VmSwap|Name/{printf $2 " " $3 "\n"}' $file 2>/dev/null
done | sort -k2 -n -r | head -10

參考資料