【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 或把機器拖很慢。

[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

✅ 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

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


✅ 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

 

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

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

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

你現在重點要看的是:

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

 


✅ 如何判斷「到底有沒有影響」:

vmstat 1

si / so(swap in / swap out):

[root@localhost ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0 354480 1360744    788 19839980    0    0     0    16    0    0  2  1 97  0  0
 1  0 354040 1360720    788 19840012  440    0   440   778 10902 12281  2  7 91  0  0
 2  0 353108 1357988    788 19840088  932    0   932    83 14391 17944  5  8 87  0  0
 2  0 352616 1355888    788 19840140  460    0   460   117 15671 19400  7  8 85  0  0
 3  0 351912 1357268    788 19840132  640    0   640   142 15713 19048  5  8 87  0  0
 2  0 351448 1355556    788 19840140  436    0   436    92 13794 15914  2  8 90  0  0
 2  0 350628 1357180    788 19840156  720    0   720   174 18513 21545  4  9 87  0  0
 1  0 349144 1355736    788 19840136 1484    0  1484    77 11470 13126  2  7 91  0  0
 2  0 348476 1354372    788 19840136  668    0   668    79 11530 12891  2  7 91  0  0
^C

你這段 vmstat 1 顯示「swap 正在被讀回 RAM」,而且是連續的:

這代表:有程式正在碰到曾經被換到 swap 的記憶體頁面,系統就把它從 swap 讀回來;目前沒有再把新的頁面換出去。

會有什麼影響?

  1. 尾延遲抖動(最典型)
    只要 si 不為 0,就表示有 swap I/O;那段時間碰到這些頁面的 thread 可能會卡一下(但你 wa=0 表示目前 I/O 沒被堵住,所以感受可能不明顯或很輕微)。

  2. swap 滿會降低緩衝空間
    現在 so=0 代表還沒再把東西換出去;但如果之後遇到瞬間記憶體壓力,swap 已滿會讓系統更容易走向 OOM / 更劇烈 reclaim。


✅ swap 不清會有什麼影響

不清 swap 通常不會有立即性壞處,但會有幾個「可能的影響」,看你的工作型態而定:

1) 效能:偶爾的延遲抖動(最常見)

swap 裡的資料如果之後又被用到,就會發生 page-in(從磁碟/SSD 讀回 RAM),比 RAM 慢很多,所以可能出現:

你現在 swap 只有 520MB,通常影響不大;但若剛好那 520MB 裡面是常被碰到的頁面,就會感覺得到。

2) 反映「過去曾經記憶體吃緊」

swap 被用滿常代表之前某個時段 RAM 壓力大(尖峰、記憶體洩漏、或短時間大量 cache / buffer / workload)。

3) swap 滿了之後的風險:下次再吃緊會更容易出事

swap 如果已經 100%:

4) 不清 swap 本身不會「佔著 RAM」

很多人誤會:swap 滿了會把 RAM 壓縮。其實 swap 佔的是磁碟區塊,不會直接吃掉你的 RAM。
你真正該看的仍是 available、以及是否有頻繁 swap in/out。


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

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

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

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

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

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

 


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

1) 作用範圍不同

2) 安全性/可控性不同

3) -a 依賴 /etc/fstab


你這台怎麼選?

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


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

sudo sysctl -w vm.swappiness=10

要永久生效:

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

sudo sysctl -w vm.swappiness=10 這行是在 「立即」調整 Linux kernel 對 swap 的使用傾向


等價於:

echo 10 | sudo tee /proc/sys/vm/swappiness

vm.swappiness 代表什麼?

範圍(常見)

很多人會用 10 或 1 來降低 swap 對延遲的影響(尤其是 DB、API、線上服務)。


調成 10 的「實際效果」

常見誤解:swappiness=10 會把現有 swap 清掉嗎?

不會。

swapoff -a && swapon -a

風險 / 代價是什麼?

你的機器 RAM 45G、swap 很小(520M~1G),把 swappiness 降到 10 通常是合理的偏好:少 swap、降低抖動。


這設定會持久嗎?

不會。重開機會還原。

要永久化:

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

建議你怎麼驗證有沒有幫助?

改完後觀察:

vmstat 1

so(swap out)是否長期維持 0,系統是否少出現延遲抖動。

如果你願意貼 cat /proc/sys/vm/swappiness 以及你的服務類型(DB / API / ELK / Docker host),我可以給你更適合的 swappiness 建議值。

 

 


修訂版本 #16
由 treeman 建立於 2025-12-18 02:15:31 CST
由 treeman 更新於 2025-12-18 03:00:17 CST