贊成和反對為云實例設置交互空間的理由
譯文【51CTO.com快譯】許多Linux發行版(包括Red Hat)建議所有系統使用交換(swap)內存。然而,如果您看一下各種發行版的大多數云實例,會發現沒有交換內存。
概況介紹
交換內存在大多數系統上作為磁盤上的一個分區而存在。分區后,管理員用mkswap格式化分區,用swapon啟用它,內核立即看到可用的交換內存。沒有可用分區的系統可使用交換文件,這是用mkswap格式化并啟用的現有文件系統上的一個文件而已。
這兩種方法都很好,但在分區上設置交換內存可帶來更好的性能,因為您避免了現有分區上交換文件的開銷。
系統RAM不足時,Linux可將內存頁存儲到交換空間中,避免進程殺死、系統崩潰。磁盤的速度比系統RAM慢得多,這降低了系統性能,直到系統RAM釋放出來。如果內存使用量繼續攀升到系統RAM和交換內存完全耗盡的地步,致命的內存不足(OOM)就會出現,并開始殺死進程,直到足夠的RAM可用。
交換空間大小方面歷來的建議是系統RAM大小的兩倍。比如,為擁有1GB系統RAM的系統分配2GB的交換空間。該比率適用于較小的系統,無法適用于擁有數百GB系統 RAM的系統。
贊成為云設置交換空間的理由
微服務的興起促使許多公司部署大量較小的實例。較小的實例隨帶較少的系統RAM,這增加了致命的OOM出現的風險:殺死進程,直到系統有足夠的可用內存。
為這些系統添加交換空間在兩個方面有幫助:
首先,進程可以在高負載期間從系統RAM臨時轉入到交換空間。管理員可從監控系統了解這些事件,他們有時間分析系統上發生這種情況的原因。萬一內存泄漏,開發人員可以檢查進程,在進程仍運行期間了解出了什么問題。這也可能表明:隨著應用程序變龐大,管理員需要為它分配更大的實例。
其次,Linux內核會監視很少使用的內存頁,并將它們發送到交換空間,以保留寶貴的系統RAM。sysctl設置vm.swappiness可控制內核將內存頁發送到交換空間的愿望。這可以通過將最活躍的頁留在系統RAM中,而將很少使用的頁發送到交換內存來幫助云實例。
反對為云設置交換空間的理由
管理員禁止交換空間,因為他們可以自動用新的實例替換異常的實例。隨著時間的推移,他們的監控指標顯示因OOM導致應用程序下線而需要更換的實例有所增加。解決方案可能是更大的實例或進一步調查高負載下的內存泄漏。Systemd也會在可能的情況下快速重啟這些進程。
在云實例上選擇交換內存位置需要更全面的思考和規劃。在物理服務器上,本地連接的非易失性內存快速(NVMe) 磁盤上的交換內存足夠快,但是裝有外部存儲的云實例(比如AWS的彈性塊存儲即EBS)又如何?EBS上的性能取決于您選擇哪種類型的EBS和系統上的鄰居。系統出現RAM溢出時,遠程存儲系統上的交換內存可能導致實例性能欠佳。管理員可以選擇RAM溢出時忽略交換內存并替換這些實例,而不是應對性能糟糕的處理請求的服務器。
最后,許多云實例成為Kubernetes和OpenShift集群的一部分,它們在處理交換內存時面臨難題。關于適當處理交換內存,GitHub上有一個問題單。
部署使用交換內存的云實例
如果您認為提供交換內存對應用程序有益,cloud-init 使您能夠使用mounts模塊在第一次啟動時提供交換內存。只需為現有的cloud-config用戶數據添加幾行:
- swap:
- filename: /swapfile
- size: auto
- maxsize: 4294967296
該配置告訴cloud-init在/swapfile創建一個自動大小(接近或小于4GB)的交換文件。自動交換大小的調整格式在cloud-init的源代碼中:
- formulas = [
- # < 1G: swap = double memory
- (1 * GB, lambda x: x * 2),
- # < 2G: swap = 2G
- (2 * GB, lambda x: 2 * GB),
- # < 4G: swap = memory
- (4 * GB, lambda x: x),
- # < 16G: 4G
- (16 * GB, lambda x: 4 * GB),
- # < 64G: 1/2 M up to max
- (64 * GB, lambda x: x / 2),
- ]
Red Hat建議的交換大小略有不同:
- 2GB或更少的系統RAM:2x RAM
- 大于2GB至8GB: 1x RAM
- 大于8GB至 64GB:至少4 GB
- 大于64GB:至少4GB
您可以在cloud-config中用size:參數手動指定交換內存(以字節為單位)
- swap:
- filename: /swapfile
- size: 2147483648 # 2 GiB
配置現有云實例上的交換內存
針對現有實例,交換文件常常是啟用交換內存的最容易的方法。在該例中,將2GB交換文件放入到/swapfile中:
- # BTRFS only #################################################################
- # We must disable copy-on-write updates for swap files on btrfs file systems.
- # The 'swapon' step fails if you skip these steps.
- truncate -s 0 /swapfile
- chattr +C /swapfile
- # BTRFS only #################################################################
- # A 2 GiB swap file.
- dd if=/dev/zero of=/swapfile bs=1MiB count=2048
- # Set the correct permissions on the swap file.
- chmod 0600 /swapfile
- # Format the swapfile.
- mkswap /swapfile
- # Enable the swapfile.
- swapon /swapfile
- # Add it to /etc/fstab to enable it after reboot.
- echo "/swapfile none swap defaults 0 0" >> /etc/fstab
查看交換內存是否準備就緒:
- $ cat /proc/swaps
- Filename Type Size Used Priority
- /swapfile file 2097148 0 -2
原文標題:Analyzing cases for and against setting swap space on cloud instances,作者:Major Hayden (Red Hat)
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】