跳到主內容

【Linux】swap相關

image-1766024226901.png

從你貼的 top 看起來 Swap 使用率偏高KiB Swap: 79.8/1044476 很像是 79.8% / 1,044,476 KiB),要「釋放 swap」本質上就是把已經換到 swap 的頁面搬回 RAM。最直接的方法是 swapoff → swapon(會短暫吃 RAM、可能卡頓一下)。

1) 先確認 RAM 夠不夠(很重要)

free -h
swapon --show

available(可用記憶體)要 大於目前 swap 已用量(最好再多留一些 buffer),不然 swapoff 可能 OOM 或把機器拖很慢。

2) 一次清空 swap(常用)

sudo swapoff -a
sudo swapon -a

清完再確認:

free -h
swapon --show

若你是 swapfile(例如 /swap.img/swapfile),也可只針對單一檔案:

sudo swapoff /swap.img   # 或 /swapfile
sudo swapon  /swap.img

3) 找出「誰在吃 swap」(不然很快又會回來)

有 smem 最方便

sudo apt-get update && sudo apt-get install -y smem
sudo smem -rs swap | head

沒有 smem:用 /proc 快速抓(由大到小)

# who_use_swap.sh
#!/bin/bash
for p in /proc/[0-9]*; do
  pid=${p##*/}
  swap=$(awk '/VmSwap:/ {print $2}' $p/status 2>/dev/null)
  comm=$(tr -d '\0' < $p/comm 2>/dev/null)
  if [ -n "$swap" ] && [ "$swap" -gt 0 ]; then
    printf "%10s KiB  pid=%s  %s\n" "$swap" "$pid" "$comm"
  fi
done | sort -nr | head -20

4) 降低未來再大量使用 swap(可選)

sudo sysctl -w vm.swappiness=10

要永久生效:

echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system

⚠️ 小提醒:swapoff 期間會把資料搬回 RAM,可能造成短暫卡頓/IO 增加;如果是線上服務,建議離峰做,或先找出吃 swap 的程序再處理。

[root@localhost ~]# free -h 
total used free shared buff/cache available 
Mem: 45G 25G 1.8G 226M 18G 20G 
Swap: 1.0G 814M 205M 

[root@localhost ~]# swapon --show 
NAME TYPE SIZE USED PRIO 
/dev/dm-1 partition 1020M 814.2M -2

swapoff 如何觀察?

watch 最方便:

watch -n 5 free -h

想加上時間戳一起看:

watch -n 5 'date; echo; free -h'

離開按 q(或 Ctrl+C)。


 

什麼情況才需要「清快取」?

以下有需要放快取,獲得記憶體空間嗎

Every 5.0s: date; echo; free -h                                                                    
Thu Dec 18 10:23:47 2025

Thu Dec 18 10:23:47 CST 2025

              total        used        free	 shared  buff/cache   available
Mem:            45G         25G        994M        230M         18G         19G
Swap:          1.0G          0B        1.0G

你現在重點要看的是:

  • available = 19G:代表系統評估「真的能拿來給程式用」的記憶體還有 19G(包含可回收的 cache)。這個數字大 → 不缺記憶體

  • buff/cache = 18G:這是 Linux 用來加速 I/O 的檔案快取,需要時會自動回收,不是浪費。

  • free = 1.5G 很低是正常現象,Linux 會盡量把閒置 RAM 拿去當 cache。

所以:沒有必要清 cache,清了反而會讓磁碟/檔案讀取變慢(cache 被你清掉了)。

 

 


 

説明 /dev/dm-1 意義 , 與 -a 哪裡不同
sudo swapoff /dev/dm-1
sudo swapon /dev/dm-1

好,先用你現在看到的資訊來對照講:

/dev/dm-1 是什麼意思?

  • dm = device-mapper(Linux 的「裝置映射」層)

  • /dev/dm-1 代表「第 2 個 device-mapper 裝置」(編號從 0 開始),通常是:

    • LVM logical volume(最常見,例如 centos-swap

    • 或 dm-crypt / multipath 這類透過 device-mapper 建出來的裝置

  • 因為你 swapon --show 顯示它是 TYPE partition,表示它是一個「區塊裝置/分割區型態」拿來當 swap。

想看它真正對應到什麼名字(建議你查一下):

ls -l /dev/dm-1
lsblk -f
sudo dmsetup info -C
sudo dmsetup ls --tree

通常你會看到像 centos-swapvgname-swap 之類的 LV 名稱。

 


swapoff /dev/dm-1 / swapon /dev/dm-1 在做什麼?

  • swapoff /dev/dm-1:只停用這個 swap 裝置,把它上面的 swap 頁面搬回 RAM

  • swapon /dev/dm-1:再把它啟用回來(等於「清空」效果)


-a 跟指定 /dev/dm-1 有什麼不同?

1) 作用範圍不同

  • swapoff /dev/dm-1只針對這一個 swap

  • swapoff -a針對所有已啟用的 swap(全部停用)

  • swapon -a:把 /etc/fstab 裡標記為 swap 的項目 全部啟用回來

2) 安全性/可控性不同

  • 如果你機器上只有一個 swap(你現在看起來是),兩者結果幾乎一樣。

  • 如果你有多個 swap(例如:一個 swap 分割區 + 一個 swapfile),用 -a 會一次動到全部;指定裝置比較可控,避免不小心把你不想動的 swap 也關掉。

3) -a 依賴 /etc/fstab

  • swapon -a 會依照 /etc/fstab 去開啟 swap

  • 若某個 swap 沒寫在 fstab、或用系統/雲平台動態掛的,-a 可能不會把它開回來;指定 /dev/dm-1 就不受這個影響。


你這台怎麼選?

你現在 swapon --show 只有一個 /dev/dm-1,所以:

  • 想精準可控:用你貼的這兩行 ✅

  • 想一鍵通用:swapoff -a; swapon -a 也可以 ✅