自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何避免Java資源的過度配置

譯文 精選
開發(fā) 前端
本文將以水平擴(kuò)展與垂直擴(kuò)展為例,和您探討在Java應(yīng)用的環(huán)境中,如何通過調(diào)整資源和優(yōu)化云服務(wù)成本,以避免過度的配置。

譯者 | 陳峻

審校 | 重樓

作為開發(fā)人員,我們經(jīng)常會陷入兩難的局面:我們既希望在應(yīng)用中使用閃亮的新工具或代碼庫,又忌憚在部署到生產(chǎn)環(huán)境之后可能出現(xiàn)的未知問題。畢竟,沒有人希望自己的手機(jī)老是在半夜叮咚作響,更不用說來自為了保持應(yīng)用能夠以多少個(gè)9高可用性運(yùn)行的壓力了。這往往塑造了開發(fā)人員在應(yīng)用構(gòu)建和編程時(shí)具有創(chuàng)新精神,卻在運(yùn)營場景中過于保守的狀況。

其中,一種最為典型的現(xiàn)象便是“過度配置(overprovisioning)”,即:在云計(jì)算環(huán)境中,為應(yīng)用的部署配備了過多的算力(通常是CPURAM),以確保應(yīng)用擁有足夠的資源,來啟動(dòng)或應(yīng)對運(yùn)行過程中出現(xiàn)的峰值。顯然,既然是過度,我們就需要設(shè)法降低此類過度配置的需求,從而節(jié)省大量且寶貴的云服務(wù)資源的支出。下面,我將和您一起探討在Java應(yīng)用的環(huán)境中如何避免過度的配置。

應(yīng)用負(fù)載從來都不穩(wěn)定

正如大多數(shù)開發(fā)和DevOps人員切實(shí)感受的那樣,在一天或一周之內(nèi),應(yīng)用的流量負(fù)載隨著時(shí)間的推移,從來就是不均勻的。在閑時(shí),應(yīng)用無需為不多的用戶請求提供服務(wù)或處理數(shù)據(jù),而在大量用戶頻繁對應(yīng)用產(chǎn)生高利用率時(shí),應(yīng)用實(shí)例會在如下情況下,無法被及時(shí)推送給應(yīng)用,進(jìn)而出現(xiàn)不穩(wěn)定的峰值:

  • 響應(yīng)延遲時(shí)間過長,無法滿足服務(wù)級別協(xié)議(SLA)。
  • 內(nèi)存的過度使用,導(dǎo)致Java虛擬機(jī)(JVM)中的垃圾回收器(Garbage CollectorGC)出現(xiàn)抖動(dòng)。
  • 缺少CPU線程、網(wǎng)絡(luò)或文件句柄等資源,導(dǎo)致傳入的請求被拒絕,更不會被予以處理。

其中,后兩個(gè)問題會導(dǎo)致應(yīng)用出現(xiàn)毫無響應(yīng)的狀態(tài),因此在測試過程中,開發(fā)人員很容易注意到應(yīng)用的負(fù)載上限,以及時(shí)擴(kuò)展所需要的CPU內(nèi)核和內(nèi)存數(shù)量。而為了避免再次出現(xiàn)峰值,他們通常會趨向于過度添加CPU和內(nèi)存的數(shù)量,以求安全穩(wěn)定地滿足用戶需求。例如,開發(fā)團(tuán)隊(duì)往往會配置比已發(fā)現(xiàn)的峰值高出5%50%的額外云計(jì)算余量。

但是,過度的預(yù)配置也會增加應(yīng)用在運(yùn)行過程中的大量成本。畢竟對于正在運(yùn)行的云虛擬機(jī)而言,固有的CPU(核心或虛擬CPU)和內(nèi)存,通常并不會自我彈性調(diào)整。這就意味著無論應(yīng)用是否會完全使用到已配置的容量與算力,您都需要為此付費(fèi)。

