本文由 简悦 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(記憶體耗盡)錯誤,或者系統無法使用所需應用程式,最佳解決方案是優化應用程式設定或升級您的伺服器。