當系統物理記憶體不足時,核心會將較少使用的記憶體頁面交換至 Swap 分區或檔案。若 Swap 使用率長期維持 100%,會嚴重拖慢系統效能,甚至導致服務中斷。本文說明如何定位佔用 Swap 的進程,並提供釋放或永久解決的策略。
top
# 或
free -h
# 觀察 Swap 欄位:used 100%、free 0
核心會為每個進程在 /proc/<PID>/ 目錄下建立資訊檔。/proc/<PID>/status 中的 VmSwap 欄位即為該進程使用的 Swap 大小(單位 kB)。
以下腳本遍歷所有數字命名的 /proc 子目錄,計算並依 Swap 使用量排序,列出佔用超過 1 MB 的進程:
#!/bin/bash
# find_swap_hogs.sh
for pid in /proc/[0-9]*; do
pid=${pid#/proc/}
# 排除 PID 1 (init)
[ "$pid" -eq 1 ] && continue
swap_kb=$(awk '/VmSwap:/ {print $2}' "/proc/$pid/status" 2>/dev/null)
[ -n "$swap_kb" ] && [ "$swap_kb" -gt 1024 ] && echo "$swap_kb $pid"
done | sort -rn | head -20
執行後可獲得類似輸出:
204800 1234 # 進程 1234 佔用 200 MB Swap
153600 5678
...
systemctl restart <service>。進程重啟後 Swap 佔用歸零。kill -TERM <PID> # 先嘗試正常終止
kill -KILL <PID> # 強制終止
sysctl -w vm.swappiness=10/etc/sysctl.d/99-swap.conf 加入 vm.swappiness=10(預設 60,值越低越傾向保留在實體記憶體)。# 建立 4G Swap 檔案
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 加入 /etc/fstab 永久掛載
echo '/swapfile none swap sw 0 0' >> /etc/fstab



透過腳本快速定位問題進程,配合調整 Swappiness 與擴充 Swap 空間,即可有效解決 Swap 耗盡導致的效能瓶頸。
ls -lih 解讀 Linux 檔案屬性完整指南:inode、類型、權限、連結數、擁有者、時間戳
Linux mydumper 報錯 libmysqlclient_16 not defined 解決:LD_LIBRARY_PATH 引入 MySQL 函式庫路徑
Linux 查看當前 Shell 的 7 種方法:$SHELL、$0、ps、/etc/passwd、echo $$ 等
Linux 誤刪 root 使用者?用安裝光碟救援模式恢復 root 帳號與密碼
Linux 文件權限保護實戰:chmod 600 與 chattr +i 不可變屬性雙重防線
Linux SSH 連線逾時自動斷開?教你輕鬆設定保持長連線