為此,我們需要使用合適的策略,來管控過度的預(yù)配,以節(jié)省不必要的云計(jì)算支出。下面,我將向您介紹“垂直擴(kuò)展(Vertical Scaling)”和“水平擴(kuò)展(Horizontal Scaling)”這兩種擴(kuò)展模型,以及每種模型的具體策略。而且此類策略和技術(shù)既可以適用于跑在云端的應(yīng)用,也能夠適合本地運(yùn)行的環(huán)境。

垂直擴(kuò)展

垂直擴(kuò)展旨在讓應(yīng)用通過簡單的策略擴(kuò)展,以處理更多的負(fù)載請求。不過它不如后面講到的水平擴(kuò)展那么靈活。垂直擴(kuò)展意味著向物理或虛擬服務(wù)器上的應(yīng)用,添加更多的CPU內(nèi)核和更多的內(nèi)存(如果應(yīng)用屬于I/O密集型,則需要添加更多、更快的SSD存儲)。當(dāng)然,此類擴(kuò)展往往需要停止并重啟應(yīng)用。而有時(shí)候這對于應(yīng)用來說是不可接受的。

水平擴(kuò)展

多年來,彈性計(jì)算(Elastic Compute)一直被奉為可擴(kuò)展應(yīng)用開發(fā)的“圣杯”。而水平擴(kuò)展是彈性計(jì)算的基礎(chǔ)。水平擴(kuò)展意味著通過添加更多的服務(wù)器(各自具有一套完備的CPU和內(nèi)存)來增加應(yīng)用的承載能力,而不是向現(xiàn)有服務(wù)器添加更多的CPU內(nèi)核和內(nèi)存。

不過,與垂直擴(kuò)展相比,水平擴(kuò)展更為復(fù)雜,需要更多的規(guī)劃和更多的外部(對應(yīng)用而言)設(shè)置。而且,由于必須引入路由層,這就意味著會產(chǎn)生更多的處理和網(wǎng)絡(luò)開銷,因此其效率不如垂直擴(kuò)展。

在針對Java應(yīng)用的水平擴(kuò)展部署中,我們可以通過自動(dòng)檢測負(fù)載,和啟停應(yīng)用節(jié)點(diǎn)實(shí)例的方式,按需增減資源,進(jìn)而避免過度的配置。而且,就算在較短的時(shí)間內(nèi),出現(xiàn)了被過度預(yù)置的資源,其數(shù)量也會很少(主要取決于您的配置方式)。

更好的負(fù)載測試和估計(jì)

性能測試通常被認(rèn)為是一種最困難的測試類型。它需要開發(fā)團(tuán)隊(duì)對整個(gè)應(yīng)用及其所有連接的服務(wù),具有深入的了解。他們往往需要通過全面思考和反復(fù)調(diào)整,才能正確地生成模擬生產(chǎn)環(huán)境的負(fù)載、以及應(yīng)用數(shù)據(jù)。顯然,為了與生產(chǎn)環(huán)境的特征保持同步,測試環(huán)境的性能設(shè)置是一項(xiàng)勞動(dòng)密集型工作。

Java應(yīng)用而言,開發(fā)人員經(jīng)常會在確定應(yīng)用峰值性能要求時(shí),通過執(zhí)行三項(xiàng)操作,來實(shí)現(xiàn)更加貼近真實(shí)情況的配置調(diào)整:

1. 測量服務(wù)器和JVMCPU和內(nèi)存的利用率

通常,開發(fā)人員需要查看服務(wù)器(或虛擬機(jī))的CPU與內(nèi)存的利用率,以確定二者為處理峰值負(fù)載所需的數(shù)字。其中,在JVM中,他們可以使用工具去監(jiān)控如下兩項(xiàng)指標(biāo),以設(shè)置正確的級別:

  • JVM GC監(jiān)控:它有助于檢測那些由于內(nèi)存太少所導(dǎo)致的、在JVM進(jìn)入GC場景時(shí)CPU的使用率過高的情況。同時(shí),它也有助于檢測被分配了過多內(nèi)存的位置。這些位置因引發(fā)GC的暫停時(shí)間過長,從而導(dǎo)致延遲時(shí)間明顯長于預(yù)期。對此,減少不需要的內(nèi)存可以節(jié)省此方面的開銷。
  • JVM線程監(jiān)控:它有助于檢測何時(shí)出現(xiàn)由于CPU不足而導(dǎo)致的響應(yīng)時(shí)間過長或無響應(yīng)的情況。同時(shí),它也有助于檢測那些過多的空閑線程,并能通過減少分配的內(nèi)核數(shù)量,以節(jié)省開銷。

