前言
如何讓站羣服務器響應更快?如何避免應用出現內存不足的錯誤?最簡單的方法就是增加交換空間。 Swap 是儲存盤上的一塊自留地,操作系統可以在這裏暫存一些內存裏放不下的東西。
這從某種程度上相當於增加了站羣服務器的可用內存。雖然從 swap 讀寫比內存慢,但總比沒有好,算是內存不夠時的安全網。
如果沒有 swap,則站羣服務器一旦內存不足,就會開始終止應用以釋放內存,甚至會崩潰,這會讓你丟失一些還沒來得及儲存的資料,或者造成當機。有些應用明確要求系統配置 swap 以確保資料訪問的可靠性。
本文介紹如何在 CentOS 7 站羣服務器上建立並啓用 swap 檔案。
注:swap 通常在傳統機械硬碟上表現更好,在 SSD 上使用 swap 可能會造成問題,尤其是硬體老化之後。所以,對於 DigitalOcean 以及其他使用基於 SSD 的雲 WordPress 主機服務的使用者,我們不推薦啓用 swap 。這甚至會影響到跟你的虛擬機器共用宿 WordPress 主機的其他使用者。
對於 DigitalOcean 使用者,提升效能的最佳方法就是更新 Droplet 。通常來説,升級後的 WordPress 主機表現都會有所提升,並且更不容易受到硬體問題的影響。
準備工作
首先,你需要一台 CentOS 7 站羣服務器,配置過具備 sudo 許可權的非 root 使用者(配置過程可參考這個教程的第一到第四步驟)。
準備就緒後,以該使用者名稱 SSH 到你的 CentOS 站羣服務器上,準備安裝 swap 檔案。
檢查系統的 Swap 資訊
首先我們需要檢查系統的儲存,看看是否已經配置過 swap 。一個系統可以設定多個 swap 檔案或分割槽,不過一般來説一個就夠了。
使用 swapon 命令可以檢查系統是否已經配置過 swap,這是一個通用的 swap 工具。使用-s 標籤可列出當前儲存裝置上的 swap 使用情況:
swapon -s
如果該命令沒有返回出結果,則代表該系統尚未配置過 swap 。
或者,我們也可以使用 free 工具來檢視系統的整體內存使用情況,這裏可以看到內存和 swap 的使用狀態(顯示單位為 MB):
free -m
total used free shared buffers cached
Mem: 3953 315 3637 8 11 107
-/+ buffers/cache: 196 3756
Swap: 0 0 4095
這裏可以看到我們這個系統的 total swap 空間為 0,即沒有配置過 swap 。這與我們在 swapon 裏看到的結果相符合。
檢查可用的儲存空間
通常,我們建立一個單獨的分割槽作為 swap 。然而有時候由於硬體或站羣軟件的限制,新建分割槽的方式無法實現,這種情況下就可以建立一個 swap 檔案來實現同樣的功能。
開始之前,先檢查一下磁碟的可用空間。輸入如下指令:
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 59G 1.5G 55G 3% /
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 8.3M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
這裏的-h 標記是為了告訴 dh 將資訊輸出為對人類友好的格式,比如以 MB 或 GB 為單位輸出空間使用和空餘情況,而不是直接輸出內存塊的個數。
從第一行可以看到我們的儲存分割槽上還有 59GB 的空間剩餘,這足夠我們操作了。(我這是一台中等規模的新建雲 WordPress 主機,每個人的情況可能有很大不同。)
合適的 swap 空間是多大?關於這個問題有很多種選擇,這取決於你的應用需求和你個人的偏好。一般來説,內存容量的兩倍就是個不錯的起點。
我的系統內存有 4GB,如果設定 8GB 的 swap 會佔據太多空間,所以我決定只設定 4GB 就好。
建立 Swap 檔案
接下來我們將在檔案系統上建立 swap 檔案。我們要在根目錄(/)下建立一個名叫 swapfile 的檔案,當然你也可以選擇你喜歡的檔名。該檔案分配的空間將等於我們需要的 swap 空間。
最快捷的建立方式是 fallocate 命令,該命令能夠建立一個預分配指定大小空間的檔案。輸入如下指令建立一個 4GB 的檔案:
sudo fallocate -l 4G /swapfile
輸入密碼後,該 swap 檔案將立即建立完畢。我們可以用 ls 命令檢查檔案大小:
ls -lh /swapfile
-rw-r–r– 1 root root 4.0G Oct 30 11:00 /swapfile
至此,我們的 swap 檔案就建立完畢了。
啓用 Swap 檔案
現在我們已經有了 swap 檔案,但系統還不知道應該使用該檔案作為 swap,這就需要我們告知系統將該檔案格式化為 swap 並啓用起來。
首先我們需要更改 swap 檔案的許可權,確保只有 root 才可讀,否則會有很大的安全隱患。使用 chmod 命令進行許可權操作:
sudo chmod 600 /swapfile
如此,該檔案的讀寫都只有 root 才能操作。使用 ls -lh 命令檢查一下:
ls -lh /swapfile
-rw——- 1 root root 4.0G Oct 30 11:00 /swapfile
然後,使用如下命令告知系統將該檔案用於 swap:
sudo mkswap /swapfile
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=b99230bb-21af-47bc-8c37-de41129c39bf
現在,這個 swap 檔案就可以作為 swap 空間使用了。輸入如下命令開始使用該 swap:
sudo swapon /swapfile
我們可以輸入如下命令來確認一下設定是否已經生效:
swapon -s
Filename Type Size Used Priority
/swapfile file 4194300 0 -1
可以看到返回的結果中已經有我們剛才設定的 swap 。再使用 free 工具確認一下:
free -m
total used free shared buffers cached
Mem: 3953 315 3637 8 11 107
-/+ buffers/cache: 196 3756
Swap: 4095 0 4095
至此,我們的 swap 已經設定完畢,操作系統會在需要的時候使用它。
使 Swap 檔案永久生效
至此我們已經在系統中啓用了 swap 檔案,然而一旦系統重啓後,站羣服務器還不能自動啓用該檔案。要讓系統在重啓後自動生效 swap,我們可以通過修改 fstab 檔案來實現(這是一個管理檔案系統和分割槽的表)。
用 sudo 許可權開啓該檔案編輯:
sudo nano /etc/fstab
在檔案末尾加入下面這行內容,告訴操作系統自動使用剛才建立的 swap 檔案:
/swapfile swap swap sw 0 0
新增完畢後,儲存退出。以後站羣服務器每次重啓都會檢查該檔案並自動啓用 swap 。
更改 Swap 配置(可選)
有幾個涉及 swap 的選項可能會影響到系統的效能表現。大部分情況下這些選項是可選的,具體要修改成什麼樣則取決於你的應用需求以及個人偏好。
Swappiness
swappiness 引數決定了系統將資料從內存交換到 swap 空間的頻率,數值設定在 0 到 100 之間,代表系統將資料從內存交換到 swap 空間的力度。
該數值越接近於 0,系統越傾向於不進行 swap,僅在必要的時候進行 swap 操作。由於 swap 要比內存慢很多,因此減少對 swap 的依賴意味著更高的系統效能。
該數值越接近於 100,系統越傾向於多進行 swap 。有些應用的內存使用習慣更適合於這種情況,這也於站羣服務器的用途有關。
輸入如下命令檢視當前的 swappiness 數值:
cat /proc/sys/vm/swappiness
30
CentOS 7 預設設定了 30 的 swappiness,這對於大部分桌面系統和本地站羣服務器是比較中庸的數值。對於 VPS 系統而言,可能接近於 0 的值是更加合適的。
使用 sysctl 命令可以修改 swappiness 。比如將 swappiness 設為 10:
sudo sysctl vm.swappiness=10
vm.swappiness = 10
本次修改將一直生效到下次重啓前。如果希望永久修改該數值,則需要編輯 sysctl 配置檔案:
sudo nano /etc/sysctl.conf
將以下內容貼上到檔案末尾:
vm.swappiness = 10
編輯完成後,儲存退出,之後站羣服務器每次重啓的時候會將 swappiness 設定為該值。
WordPress 加速緩存壓力(Cache Pressure)
另一個可以考慮更改的配置項是 vfs_cache_pressure,該配置項涉及特殊檔案系統元檔案條目的儲存。對此類資訊的頻繁讀取是非常消耗效能的,所以延長其在 WordPress 加速緩存的儲存時間可以提升系統的效能。
通過 proc 檔案系統檢視 WordPress 加速緩存壓力的當前設定值:
cat /proc/sys/vm/vfs_cache_pressure
100
這個數值是比較高的,意味著系統從 WordPress 加速緩存中移除 inode 資訊的速度比較快。一個保守一些的數值是 50,使用 sysctl 命令進行設定:
sudo sysctl vm.vfs_cache_pressure=50
vm.vfs_cache_pressure = 50
這條命令僅在重啓前有效。要讓該設定永久有效,需要編輯 sysctl 配置檔案:
sudo nano /etc/sysctl.conf
在檔案末尾新增如下內容:
vm.vfs_cache_pressure = 50
儲存退出,站羣服務器就會在每次重啓後都自動將 WordPress 加速緩存壓力設定為 50 了。
總結
至此,我們的系統內存就獲得了一些喘氣的空間。有了 swap 空間可以有效避免一些常見的問題。
如果你仍然會遇到內存不足(OOM,out of memory)的錯誤資訊,或者你的系統不能執行你需要的應用,那麼最好的方法是優化你的應用配置或者升級你的站羣服務器,不過配置 swap 空間也不失為一個靈活的節省方案。
本文來源自 DigitalOcean Community 。英文原文:How To Add Swap on CentOS 7 by Josh Barnett