介紹
防止應用程式出現記憶體不足錯誤的一種方法是在您的伺服器上添加一些交換空間。在本指南中,我們將介紹如何在 Ubuntu 22.04 伺服器上添加交換檔。
什麼是交換?
交換是硬碟存儲的一部分,已經被設置為操作系統暫時存儲無法在 RAM 中繼續保持的資料。這使您可以增加伺服器可以保持在其工作記憶體中的資訊量,但有一些注意事項。硬碟上的交換空間主要在 RAM 不足以容納正在使用的應用程式資料時使用。
寫入磁盤的資訊速度會比保持在 RAM 中的資訊慢得多,但操作系統會優先將運行的應用程式資料保留在記憶體中,並將舊的資料使用交換空間。總的來說,當系統的 RAM 被耗盡時,具有交換空間作為後備的安全網可以有效防止具有非 SSD 存儲的系統出現記憶體不足的異常情況。
步驟1 – 檢查系統的交換資訊
在我們開始之前,我們可以檢查系統是否已經有一些交換空間可用。系統可能有多個交換文件或交換分區,但通常一個應該足夠。
我們可以透過輸入以下命令來查看系統是否有任何配置的交換:
如果您沒有得到任何輸出,這意味著您的系統目前沒有可用的交換空間。
您可以使用free
實用工具來驗證是否沒有活動的交換:
Output total used free shared buff/cache available
Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi
Swap: 0B 0B 0B
正如您在輸出的交換行中所看到的,系統上沒有任何活動的交換。
步驟2 – 檢查硬碟分割的可用空間
在我們創建交換文件之前,我們將檢查我們目前的磁碟使用情況,以確保我們有足夠的空間。請輸入以下命令進行檢查:
OutputFilesystem 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相等或是兩倍的空間是一個不錯的起點。另一個好的經驗法則是,如果只是作為RAM後備,超過4G的交換空間可能是不必要的。
步驟 3 – 創建交換文件
現在我們知道了可用的硬碟空間,我們可以在文件系統上創建一個交換文件。我們將在根目錄(/
)中分配一個我們想要的大小的文件,名為swapfile
。
創建交換文件的最佳方法是使用fallocate
程序。此命令可以立即創建指定大小的文件。
由於我們示例中的服務器有1G的RAM,我們將在本指南中創建一個1G的文件。根據您自己服務器的需求進行調整:
我們可以通過輸入以下命令來驗證已保留了正確數量的空間:
我們的文件已經創建並保留了正確的空間。
步驟 4 – 啟用交換文件
現在我們有了正確大小的檔案,我們需要將其轉換為交換空間。
首先,我們需要鎖定檔案的權限,以便只有具有root權限的使用者可以讀取其內容。這可以防止普通使用者能夠存取該檔案,這將對安全性產生重大影響。
將檔案僅限於root使用者,請輸入:
通過輸入以下內容來驗證權限更改:
Output-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
如您所見,只有root使用者啟用了讀取和寫入標誌。
現在,我們可以通過輸入以下內容將該檔案標記為交換空間:
OutputSetting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
標記檔案後,我們可以啟用交換檔案,使我們的系統開始使用它:
通過輸入以下內容來驗證交換是否可用:
OutputNAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -2
我們可以再次檢查free
工具的輸出以證實我們的發現:
Output 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
檔案:
將交換檔案資訊添加到您的/etc/fstab
文件的末尾,請輸入:
接下來,我們將檢視一些我們可以更新以調整交換空間的設置。
步驟6 – 調整您的交換設置
您可以配置一些選項,這些選項將影響系統在處理交換時的性能。
調整Swappiness屬性
swappiness
參數配置系統將多常將數據從RAM交換到交換空間。這是一個介於0和100之間的值,表示百分比。
當值接近零時,內核將只在絕對必要時才將數據交換到磁盤上。請記住,與RAM的交互比與交換文件的交互“昂貴”,因為它們比與RAM的交互花費更多的時間,並且可能會顯著降低性能。告訴系統不要過多依賴交換通常會使系統更快。
接近100的值將嘗試將更多數據放入交換以保持更多的RAM空間空閒。根據您的應用程序的記憶體配置文件或您的服務器用途,這在某些情況下可能更好。
我們可以通過輸入以下命令來查看當前的swappiness值:
Output60
對於桌面電腦來說,swappiness設置為60並不是一個壞的值。對於伺服器,您可能想將其調整到接近0。
我們可以使用sysctl
命令將swappiness設置為不同的值。
例如,要將swappiness設置為10,我們可以輸入:
Outputvm.swappiness = 10
此設置將持續到下一次重新啟動。我們可以在重新啟動時自動設置此值,方法是將以下行添加到我們的/etc/sysctl.conf
文件中:
在底部添加:
vm.swappiness=10
完成後保存並關閉文件。
調整緩存壓力設置
您可能想要修改的另一個相關值是vfs_cache_pressure
。此設置配置系統在其他數據上選擇緩存inode和dentry信息的程度。
基本上,這是有關文件系統的訪問數據。這通常是非常昂貴的查找並且非常頻繁地被請求,因此將其緩存是對系統來說是一件好事。您可以再次查詢proc
文件系統來查看當前值:
Output100
由於目前的配置,我們的系統會過快地從緩存中刪除inode信息。我們可以將其設置為一個更為保守的值,例如50,方法是:
Outputvm.vfs_cache_pressure = 50
再次強調,這僅在我們當前的會話中有效。我們可以通過將其添加到我們的配置文件中,就像我們對swappiness設置所做的那樣:
在底部,添加指定新值的行:
vm.vfs_cache_pressure=50
完成後保存並關閉文件。
結論
按照本指南中的步驟將為您在否則會導致內存不足異常的情況下提供一些空間。交換空間在避免一些常見問題時非常有用。
如果您遇到OOM(內存不足)錯誤,或者發現系統無法使用您需要的應用程序,最佳解決方案是優化應用程序配置或升級您的服務器。
Source:
https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-22-04