2. 新的JVM版本比舊版本提供更好的性能

在從JDK 1117,再到21的測試中,我們發(fā)現(xiàn)每個(gè)JVM版本的CPU使用率都有所提升。與之相對的應(yīng)用代碼則可能需要稍作調(diào)整,特別是當(dāng)您的應(yīng)用原先基于早于Java 11的版本時(shí)。

同時(shí),不同的GC算法也能提升云端VM的效率,雖然這在很大程度上取決于應(yīng)用的內(nèi)存利用率。例如,那些執(zhí)行大數(shù)據(jù)處理與轉(zhuǎn)換的應(yīng)用,會具有與RESTful應(yīng)用不同的GC配置文件。

3. 了解JVM的工作原理

下圖顯示了一個(gè)典型Java應(yīng)用,從JVM的啟動(dòng)到它是如何隨時(shí)間推移而執(zhí)行的過程。在啟動(dòng)時(shí),由于需要啟動(dòng)JVM、加載各種類,所以其CPU的使用率較高。之后,該應(yīng)用框架(如,Spring Boot)相繼進(jìn)入啟動(dòng)、初始化并達(dá)到“準(zhǔn)備處理請求”的狀態(tài)。

請注意圖中峰值上方一行的區(qū)域。該區(qū)域顯示了有多少顆CPU被過度預(yù)配置給了該應(yīng)用的VM部署,以應(yīng)對突發(fā)性高負(fù)載。隨著JVM的實(shí)時(shí)(just-in-time,JIT)編譯器優(yōu)化代碼的生效,該應(yīng)用的性能會逐漸提高。也就是說,它能夠使用更少的CPU來處理相同數(shù)量的負(fù)載。最終,在JIT編譯器的優(yōu)化效果下,JVM達(dá)到了較低的CPU利用率基準(zhǔn)。那么,為應(yīng)用保留下來的富余資源,就浪費(fèi)了您為其分配的CPU。顯然,這些資金本來是有機(jī)會可以被節(jié)省的。

鑒于使用高性能JVM可以讓您減少(或完全消除)過度配置的可能性,我們有必要通過了解此曲線及其對應(yīng)用的影響,來減少分配給應(yīng)用VM實(shí)例的資源。也就是說,一旦知曉了長尾峰值的所在位置,我們就可以降低其頂線(即“過度配置”),以便分配更少的CPU內(nèi)核,并節(jié)省云計(jì)算的租用成本。

減小應(yīng)用的體積

我們的應(yīng)用架構(gòu)隨著從單體模式轉(zhuǎn)為微服務(wù)(甚至更小的云服務(wù)功能),應(yīng)用的體積規(guī)模也變得越來越小。雖然這些不同的架構(gòu)各有利弊,但在云服務(wù)成本優(yōu)化的背景下,使用水平擴(kuò)展來達(dá)到彈性計(jì)算的縮減無疑是最好的實(shí)現(xiàn)方式。

應(yīng)用體積的縮減,也能夠減少需要分配給應(yīng)用每個(gè)實(shí)例的CPU和內(nèi)存的數(shù)量。而且,這種增量擴(kuò)展方式不但實(shí)現(xiàn)了更高效的資源使用,也反過來達(dá)到了對云計(jì)算成本更精細(xì)化的控制效果??梢哉f,部署的單元越小,在縱向擴(kuò)展時(shí)所支付的費(fèi)用就越少。當(dāng)然,這里主要討論的是自動(dòng)化的擴(kuò)展方式。

使用自動(dòng)化擴(kuò)展

