如何在Ubuntu系统中创建swap缓存空间

本文由 简悦 SimpRead 转码, 原文地址 www.digitalocean.com

應用程式避免記憶體不足錯誤的一種方法,是在您的伺服器上新增一些交換空間(swap space)……

介紹

應用程式避免記憶體不足錯誤的一種方法,是在您的伺服器上新增一些交換空間。在本指南中,我們將介紹如何在 Ubuntu 20.04 伺服器上新增交換檔案。

什麼是交換空間?

交換空間(Swap) 是硬碟儲存空間中的一部分,被作業系統保留用來臨時儲存無法再放入 RAM 的資料。這能讓您的伺服器增加它能在工作記憶體中保留的資訊量,但仍有一些限制。當記憶體不再有足夠空間來保存正在使用的應用程式資料時,會主要使用硬碟上的交換空間。

寫入硬碟的資料速度會比保存在 RAM 中的資料慢得多,但作業系統會優先將正在執行的應用程式資料保存在記憶體中,只用交換空間來存放較舊的資料。總體來說,當系統的 RAM 用盡時,有交換空間作為備援,對於使用非 SSD 儲存裝置的系統來說,是避免記憶體不足異常的良好安全網。

步驟 1 – 檢查系統的交換資訊

在開始前,我們可以檢查系統是否已有可用的交換空間。系統可能有多個交換檔案或交換分割區,但通常一個就足夠了。

我們可以透過輸入以下指令查看系統是否設定了交換空間:

sudo swapon --show

如果沒有任何輸出,表示您的系統目前沒有可用的交換空間。

您可以使用 free 工具來確認是否沒有啟用交換空間:

free -h
輸出

              total        used        free      shared  buff/cache   available
Mem:          981Mi       122Mi       647Mi       0.0Ki       211Mi       714Mi
Swap:            0B          0B          0B


從輸出的 Swap 行可以看出,系統上沒有啟動任何交換空間。

步驟 2 – 檢查硬碟分割區的可用空間

在建立交換檔案之前,我們先檢查目前的磁碟使用情況以確定有足夠空間。輸入以下命令:

df -h
輸出

Filesystem      Size  Used Avail Use% Mounted on
udev            474M     0  474M   0% /dev
tmpfs            99M  932K   98M   1% /run
/dev/vda1        25G  1.4G   23G   7% /
tmpfs           491M     0  491M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           491M     0  491M   0% /sys/fs/cgroup
/dev/vda15      105M  3.9M  101M   4% /boot/efi
/dev/loop0       55M   55M     0 100% /snap/core18/1705
/dev/loop1       69M   69M     0 100% /snap/lxd/14804
/dev/loop2       28M   28M     0 100% /snap/snapd/7264
tmpfs            99M     0   99M   0% /run/user/1000


「Mounted on」欄位中顯示 / 的設備就是本例中的磁碟。我們有很多可用空間(僅使用 1.4G)。您的使用情況可能不同。

關於適當的交換空間大小有許多不同意見,但實際上這取決於您的個人偏好及應用程式需求。一般來說,設定為系統 RAM 容量的1倍或2倍是個不錯的起點。另一個經驗法則是,若僅用作 RAM 備援,交換空間超過 4G 大概就是多餘的。

步驟 3 – 建立交換檔案

現在知道可用硬碟空間後,我們可以在檔案系統中建立交換檔案。我們將在根目錄(/)下配置一個名為 swapfile,大小為我們需要的檔案。

建立交換檔案的最佳方式是使用 fallocate 程式。此指令可立即建立指定大小的檔案。

本例中的伺服器有 1G RAM,因此我們將建立一個 1G 的檔案。請依照您伺服器的需求調整:

sudo fallocate -l 1G /swapfile

輸入以下指令確認保留的空間大小正確:

ls -lh /swapfile
-rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile

檔案已建立並保留了正確大小。

步驟 4 – 啟用交換檔案

既然我們已建立適當大小的檔案,接著需要將其轉換成交換空間。

首先,我們需鎖定檔案權限,讓只有具有 root 權限的用戶能讀取檔案內容。這可防止一般用戶存取檔案,以確保安全。

輸入以下指令,使檔案僅對 root 可讀寫:

sudo chmod 600 /swapfile

透過以下指令確認權限已變更:

ls -lh /swapfile
輸出
-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile

如您所見,只有 root 使用者擁有讀寫權限。

