當Elastic Compute Service執行個體實體記憶體不足時,配置Swap(交換空間)是一種經濟高效的應急方案。它利用磁碟空間作為虛擬記憶體,可以防止系統因偶發的記憶體峰值導致記憶體溢出(OOM)而崩潰,允許系統在實體記憶體耗盡時繼續平穩運行。
開啟swap分區可能會導致記憶體I/O效能下降。當ECS執行個體記憶體不足時,建議優先通過修改執行個體規格增加執行個體的實體記憶體。
對於普通雲端硬碟,不建議使用swap分區,因為其I/O效能較低,會導致效能下降和I/O瓶頸。其他類型雲端硬碟可根據實際情況使用swap分區,但應合理配置以避免頻繁的swap分區操作,確保系統效能和穩定性。
操作步驟
步驟一:檢查當前Swap狀態
在開始配置前,確認系統當前沒有已存在的Swap配置,避免衝突。
登入ECS執行個體。
訪問ECS控制台-執行個體。在頁面左側頂部,選擇目標資源所在的資源群組和地區。
進入目標執行個體詳情頁,單擊遠端連線,選擇通過Workbench遠端連線。根據頁面提示登入,進入終端頁面。
查看swap分區的配置。
swapon --show若回顯資訊為空白,表示系統未配置swap分區,可繼續下一步。
若出現類似以下回顯資訊,表示系統已存在swap分區,可根據需要關閉swap分區,或在其他磁碟上建立新的Swap。

步驟二:建立並設定Swap檔案
建立分頁檔。
以建立1 GiB大小的
/swapfile為例。推薦使用fallocate命令,它可以瞬間分配檔案空間,效率遠高於dd。# 建立一個1 GiB大小的分頁檔 sudo fallocate -l 1G /swapfile若檔案系統(如早期XFS)不支援
fallocate,系統會提示fallocate failed: Operation not supported。此時,請改用dd命令建立,但耗時會更長。sudo dd if=/dev/zero of=/swapfile bs=1M count=1024of的值/swapfile是變數,表示交換分區的標識,可自訂設定,該變數值不能和已有分區標識相同。bs和count的值表示建立的分頁檔的大小,可自訂設定,該命令中bs=1M count=1024表示設定分頁檔的大小為1 GB。
設定安全許可權。
防止非root使用者讀取可能包含敏感性資料(如記憶體中的密碼、密鑰)的分頁檔,將其使用權限設定為
600。sudo chmod 600 /swapfile將檔案格式化為swap分區,即將檔案標記為交換空間。
sudo mkswap /swapfile成功的回顯資訊類似:
Setting up swapspace version 1, size = 1 GiB (1073737728 bytes) no label, UUID=a1a7e24c-38f6-41a4-9e18-be60b631133a說明:建立的分頁檔大小至少需要大於40 KB,否則
mkswap命令會報錯。
步驟三:啟用Swap並驗證
啟用建立的Swap檔案,並確認系統已成功識別。
啟用swap。
sudo swapon /swapfile驗證Swap是否已開啟。
swapon --show成功啟用後,回顯如下:
NAME TYPE SIZE USED PRIO /swapfile file 1G 0B -2或者使用
free -h查看,Swap行應顯示總量。
步驟四:配置開機自動掛載(持久化)
將Swap配置寫入/etc/fstab檔案,確保執行個體重啟後Swap依然生效。
(推薦)備份
fstab檔案,以防誤操作。sudo cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d)將Swap配置追加到
fstab檔案。以下命令會先檢查是否存在重複條目,避免重複添加。
SWAP_FILE_PATH="/swapfile" if ! grep -q "swap" /etc/fstab; then echo "${SWAP_FILE_PATH} none swap sw 0 0" | sudo tee -a /etc/fstab else echo "Swap entry already exists in /etc/fstab. No changes made." fi驗證持久化配置。
無需重啟執行個體,即可驗證
/etc/fstab配置的正確性。# 1. 關閉所有Swap sudo swapoff -a # 2. 根據fstab內容重新掛載所有Swap sudo swapon -a # 3. 檢查Swap是否已按預期重新掛載 swapon --show如果命令能正確輸出Swap資訊,則證明持久化配置成功。
最佳化與管理
調整Swap使用傾向(swappiness)
swappiness是Linux核心參數,用於控制系統使用Swap的積極程度,取值範圍為0-100。
值越高:核心越傾向於使用Swap,儘早將不活躍的記憶體頁換出到磁碟。
值越低:核心越“懶惰”,傾向於將記憶體頁保留在實體記憶體中,直到實體記憶體嚴重不足時才使用Swap。
調整swap參數是一項需要謹慎操作的任務,不恰當的修改可能會導致系統效能下降或虛擬記憶體使用不符合預期,請根據實際業務情境並在充分瞭解參數作用的基礎上謹慎操作。如不確定是否需要調整,建議保持預設配置。
情境化建議:
應用情境 | 推薦 | 技術原理 |
資料庫 (MySQL, PostgreSQL) | 1-10 | 資料庫對I/O延遲敏感,應儘可能避免其核心緩衝池被換出到Swap,以保證查詢效能。 |
記憶體資料庫 (Redis, Memcached) | 1 | 記憶體資料庫對延遲極度敏感,任何Swap操作都可能嚴重影響效能。設為1表示僅在絕對必要時才使用Swap。 |
Web應用伺服器 (Nginx, Apache) | 10-60 | 在響應速度和記憶體利用率之間取得平衡,允許將非核心的、不活躍的進程頁換出。 |
預設/通用/批處理 | 60(系統預設值) | 適用於大多數通用情境,允許系統將非活躍的系統進程換出,為活動任務釋放更多實體記憶體。 |
修改方法:
編輯
/etc/sysctl.conf檔案,以實體記憶體少於10%時才使用swap分區為例,需要調整以下參數值。vm.swappiness=10儲存並退出,然後執行以下命令使配置生效。
sudo sysctl -p驗證
swappiness參數配置是否生效。cat /proc/sys/vm/swappiness如下回顯資訊表示
swappiness參數配置已生效。
監控Swap使用方式
監控目的 | 推薦命令 | 說明 |
查看總體記憶體和Swap使用量 |
| 最常用、最直觀的命令。 |
即時監控Swap活動(換入/換出) |
| 關注 |
找出正在使用Swap的進程 | `for file in /proc/*/status; do awk '/VmSwap | Name/{printf 2""2""3}END{ print ""}' $file; done | grep -v "0 kB" | sort -k 2 -n -r` |
歷史效能分析 |
|
|
關閉並清理Swap
在不再需要Swap時,安全地關閉並刪除相關檔案,釋放磁碟空間。
關閉指定的Swap檔案。
sudo swapoff /swapfile從
fstab中刪除自動掛載配置。 使用sed命令可以安全地刪除對應行,避免手動編輯出錯。sudo sed -i '\|/swapfile|d' /etc/fstab刪除分頁檔,釋放磁碟空間。
sudo rm /swapfile驗證Swap是否已完全關閉。
執行
swapon --show或free -h,確認Swap資訊已消失。
關閉swap分區
執行以下命令,關閉swap分區。
sudo swapoff /swapfile說明其中
/swapfile為swap分區標識,請您根據實際環境替換。編輯
etc/fstab檔案,並刪除類似以下的swap相關掛載資訊,取消swap自動掛載。/swapfile none swap defaults 0 0儲存並退出,然後執行以下命令,確認swap分區是否已經關閉。
swapon --show如果回顯資訊為空白,表示系統已關閉swap分區。

