1. 程式人生 > >【轉】 詳解如何在Ubuntu 16.04上增加Swap分割槽

【轉】 詳解如何在Ubuntu 16.04上增加Swap分割槽

前言

提高伺服器響應速度和防止應用程式記憶體不足錯誤的最簡單方法之一是新增一些交換空間。 在本指南中,我們將介紹如何將交換檔案新增到Ubuntu 16.04伺服器。

但是,請注意:

儘管swap區通常建議用於使用傳統旋轉硬碟驅動器的系統,但使用與SSD交換可能會導致隨著時間的推移硬體退化問題。 由於這個考慮,我們不建議在DigitalOcean或任何其他使用SSD儲存的供應商上啟用swap分割槽。 這樣做可能會影響到您和您的鄰居的底層硬體的可靠性。 本指南僅供可能在其他地方有使用旋轉磁碟系統的使用者參考。如果您需要改善DigitalOcean伺服器的效能,我們建議升級您的Droplet,以致於有更好的體驗,並且會降低影響您的服務的硬體問題的可能性。

1.首先來了解一下什麼是Swap

Swap分割槽(也稱交換分割槽)是硬碟上的一個區域,被指定為作業系統可以臨時儲存資料的地方,這些資料不能再儲存在RAM中。 基本上,這使您能夠增加伺服器在工作“記憶體”中保留的資訊量,但有一些注意事項,主要是當RAM中沒有足夠的空間容納正在使用的應用程式資料時,將使用硬碟驅動器上的交換空間。

寫入磁碟的資訊將比儲存在RAM中的資訊慢得多,但是作業系統更願意將應用程式資料儲存在記憶體中,並使用交換舊資料。 總的來說,當系統的RAM耗盡時,將交換空間作為回落空間可能是一個很好的安全網,可防止非SSD儲存系統出現記憶體不足的情況。

2.檢查系統的交換資訊

在開始之前,我們可以檢查系統是否已經有一些可用的交換空間,可能有多個交換檔案或交換分割槽,但通常應該是足夠的。我們可以通過如下的命令來檢視系統是否有交換分割槽:

$ sudo swapon --show

如果沒有任何結果或者沒有任何顯示,說明系統當前沒有可用的交換空間。也可以使用free工具來驗證當前確實沒有可用的交換分割槽。

$ free -h

輸出結果:

              total        used        free      shared  buff/cache   available Mem:           488M         36M        104M        652K        348M        426M Swap:            0B          0B          0B

可以看到這裡的”swap”行均為0,也就是說系統上沒有交換處於活動狀態。

3.檢查硬碟驅動器分割槽上的可用空間

為swap分配空間的最常見方式是使用專門用於具體某個任務的單獨分, 但是,改變分割槽方案並不是一定可行的,我們只是可以輕鬆地建立駐留在現有分割槽上的交換檔案。

在開始之前,我們應該通過輸入以下命令來檢查當前磁碟的使用情況:

$ df -h

 輸出結果:

Filesystem      Size  Used Avail Use% Mounted on udev            238M     0  238M   0% /dev tmpfs            49M  624K   49M   2% /run /dev/vda1        20G  1.1G   18G   6% / tmpfs           245M     0  245M   0% /dev/shm tmpfs           5.0M     0  5.0M   0% /run/lock tmpfs           245M     0  245M   0% /sys/fs/cgroup tmpfs            49M     0   49M   0% /run/user/1001

在這種情況下,/dev下的裝置是我們的磁碟。在這個例子中我們有足夠的空間(只使用了1.1G),當然,您的使用情況可能會有所不同。

儘管對於交換空間的適當大小有許多意見,但這取決於您的個人偏好和應用程式要求。 一般來說,相當於系統記憶體量的兩倍或者兩倍是一個很好的起點。 另一個很好的經驗是,如果你只是把它用作RAM備用,那麼swap分割槽的大小盡量不要超過4 GB。