接著,我們將此檔案標記為交換空間:

sudo mkswap /swapfile
輸出
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf

標記完成後,我們啟用交換檔案,系統即可開始使用:

sudo swapon /swapfile

輸入指令確認交換空間可用:

sudo swapon --show
輸出
NAME      TYPE  SIZE USED PRIO
/swapfile file 1024M   0B   -2

再次使用 free 工具來核對結果:

free -h
輸出

              total        used        free      shared  buff/cache   available
Mem:          981Mi       123Mi       644Mi       0.0Ki       213Mi       714Mi
Swap:         1.0Gi          0B       1.0Gi


交換空間設定成功,您的作業系統將根據需要開始使用。

步驟 5 – 讓交換檔案永久生效

目前設定已啟用交換檔案於當前工作階段,但重新啟動後伺服器不會自動保留交換設定。我們可以透過將交換檔案加入 /etc/fstab 檔案中,來實現永久啟用。

首先備份 /etc/fstab 檔案,以防萬一:

sudo cp /etc/fstab /etc/fstab.bak

使用以下指令,將交換檔案資訊加入 /etc/fstab 檔案尾端:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
```接下來我們將檢視一些可以更新以調整交換空間的設定。

[第6步 – 調整您的交換空間設定](#step-6-tuning-your-swap-settings)[](#step-6-tuning-your-swap-settings)  
------------------------------------------------------------------------------------------------------------

有一些選項您可以設定,這些設定會在處理交換空間時影響系統性能。

### [調整 Swappiness 屬性](#adjusting-the-swappiness-property)[](#adjusting-the-swappiness-property)

`swappiness` 參數設定系統多頻繁將資料從記憶體交換到交換空間。這是一個介於0到100之間的數值,代表百分比。

數值接近零時,核心除非絕對必要,否則不會將資料交換到磁碟。請記得,與交換檔案的互動是「昂貴的」,因為速度遠慢於記憶體操作,且可能導致效能大幅下降。告訴系統不要太依賴交換檔,通常會讓系統更快。

接近100的數值會嘗試將更多資料交換出去,以確保更多的記憶體空間可用。根據您的應用程式記憶體使用狀況或您的伺服器用途,在某些情況下這可能更適合。

可以透過輸入以下指令查看目前的 swappiness 數值:  

cat /proc/sys/vm/swappiness

輸出

60


對桌面使用者而言,swappiness 設定為 60 不是一個糟糕的數值。對於伺服器,則可能希望將其調整到更接近0。

我們可以使用 `sysctl` 指令設定不同的 swappiness 值。

例如,要將 swappiness 設為 10,可以輸入:  

sudo sysctl vm.swappiness=10

輸出

vm.swappiness = 10


此設定會持續到下一次重開機。若要在重啟時自動套用,可以將該行加入 `/etc/sysctl.conf` 檔案:

在檔案底部加上:  

vm.swappiness=10


完成後請儲存並關閉檔案。

### [調整快取壓力設定](#adjusting-the-cache-pressure-setting)[](#adjusting-the-cache-pressure-setting)

另一個相關數值是 `vfs_cache_pressure`。此設定決定系統優先快取 _inode_ 與 _dentry_ 資訊的程度,相較於其他資料。

基本上,這是關於檔案系統的存取資料。這類資料通常查詢成本很高且被頻繁請求,因此系統快取它們是非常理想的。您可以再次查詢 `proc` 檔案系統來查看當前數值:  

cat /proc/sys/vm/vfs_cache_pressure

輸出

100


目前設定下,系統會過快從快取中移除 inode 資訊。我們可以將數值改為較保守的 50,方法如下:  

sudo sysctl vm.vfs_cache_pressure=50

輸出

vm.vfs_cache_pressure = 50


同樣地,這只對目前會話有效。要永久修改,可像調整 swappiness 一樣,加入設定檔:

sudo nano /etc/sysctl.conf


在檔案底部加入新設定:  

vm.vfs_cache_pressure=50


完成後請儲存並關閉檔案。

[結論](#conclusion)[](#conclusion)  
----------------------------------------

按照本指南的步驟操作,可以在發生記憶體耗盡例外狀況時,為系統爭取一些緩衝空間。交換空間對避免這類常見問題相當有用。

如果您遇到 OOM(記憶體耗盡)錯誤,或者系統無法使用所需應用程式,最佳解決方案是優化應用程式設定或升級您的伺服器。