常見問題
Swap使用不符合預期如何解決?
完成Swap分區的建立和swappiness參數的調整後,可能會發現一個令人困惑的現象:即便實體記憶體壓力很大,Swap分區的使用率依然很低,似乎swappiness的設定沒有生效。
問題診斷
這個問題的根源在於現代Linux發行版廣泛使用的systemd和控制組(Cgroup)機制。
Cgroup的局部規則:在預設的Cgroup v1模式下,
systemd會為系統服務(system.slice)和使用者會話(user.slice)等建立獨立的Cgroup。每個Cgroup都可以擁有自己的資源控制參數,其中就包括memory.swappiness。局部覆蓋全域:
systemd在初始化這些Cgroup時,會給它們設定一個預設的memory.swappiness值(通常是60)。這個Cgroup內部的設定,其優先順序高於您在/etc/sysctl.conf中配置的全域vm.swappiness。結果:啟動並執行程式,實際上遵循的是其所在Cgroup的
swappiness規則,而不是全域規則,導致全域配置失效。
快速驗證
找一個正在啟動並執行進程的PID(例如,
pidof nginx)。查看該進程所屬的Cgroup:
cat /proc/[PID]/cgroup會看到類似
/system.slice/nginx.service的路徑。查看這個Cgroup實際的
swappiness值:cat /sys/fs/cgroup/memory/system.slice/nginx.service/memory.swappiness將很可能看到輸出是
60,即使已將全域vm.swappiness設為其他值,這就表明全域配置失效問題存在。
解決方案
方案一:切換到 Cgroup v2(推薦)
原理:Cgroup v2 修複了v1的諸多設計問題,採用統一的層級結構。在v2模式下,子Cgroup預設會繼承父節點的配置。只需配置全域的vm.swappiness,該設定就能自動、統一地應用到系統中的所有進程。
操作步驟:
更新核心啟動參數:
使用grubby工具,為所有核心添加systemd.unified_cgroup_hierarchy=1參數,以開啟Cgroup v2。sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1"說明:此命令是持久化的,它會修改GRUB引導配置,讓系統在下次啟動時以Cgroup v2模式初始化。
重啟ECS執行個體:
該設定為核心級參數,必須重啟才會生效。sudo reboot驗證與配置:
驗證:重啟後,執行
mount | grep cgroup,如果看到類型為cgroup2的掛載點,說明已成功切換到Cgroup v2。配置:在
/etc/sysctl.conf中設定期望的vm.swappiness值,並通過sudo sysctl -p使其對整個系統生效。
方案二:在 Cgroup v1 環境下持久化配置(替代方案)
如果環境由於特殊原因(例如,運行著不相容Cgroup v2的舊版容器軟體)無法切換,可以使用systemd的覆蓋配置(drop-in)來解決。
原理:不再依賴可能失效的全域配置,而是直接讓systemd在建立核心slice時就使用指定的swappiness值。
操作步驟:
為
system.slice建立覆蓋配置(影響所有系統服務):請將
60替換為期望的swappiness值。sudo mkdir -p /etc/systemd/system/system.slice.d/ sudo tee /etc/systemd/system/system.slice.d/99-swappiness.conf <<'EOF' [Slice] MemorySwappiness=60 EOF為
user.slice建立覆蓋配置(影響所有使用者登入工作階段)。請將
60替換為期望的swappiness值。sudo mkdir -p /etc/systemd/system/user.slice.d/ sudo tee /etc/systemd/system/user.slice.d/99-swappiness.conf <<'EOF' [Slice] MemorySwappiness=60 EOF重啟使配置生效。
sudo systemctl daemon-reload sudo rebootdaemon-reload僅使systemd重載配置。為了確保所有服務和會話都在新的Slice配置下被建立,需重啟伺服器。