4.建立swap檔案

現在我們知道了可用的硬碟空間,那我們就可以在檔案系統中建立一個交換檔案,我們將在我們的根(/)目錄下建立一個名為swapfile的檔案。建立交換檔案最好的方法是使用fallocate命令,這個命令能立即建立一個預分配大小的檔案。由於本示例中的伺服器RAM的大小為512MB,因此我們將在本教程中建立一個1 GB大小的檔案,並適當加以調整,以滿足您自己的伺服器的需求:

$ sudo fallocate -l 1G /swapfile

建立完成之後,我們可以通過這個命令來驗證是否保留了正確的交換空間:

$ ls -lh /swapfile

顯示結果:

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

這就說明我們的檔案已經建立了正確的空間大小。

5.啟用交換檔案

現在我們有一個1 GB大小的檔案,我們需要把它變成交換空間

首先,我們需要鎖定檔案的許可權,以便只有擁有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   -1

這時,我們可以通過free再次檢視我們的設定:

$ free -h

顯示結果:

              total        used        free      shared  buff/cache   available Mem:           488M         37M         96M        652K        354M        425M Swap:          1.0G          0B        1.0G

可以看到swap分割槽已成功建立,大小為1.0 G,作業系統將在必要時使用。

6.永久保留交換檔案

我們最近的更改啟用了當前會話的swap檔案,但是,如果我們重新啟動,伺服器不會自動保留swap設定,我們可以通過將swap檔案新增到/etc/fstab檔案中來改變這一點。

備份/etc/fstab檔案以防出錯:

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

將swap檔案資訊新增到/etc/fstab檔案的末尾:

$ echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

這樣就保留了swap檔案。

7.調整你的交換設定

在處理交換時,可以配置幾個選項,這些選項會影響系統的效能

7.1 調整swappiness屬性

swappiness引數配置您的系統將資料從RAM交換到交換空間的頻率, 值介於0和100之間,表示百分比。如果swappiness值接近0,核心將不會將資料交換到磁碟,除非絕對必要。要記住一點,與swap檔案的互動是“昂貴的”,因為與swap互動花費的時間比與RAM的互動更長,並且會導致效能的顯著下降。系統更少依賴swap分割槽通常會使你的系統更快。swappiness接近100的值將嘗試將更多的資料放入交換中,以保持更多的RAM空間。根據您的應用程式的記憶體配置檔案或您使用的伺服器,這可能會在某些情況下更好。

檢視當前的swappiness值:

$ cat /proc/sys/vm/swappiness

結果顯示

60

對於桌面系統來說,60的swappiness設定不是一個比較壞的值,但是對於伺服器,您可能希望將其設定與0更接近的值。

我們可以使用sysctl命令將swappiness設定為不同的值,例如,要將swappiness設定為10:

$ sudo sysctl vm.swappiness=10

顯示結果:

vm.swappiness = 10

該設定將保持到系統下次重新啟動,如果想要在重啟之後也生效,我們可以通過在/etc/sysctl.conf檔案中新增一行實現:

$ sudo nano /etc/sysctl.conf

在檔案的最後新增:

vm.swappiness=10

完成後儲存並關閉檔案。

7.2 調整快取壓力設定

您可能想要修改的另一個相關值是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類似,這隻對當前的session有效,我們可以通過將其新增到我們的配置檔案來改變它,就像我們使用我們的swappiness設定一樣:

$ sudo nano /etc/sysctl.conf

在末尾新增:

vm.vfs_cache_pressure=50

完成後儲存並關閉檔案。

8.總結

遵循本指南的步驟將給您一些喘息的空間,否則會導致記憶體不足的例外,swap空間對於避免這些常見問題非常有用,如果遇到OOM(記憶體不足)錯誤,或者如果發現系統無法使用所需的應用程式,則最佳解決方案是優化應用程式配置或升級伺服器。

參考: