贊成和反對(duì)為云實(shí)例設(shè)置交互空間的理由
譯文【51CTO.com快譯】許多Linux發(fā)行版(包括Red Hat)建議所有系統(tǒng)使用交換(swap)內(nèi)存。然而,如果您看一下各種發(fā)行版的大多數(shù)云實(shí)例,會(huì)發(fā)現(xiàn)沒有交換內(nèi)存。
概況介紹
交換內(nèi)存在大多數(shù)系統(tǒng)上作為磁盤上的一個(gè)分區(qū)而存在。分區(qū)后,管理員用mkswap格式化分區(qū),用swapon啟用它,內(nèi)核立即看到可用的交換內(nèi)存。沒有可用分區(qū)的系統(tǒng)可使用交換文件,這是用mkswap格式化并啟用的現(xiàn)有文件系統(tǒng)上的一個(gè)文件而已。
這兩種方法都很好,但在分區(qū)上設(shè)置交換內(nèi)存可帶來更好的性能,因?yàn)槟苊饬爽F(xiàn)有分區(qū)上交換文件的開銷。
系統(tǒng)RAM不足時(shí),Linux可將內(nèi)存頁存儲(chǔ)到交換空間中,避免進(jìn)程殺死、系統(tǒng)崩潰。磁盤的速度比系統(tǒng)RAM慢得多,這降低了系統(tǒng)性能,直到系統(tǒng)RAM釋放出來。如果內(nèi)存使用量繼續(xù)攀升到系統(tǒng)RAM和交換內(nèi)存完全耗盡的地步,致命的內(nèi)存不足(OOM)就會(huì)出現(xiàn),并開始?xì)⑺肋M(jìn)程,直到足夠的RAM可用。
交換空間大小方面歷來的建議是系統(tǒng)RAM大小的兩倍。比如,為擁有1GB系統(tǒng)RAM的系統(tǒng)分配2GB的交換空間。該比率適用于較小的系統(tǒng),無法適用于擁有數(shù)百GB系統(tǒng) RAM的系統(tǒng)。
贊成為云設(shè)置交換空間的理由
微服務(wù)的興起促使許多公司部署大量較小的實(shí)例。較小的實(shí)例隨帶較少的系統(tǒng)RAM,這增加了致命的OOM出現(xiàn)的風(fēng)險(xiǎn):殺死進(jìn)程,直到系統(tǒng)有足夠的可用內(nèi)存。
為這些系統(tǒng)添加交換空間在兩個(gè)方面有幫助:
首先,進(jìn)程可以在高負(fù)載期間從系統(tǒng)RAM臨時(shí)轉(zhuǎn)入到交換空間。管理員可從監(jiān)控系統(tǒng)了解這些事件,他們有時(shí)間分析系統(tǒng)上發(fā)生這種情況的原因。萬一內(nèi)存泄漏,開發(fā)人員可以檢查進(jìn)程,在進(jìn)程仍運(yùn)行期間了解出了什么問題。這也可能表明:隨著應(yīng)用程序變龐大,管理員需要為它分配更大的實(shí)例。
其次,Linux內(nèi)核會(huì)監(jiān)視很少使用的內(nèi)存頁,并將它們發(fā)送到交換空間,以保留寶貴的系統(tǒng)RAM。sysctl設(shè)置vm.swappiness可控制內(nèi)核將內(nèi)存頁發(fā)送到交換空間的愿望。這可以通過將最活躍的頁留在系統(tǒng)RAM中,而將很少使用的頁發(fā)送到交換內(nèi)存來幫助云實(shí)例。
反對(duì)為云設(shè)置交換空間的理由
管理員禁止交換空間,因?yàn)樗麄兛梢宰詣?dòng)用新的實(shí)例替換異常的實(shí)例。隨著時(shí)間的推移,他們的監(jiān)控指標(biāo)顯示因OOM導(dǎo)致應(yīng)用程序下線而需要更換的實(shí)例有所增加。解決方案可能是更大的實(shí)例或進(jìn)一步調(diào)查高負(fù)載下的內(nèi)存泄漏。Systemd也會(huì)在可能的情況下快速重啟這些進(jìn)程。
在云實(shí)例上選擇交換內(nèi)存位置需要更全面的思考和規(guī)劃。在物理服務(wù)器上,本地連接的非易失性內(nèi)存快速(NVMe) 磁盤上的交換內(nèi)存足夠快,但是裝有外部存儲(chǔ)的云實(shí)例(比如AWS的彈性塊存儲(chǔ)即EBS)又如何?EBS上的性能取決于您選擇哪種類型的EBS和系統(tǒng)上的鄰居。系統(tǒng)出現(xiàn)RAM溢出時(shí),遠(yuǎn)程存儲(chǔ)系統(tǒng)上的交換內(nèi)存可能導(dǎo)致實(shí)例性能欠佳。管理員可以選擇RAM溢出時(shí)忽略交換內(nèi)存并替換這些實(shí)例,而不是應(yīng)對(duì)性能糟糕的處理請(qǐng)求的服務(wù)器。
最后,許多云實(shí)例成為Kubernetes和OpenShift集群的一部分,它們?cè)谔幚斫粨Q內(nèi)存時(shí)面臨難題。關(guān)于適當(dāng)處理交換內(nèi)存,GitHub上有一個(gè)問題單。
部署使用交換內(nèi)存的云實(shí)例
如果您認(rèn)為提供交換內(nèi)存對(duì)應(yīng)用程序有益,cloud-init 使您能夠使用mounts模塊在第一次啟動(dòng)時(shí)提供交換內(nèi)存。只需為現(xiàn)有的cloud-config用戶數(shù)據(jù)添加幾行:
- swap:
- filename: /swapfile
- size: auto
- maxsize: 4294967296
該配置告訴cloud-init在/swapfile創(chuàng)建一個(gè)自動(dòng)大小(接近或小于4GB)的交換文件。自動(dòng)交換大小的調(diào)整格式在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或更少的系統(tǒng)RAM:2x RAM
- 大于2GB至8GB: 1x RAM
- 大于8GB至 64GB:至少4 GB
- 大于64GB:至少4GB
您可以在cloud-config中用size:參數(shù)手動(dòng)指定交換內(nèi)存(以字節(jié)為單位)
- swap:
- filename: /swapfile
- size: 2147483648 # 2 GiB
配置現(xiàn)有云實(shí)例上的交換內(nèi)存
針對(duì)現(xiàn)有實(shí)例,交換文件常常是啟用交換內(nèi)存的最容易的方法。在該例中,將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
查看交換內(nèi)存是否準(zhǔn)備就緒:
- $ cat /proc/swaps
- Filename Type Size Used Priority
- /swapfile file 2097148 0 -2
原文標(biāo)題:Analyzing cases for and against setting swap space on cloud instances,作者:Major Hayden (Red Hat)
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】