這裡介紹 Linux 系統上 swap 交換空間的使用方式,包含 swap 分割區與檔案的使用與管理。
Linux 系統將實體記憶體(RAM)分成一塊一塊的小區域,這些小區塊稱為 pages,在實體記憶體不足的時候,系統會透過 swapping 的動作將 page 的資料搬到預先配置好的硬碟置換空間(swap)中儲存,然後釋放出 page 的記憶體空間,而 Linux 系統上的虛擬記憶體(virtual memory)就是包含實體記憶體與硬碟的置換空間這兩大部份。
通常在安裝 Linux 系統的時候,都會配置一個獨立的磁碟分割區給 swap 交換空間使用,但我們也可以將一般的檔案作為 swap 交換空間使用,尤其是在系統臨時需要大量的記憶體時,就可以使用檔案的方式增加 swap 交換空間。
查看交換空間(Swap)#若要查看目前 Linux 系統上的置換空間狀態,可以使用 swapon 指令:
# 查看系統置換空間狀態
swapon -s
輸出會類似這樣:
Filename Type Size Used Priority
/dev/sdb partition 262140 204564 -1或是使用 free 來查看:
# 查看系統記憶體狀態
free -h
輸出為:
total used free shared buffers cached
Mem: 991M 979M 12M 33M 41M 535M
-/+ buffers/cache: 401M 589M
Swap: 255M 199M 56M以磁碟分割區建立交換空間#在 Linux 中我們可以利用 fdisk 或 cfdisk 這類的磁碟分割工具來建立交換空間專用的分割區,交換空間的磁碟分割區類型編號(partition type)是 82,但其實任何的磁碟分割區類型都可以作為交換空間使用。
在建立好磁碟分割區之後,我們可以使用 mkswap 來初始化交換空間,例如:
# 始化交換空間
sudo mkswap /dev/sda2
這樣系統就會在 /dev/sda2 這個分割區建立一個交換空間。
在使用 mkswap 初始化交換空間時,會將該分割區內的所有資料抹除,使用時請特別注意!
mkswap 在初始化交換空間時,會自動幫分割區產生一個 UUID,如果您想要自行指定 UUID,可以使用 -U 指令:
# 始化交換空間(自行指定 UUID)
sudo mkswap -U custom_UUID /dev/sda2
在建立好交換空間之後,使用 swapon 指令啟用這個新的交換空間:
# 啟用交換空間
sudo swapon /dev/sda2
這樣 Linux 系統就可以馬上使用這個新的交換空間了。
若要讓 Linux 系統在開機時就自動啟用這個交換空間,可以在 /etc/fstab 中加上一行設定:
/dev/sda2 none swap defaults 0 0
如果您是使用有支援 TRIM 的 SSD 來作為交換空間,那麼在執行 swapon 指令時可以加上 -d 或是 --discard 參數:
sudo swapon -d /dev/sda2
而 /etc/fstab 的設定亦可加上 discard 選項:
/dev/sda2 none swap defaults,discard 0 0
這樣有可能可以讓交換空間的使用更有效率。
如果要停用交換空間,可以使用 swapoff 指令:
# 停用交換空間
sudo swapoff /dev/sda2
以檔案建立交換空間#除了使用固定的磁碟分割區之外,我們也可以拿一般的檔案來建立交換空間,用檔案的方式可以讓管理者非常彈性的動態增加交換空間,在不需要時也可以很方便的移除。
Btrfs 檔案系統上的檔案無法用來建立交換空間。
若要使用一般的檔案建立交換空間,首先使用 fallocate 建立一個檔案,檔案的的大小可以使用 -l 參數指定,例如建立一個大小為 512 MB 的檔案:
# 建立大小為 512 MB 的檔案
sudo fallocate -l 512M /swapfile
如果您的檔案系統無法使用 fallocate 建立檔案,可以改用 dd:
# 建立大小為 512 MB 的檔案
sudo dd if=/dev/zero of=/swapfile bs=1M count=512
使用 dd 的作用跟 fallocate 差不多,只是會多出一些磁碟寫入的動作,稍微慢一些。
接著設定正確的權限:
# 設定權限
sudo chmod 600 /swapfile
使用 mkswap 初始化交換空間:
# 初始化交換空間
sudo mkswap /swapfile
最後使用 swapon 啟用交換空間:
# 啟用交換空間
sudo swapon /swapfile
若要讓系統開機時可以自動使用這個交換空間,則在 /etc/fstab 中加入:
/swapfile none swap defaults 0 0
若要停用交換空間,一樣是使用 swapoff:
# 停用交換空間
sudo swapoff -a
當交換空間停用之後,如果後續沒有需要繼續使用,就可以將檔案刪除了:
# 刪除檔案
sudo rm -f /swapfile
如果在 /etc/fstab 有設定這個檔案的交換空間的話,也記得要一併移除。
接著我們要介紹使用 USB 隨身碟或外接硬碟來作為 Linux 系統的交換空間,請繼續閱讀下一頁。
以 USB 隨身碟或外接硬碟建立交換空間#如果您的硬碟已經沒有剩餘的空間了,而且系統的記憶體又不足,這樣的狀況下就可以使用 USB 隨身碟或外接硬碟來應急,不過使用 USB 隨身碟會有一些缺點:
USB 隨身碟的速度通常都比硬碟慢,作為交換空間效率不佳。快閃記憶體(flash memory)有寫入次數的限制,作為交換空間會讓隨身碟比較快損壞。若要使用 USB 隨身碟作為交換空間,首先將隨身碟掛載之後,依照一般硬碟分割區的操作方式來初始化 USB 隨身碟,只不過在 /etc/fstab 之中的設定要改用 UUID 的方式設定:
UUID=MY_USB_UUID none swap defaults 0 0
這裡的 MY_USB_UUID 要換成 USB 隨身碟的 UUID,這個值可以從 /dev/disk/by-uuid/ 中查到:
# 查看 USB 隨身碟 UUID
ls -l /dev/disk/by-uuid/
執行之後,會列出每個 UUID 對應的分割區。
以 /dev/sdb1 這一個 USB 隨身碟來說,設定就是這樣寫:
UUID=df040c08-8212-4077-ad2e-48df71721fe8 none swap defaults 0 0
交換空間效能校調#系統使用交換空間的程度可以透過 swappiness 這個系統參數來調整,這個值的範圍是從 0 到 100,這個數值越大的話系統就會越積極將暫時不用的資料搬移至置換空間儲存,而比較低的值就會讓系統降低交換空間的使用率,預設值是 60。我們可以利用這個指令查詢目前的 swappiness 數值:
# 查詢目前 swappiness 數值
cat /proc/sys/vm/swappiness
如果想要讓系統效能提高,可以嘗試降低 swappiness 的數值:
# 設定 swappiness 數值
sudo sysctl vm.swappiness=50
或是直接使用 echo 更改也可以:
# 設定 swappiness 數值
sudo echo 50 > /proc/sys/vm/swappiness
若要讓開機後自動設定,可以新增一個 /etc/sysctl.d/90-swappiness.conf 設定檔,加入這一行設定:
vm.swappiness=10
如果系統上同時有好幾個交換空間,我們可以透過 pri 這個優先權的參數來設定使用的順序:
/dev/sda2 none swap defaults,pri=10 0 0
/dev/sdb1 none swap defaults,pri=5 0 0
pri 的數值越大,系統就會越先選用,這個數值的範圍可以從 0 到 32767,以這個例子來說系統會優先使用 /dev/sda2 這個交換空間,當 /dev/sda2 的空間用完時,才會使用 /dev/sdb1 這個分割區的交換空間。
在使用 swapon 時也可以加上 -p 參數來指定優先權:
# 以 -p 參數指定優先權
sudo swapon -p 10 /dev/sda1
參考資料#ArchWikiredhat