說到自動(dòng)化擴(kuò)展,它是一種根據(jù)應(yīng)用負(fù)載的增加或減少,自動(dòng)化地增減應(yīng)用實(shí)例節(jié)點(diǎn)的能力。通過云服務(wù)成本的優(yōu)化,我們可以根據(jù)所構(gòu)建的應(yīng)用群集環(huán)境的不同,采用不同的自動(dòng)化擴(kuò)展選項(xiàng)。目前,最流行的自動(dòng)化擴(kuò)展平臺當(dāng)屬Kubernetes。當(dāng)然,它也給標(biāo)準(zhǔn)的固定分布式集群(fixed-distributed-cluster)部署帶來了不小的復(fù)雜性。

Kubernetes更為簡單的替代方案是容器即服務(wù)(CaaS),例如AWSFargate、GoogleCloud Run、以及MicrosoftAzure 容器。這些部署服務(wù)提供了一些更加簡單的應(yīng)用部署方法,并通過將Docker容器中的應(yīng)用提供給服務(wù),來自動(dòng)處理向上和向下擴(kuò)縮容。CaaS解決方案的缺點(diǎn)在于,它們的成本會高于標(biāo)準(zhǔn)的VM,并且可能會比托管式的Kubernetes部署的成本還要高。

結(jié)論

總的說來,減少過度配置可以幫助我們節(jié)省應(yīng)用在云服務(wù)中的成本開銷。無論您使用上述哪種策略來減少過度配置,了解Java應(yīng)用的CPU和內(nèi)存配置文件,無疑將有助于您掌握應(yīng)用在啟動(dòng)和運(yùn)行時(shí)的性能狀況。目前,有一種Azul Platform Prime不但可以為大中型Java應(yīng)用部署提供更為高效的高性能JVM,而且具有如下特點(diǎn):

  • 由于具有先進(jìn)的C4 GC、底層優(yōu)化和先進(jìn)的Falcon JIT編譯器,它比其他JVM能夠更好地處理峰值負(fù)載。
  • 使用ReadyNow以避免JIT加速(即由JIT帶來的高CPU使用率)。
  • 其處理峰值方式不但可以處理更高的峰值負(fù)載,而且能夠提供更低的延遲。

如果您對本文討論的話題感興趣的話,請參閱IDC的白皮書--《優(yōu)化Java應(yīng)用性能以改善業(yè)務(wù)成果和云成本效率》,以了解更多信息。

譯者介紹

陳峻(Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項(xiàng)目實(shí)施經(jīng)驗(yàn),善于對內(nèi)外部資源與風(fēng)險(xiǎn)實(shí)施管控,專注傳播網(wǎng)絡(luò)與信息安全知識與經(jīng)驗(yàn)。

原文標(biāo)題:How to Avoid Overprovisioning Java Resources,作者:Pratik Patel

責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2021-05-20 08:51:33

設(shè)計(jì)驅(qū)動(dòng)數(shù)據(jù)庫

2011-06-20 14:44:49

網(wǎng)站優(yōu)化

2019-02-22 09:05:04

SwapNVMe設(shè)備

2016-09-14 11:11:22

云計(jì)算

2023-02-08 17:00:07

IF 語句技巧代碼

2024-08-08 11:13:05

2010-11-19 17:42:13

2009-08-17 15:55:32

ASP.NET緩存

2024-04-02 11:22:01

死鎖Java并發(fā)

2021-10-19 22:30:01

云安全云計(jì)算配置

2015-10-10 11:23:17

Java常量反模式

2015-09-22 10:56:13

Java反模式

2023-05-08 23:15:26

2021-03-02 09:45:07

java循環(huán)依賴開發(fā)技術(shù)

2011-03-23 14:42:47

CPU過度消耗

2016-04-08 09:24:01

脆弱代碼更新

2015-07-30 10:12:32

JavaNullAssert

2017-10-20 10:19:49

Kotlin語言陷阱

2022-04-19 20:51:20

軟件開發(fā)耦合代碼

2019-11-21 08:51:56

Java異常控制流
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號