Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux Swap 交換空間耗盡問題診斷與解決方案

編輯:關於 Linux

當系統物理記憶體不足時,核心會將較少使用的記憶體頁面交換至 Swap 分區或檔案。若 Swap 使用率長期維持 100%,會嚴重拖慢系統效能,甚至導致服務中斷。本文說明如何定位佔用 Swap 的進程,並提供釋放或永久解決的策略。

一、確認 Swap 耗盡狀況

top
# 或
free -h
# 觀察 Swap 欄位:used 100%、free 0

二、找出佔用大量 Swap 的進程

核心會為每個進程在 /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
...

三、釋放 Swap 的策略

  1. 重啟服務/進程(推薦)
    針對佔用大戶(如 Java 應用、資料庫、快取服務),嘗試優雅重啟:systemctl restart <service>。進程重啟後 Swap 佔用歸零。
  2. 強制終止進程(最後手段)
    若服務無法重啟且系統岌岌可危:
    kill -TERM <PID>   # 先嘗試正常終止
    kill -KILL <PID>   # 強制終止
  3. 調整 Swappiness 降低 Swap 傾向
    暫時生效:sysctl -w vm.swappiness=10
    永久生效:編輯 /etc/sysctl.d/99-swap.conf 加入 vm.swappiness=10(預設 60,值越低越傾向保留在實體記憶體)。
  4. 增加 Swap 空間(治本)
    若記憶體確實不足,建議新增 Swap 檔案或擴充 Swap 分區:
    # 建立 4G Swap 檔案
    fallocate -l 4G /swapfile
    chmod 600 /swapfile
    mkswap /swapfile
    swapon /swapfile
    # 加入 /etc/fstab 永久掛載
    echo '/swapfile none swap sw 0 0' >> /etc/fstab
  5. 升級實體記憶體
    最徹底的解決方式。

Swap 使用率 100% 示意圖

/proc 目錄結構示意圖

腳本輸出示例

透過腳本快速定位問題進程,配合調整 Swappiness 與擴充 Swap 空間,即可有效解決 Swap 耗盡導致的效能瓶頸。

Copyright © Windows教程網 All Rights Reserved