為VPS加入Swap

Posted by JSON on December 30, 2014

如果有使用VPS如 Digital OceanLinode 常會遇到記憶體不夠用的情形,除了砸錢升級外就是使用Swap

Swap是一種解決Server上OOM(out of memory)的一種方法, 取硬碟的某一區塊暫時作為記憶體使用,解決記憶體不足的問題。 由於硬碟速度不如記憶體,會將較舊少使用的資料存入Swap,而 較常新的資料留在記憶體。

以Ubuntu為例,使用以下指令檢查目前系統有沒有任何Swap設定

sudo swapon -s

若印出結果如下,表示目前沒有任何Swap

Filename Type Size Used Priority

也可以使用free -m指令,顯示目前memory及swap的使用狀況:

free -m
              total        used        free      shared  buff/cache   available
Mem:         128912       63688       38680        2739       26542       62315
Swap:         19072       11245        7827

確認目前沒有Swap的設定後,再來要檢查硬碟上的可用空間,才能決定要撥多少空間出來 作為Swap

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G  5.9G   32G  16% /
none            4.0K     0  4.0K   0% ...
udev            991M  4.0K  991M   1% ...
tmpfs           201M  348K  200M   1% ...
none            5.0M     0  5.0M   0% ...
none           1001M  1.9M 1000M   1% ...
none            100M     0  100M   0% ...

目前硬碟使用16%,還有32GB的可用空間,實務上Swap大小建議 值為記憶體的兩倍大。若記憶體為2GB,那就取4GB硬碟空間作為Swap。

建立Swap File

啟用Swap前必須先建立一個檔案, 我們將建立一個名為swapfile的檔案於根目錄,配置此檔案的大小 即為Swap的大小,有以下兩種方式來達到這件事:

一、dd指令(slow way)

使用dd指令來預先配置檔案大小,這個指令將系統某個檔案寫到指定的地方, 利用/dev/zero這個檔案,它提供了無限的空字元可以讓我們寫入Swapfile, bs參數可以指定block的大小,count參數指定要幾個block,因此 block*count=swap size。bs與count可以是任意值,最重要的是相乘後 應為你要的Swap size:

sudo dd if=/dev/zero of=/swapfile bs=1G count=4

若執行時產生如:dd: memory exhausted by input buffer of size 1073741824 bytes (1.0 GiB) 的錯誤訊息,表示你的block size設太大,將bs降低然後提高count就可以解決

執行成功後,會出現如下訊息,表示系統花了15秒將4GB的zero寫入Swapfile

8+0 records in
8+0 records out
4294967296 bytes (4.3 GB) copied, 15.4326 s, 278 MB/s

執行以下指令,可以看到我們產生了一個4GB的檔案

ls -lh /swapfile
=> -rw-r--r-- 1 root root 4.0G Dec 29 04:18 /swapfile

現在可以先將swapfile移除,我們要用更快的方法產生這個檔案

二、fallocate指令

fallocate指令建立一個預先配置大小的檔案,之所以快是因為不必將 沒用的內容寫入檔案。同樣建立4GB檔案只要輸入以下指令:

sudo fallocate -l 4G /swapfile

與上一次15秒相比,這次是立刻完成。

啟用Swap

建立完swapfile後要對這個檔案啟用Swap功能,先更改檔案的權限, 讓root只有讀取的權限以避免安全性的問題:

sudo chmod 600 /swapfile

透過mkswap指令,將檔案作為swap

sudo mkswap /swapfile

成功後便會看到如下訊息:

Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=56ae31ba-b0f5-4d21-943f-0fbc76ae79a7

最後使用swapon指令啟用swap:

sudo swapon /swapfile

透過以下指令可以看到Swap已經開始運作了

sudo swapon -s
Filename    Type    Size    Used    Priority
/swapfile   file    4194300 0       -1

同樣可以用free -m看到Swap那一列不再是0

讓Swap檔案永久運作

swap已經啟用了,但重新開機後server不會自動啟用它,修改 /etc/fstab檔案來達成永久啟用,在檔案的底端加入:

/swapfile   none    swap    sw  0   0