如何在高記憶體需求伺服器上最佳化 Swap 設定?
Swap 最佳化真正代表什麼?
Swap 是一種以磁碟空間作為延伸的虛擬記憶體機制。當 Linux 判斷某些記憶體頁面暫時不需要保留在 RAM 中時,就會將它們移到 Swap。對繁忙的伺服器來說,這有助於把 RAM 優先留給活躍中的程序與檔案系統快取。這種行為本身並不異常。
真正的問題在於,當 Swap 活動變得過於頻繁時,伺服器會花費過多時間在 RAM 與儲存裝置之間搬移記憶體頁面,進而造成回應速度變慢、I/O 負擔加重,最終影響整體服務效能。
對高記憶體需求的工作負載而言,Swap 最佳化的核心,在於控制核心使用 Swap 的積極程度、設定適當的 Swap 容量,以及當記憶體壓力升高時,讓伺服器以更穩定的方式回應。這類調整對資料庫伺服器、PHP-FPM 行程池、分析型工作、搜尋服務,以及高流量應用伺服器尤其重要。
為什麼在還有可用 RAM 的情況下仍然會使用 Swap?
很多系統管理者會以為,只有在 RAM 即將耗盡時,Linux 才應該開始使用 Swap。實際上並不是這樣。Linux 核心可能會主動把較少使用的匿名記憶體移到 Swap,藉此騰出更多 RAM 給活躍工作負載與頁面快取使用。換句話說,出現一定程度的 Swap 使用量,本身並不代表系統異常,反而可能是正常的記憶體管理策略。
真正需要留意的,是系統是否持續進行 Swap in 與 Swap out。Swap 使用量穩定通常問題不大,但如果 Swap 活動頻繁且反覆發生,往往就是效能開始下滑的訊號。
如何判斷 Swap 是否已經成為效能問題?
建議先進行基本檢查:
bash
free -h
swapon –show
vmstat 1 5
free -h 可用來查看整體 RAM 與 Swap 的使用情況。
swapon –show 可確認目前啟用的 Swap 裝置或 Swap 檔案。
vmstat 1 5 則能提供更有價值的動態資訊。
其中最值得觀察的是 si 與 so 欄位,也就是 Swap in 與 Swap out。如果在正常負載下這兩個數值仍持續增加,就代表系統正承受記憶體壓力,並可能逐步進入應用回應變慢的狀態。
提示: Swap 使用量高不一定是問題,真正值得警覺的通常是 Swap 活動過於頻繁。
設定合適的 Swap 容量
合理的 Swap 容量能為 Linux 提供必要的緩衝空間,同時避免伺服器在真正發生記憶體不足之前,長時間陷入效能緩慢惡化的情況。很多情況下,較小型的系統適合配置與 RAM 相近的 Swap,而當實體記憶體超過 8GB 時,常見做法是建立例如 4GB 的中等容量 Swap 檔案。
如果系統不需要休眠功能,生產環境的伺服器通常沒有必要配置過大的 Swap 空間。因為過大的 Swap 有時只會讓系統在資源不足時拖得更久,而不是真正改善效能。
在現代 Linux 系統中,Swap 檔案通常比獨立的 Swap 分割區更受歡迎,原因是它更容易調整大小,也更方便日後管理。
針對正式環境工作負載調整 swappiness
swappiness 用來控制 Linux 在使用 Swap 與回收快取之間的傾向。預設值 60 對延遲敏感的伺服器來說通常偏高。對高記憶體需求的應用伺服器與資料庫伺服器而言,較低的設定通常更合適。
一個常見而實用的起始值是:
bash
sudo sysctl vm.swappiness=10
若要永久生效,可在系統設定檔中加入:
bash
vm.swappiness=10
對極度重視延遲表現的環境,也可以進一步測試 1。較低的數值可以降低活躍應用記憶體過早被移入較慢 Swap 的機率,但這不代表 Linux 會完全停止使用 Swap。
調整快取壓力與回寫行為
除了 swappiness 之外,另外兩類設定對記憶體效能也有明顯影響。vm.vfs_cache_pressure 用來控制 Linux 回收檔案系統中繼資料快取的積極程度,而 vm.dirty_ratio 與相關參數,則會影響未寫回資料可以在 RAM 中累積到什麼程度,才開始進行資料回寫。
一組相對平衡的基準設定通常如下:
bash
vm.vfs_cache_pressure=50
vm.dirty_ratio=15
vm.dirty_background_ratio=5
這些設定有助於核心在高負載情況下,更穩定地平衡快取保留與磁碟寫入行為,特別適合執行網站應用、資料庫,以及高儲存 I/O 活動服務的伺服器。
提示: 如果系統在大量寫入期間出現效能下滑,除了觀察 Swap 行為,也應一併檢查 dirty page 相關設定。
檢查 Transparent Huge Pages 與 zram
Transparent Huge Pages(透明大頁記憶體)對某些工作負載可能有幫助,但對不少資料庫來說,停用後反而能帶來更穩定的表現,因為這樣可以減少由記憶體碎片造成的延遲尖峰。這項調整不應一概而論,而應根據實際工作負載進行測試。
另一個值得考慮的選項是 zram。zram 會在 RAM 中建立壓縮型的 Swap 空間,速度通常比磁碟型 Swap 快得多。對於會出現突發記憶體需求的系統來說,zram 可以先吸收短暫尖峰,降低伺服器過早依賴較慢儲存裝置的機率。
檢查哪些程序正在造成記憶體壓力
如果 Swap 使用量持續增加,下一步不應只是持續調整核心參數,而是找出真正消耗記憶體的服務或程序。
常用指令包括:
bash
ps aux –sort=-%mem | head -6
smem -tp
這類檢查往往能找出一些典型問題,例如 PHP-FPM 行程池設定過大、MySQL 記憶體分配過高、Elasticsearch 記憶體膨脹,或應用程式的工作程序數量本身就超出現有 RAM 可承受的範圍。
在這種情況下,Swap 調校或許能改善表面症狀,但真正的解法仍然是服務層級的最佳化與資源規劃。
避免 OOM 發生時造成更嚴重的後果
當記憶體徹底耗盡時,Linux 的 OOM Killer 會決定終止哪個程序。對正式環境伺服器來說,適度調整程序的 OOM 優先順序是值得考慮的做法,這樣像 SSH 或關鍵系統服務就不會成為最先被終止的對象。
這當然無法取代正確的容量規劃,但在發生記憶體事件時,確實可以降低系統整體失去可管理性的風險。
監控重點應放在壓力,而不只是記憶體總量
最常見的錯誤之一,就是只看剩餘 RAM 或總 Swap 使用量。記憶體壓力必須放在整體系統情境中一起判斷。你應同時監控 Swap I/O、磁碟延遲、應用回應時間、主要記憶體消耗程序,以及 OOM 事件,才能更準確判斷伺服器在高峰負載下是否真正健康。
提示: 如果 Swap 活動與磁碟延遲同時上升,通常應視為基礎架構層面的警訊,而不只是單純的記憶體參數問題。
當調校已經不足以解決問題時
Swap 調校能處理的問題其實有限。如果在調整 swappiness 與記憶體策略之後,伺服器仍持續出現頻繁的 Swap in、Swap out、高延遲與工作負載停滯,那麼問題通常更深層。可能是工作負載本身需要更多 RAM、工作程序數量過多、應用程式效率不足,或儲存裝置效能無法跟上需求。
對正式運行的系統來說,調校的目的是改善系統行為,而不是掩蓋伺服器規格已經不足的事實。
結論
要在高記憶體需求伺服器上最佳化 Swap 設定,重點在於讓 Linux 在承受壓力時仍能維持穩定回應,而不是強迫系統完全不使用 Swap。正確做法是觀察真實的 Swap 活動,適度調整 swappiness 與快取行為,評估 Transparent Huge Pages 與 zram 等輔助機制,並找出真正造成不必要記憶體壓力的服務。
如果在完成這些調校後,效能問題依然存在,下一步通常不會是更激進的核心參數,而是升級到更合適的硬體規格與更快的儲存架構。
Dataplugs 提供專屬伺服器、NVMe 高速儲存伺服器、優質網路連線與 24 小時全年無休技術支援,適合需要穩定高效基礎架構的企業與網站服務。若你正在評估專屬伺服器租用、NVMe 伺服器方案或相關基礎架構服務,歡迎瀏覽 Dataplugs 網站或聯絡 sales@dataplugs.com。
