Swap介紹

Swap字面意思是交換,通常稱為交換空間,是給Linux系統在主記憶體RAM不夠用的時候,將記憶體內比較久沒用到的資料塞進去用的。Swap存在硬碟上,可以是一個獨立的硬碟、開機硬碟內一個獨立的硬碟磁區、任何一個磁區內的一個檔案。自行安裝Ubuntu、CentOS等LInux發行版的時候,如果選擇給系統自動分配磁碟,通常系統會分配一塊獨立磁區給Swap,分配大小會跟RAM的容量一樣大。而Azure、Google Cloud Platform(GCP)上安裝的VM通常預設都沒有配置Swap,但還是可以自己添加Swap,本文下方也有提供教學。

Swap的優點

作業系統最主要的功能是管理硬體資源的分配,例如分配CPU的運算能力給不同應用程式、分配RAM的空間儲存應用程式與資料。當應用程式不斷要求記憶體空間,可能記憶體不足,系統會嘗試刪掉記憶體中不重要的資料來騰出空間,例如快取資料與緩存資料。但還是不夠用就會導致應用程式崩潰,系統會將應用程式直接關閉,避免其他應用程式受到波及。有了Swap交換空間就可以大大增加記憶體使用的彈性,減緩不夠用的可能性。

Swap的缺點

因為Swap使用的是硬碟的空間,反應速度與讀寫速度都遠比不上RAM,因此Swap明顯的缺點就是一個字,慢。就算採用高速SSD,讀寫速度達到5GB/s,但依然比不上DDR4-3200的25.6GB/s頻寬(參考來源),而且還要考慮反應速度。

如果只是少許很久沒使用的資料被移轉到Swap還好,當記憶體不足道大量使用Swap時系統會變得非常緩慢。因此作為伺服器使用的Linux通常不使用Swap,與其讓使用者體驗到緩慢的服務,直接讓服務崩潰留,搭配Linux的服務控制自動重啟服務。重啟後清除大量使用的記憶體資料,有機會讓服務恢復比較好的狀態再撐一陣子,而且讓管理人員看到錯誤重啟的紀錄,管理人員可以更快發現記憶體不足來考慮是否要增加記憶體容量。而個人使用時,用Swap還是適合的,因為應用程式崩潰的話可能打到一半的文件、畫到一半的圖就毀了,慢一點至少還來得及存檔嘛😄。但是如果記憶體足夠大的話,建議不要使用Swap。


Swap增添教學

檢查Swap狀態

sudo swapon --show

如果沒有Swap就不會有任何輸出資料。使用檢查記憶體使用狀況的free也能看到Swap,如果沒有設置則會看到Swap那行顯示0。

建立Swap空間

# 建立一塊保留空間
sudo fallocate -l 1G /swapfile

# 設置讀寫權限
sudo chmod 600 /swapfile

# 建立Swap空間
sudo mkswap /swapfile
# Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
# no label, UUID=b3b91233-6a5b-44d3-9d13-d7c66285a166

指令fallocate會讓系統保留一份硬碟空間,範例中1G代表保留1GB,可以依需求修改。執行後使用df就會發現可用空間直接少1GB。執行mkswap指令後就會輸出UUID,每個人看到的數值都是不一樣的。

啟動Swap空間

sudo swapon /swapfile

再次使用sudo swapon --show就可以看到已經有在使用了,使用free也能看見Swap那行有數據了。

sudo swapon --show
# NAME      TYPE  SIZE  USED PRIO
# /swapfile file 1024M 20.3M   -2
使用Swap之後再使用free指令查看記憶體用量

開機後自動啟用Swap

因為swapon重開機後就會失效,只剩保留空間/swapfile還會存在,所以需要讓Linux自動啟動Swap。

# 等下要修改重要文件,先備份
sudo cp /etc/fstab /etc/fstab.backup

# 編輯設定文件
sudo nano /etc/fstab
# 在最後一行添加以下設定:
/swapfile swap swap defaults 0 0

限制Swap使用頻率

有一個參數swappiness可以設定Linux Swap使用頻率,從0到100,數字越高越積極使用Swap。但可以降低,非必要不用使用Swap降低速度。

# 檢查目前設定,預設60
cat /proc/sys/vm/swappiness

# 修改設定為10,立即生效
sudo sysctl vm.swappiness=10

# 修改設定檔,讓每次開機都自動生效,建議先備份
sudo nano /etc/sysctl.conf
# 在最後一行添加以下設定:
vm.swappiness=10

移除Swap

如果不想再使用Swap,只需要照安裝順序返果來,先停止Swap、刪除開機設定、移除保留空間即可。

# 停止使用Swap
sudo swapoff -v /swapfile

# 移除Swap設定
sudo nano /etc/fstab
# 刪除以下這行設定:
/swapfile swap swap defaults 0 0

# 刪除保留空間
sudo rm /swapfile