既要穩(wěn)也要省,容器資源該怎么分配?
眾所周知,假期出行,熱情高漲,需求增多也使得穩(wěn)定性保障壓力大。當(dāng)各個(gè)服務(wù)流量激增時(shí),資源負(fù)載壓力將會顯著提升。微觀上,單臺物理機(jī)的 CPU 利用率會大幅提升,單機(jī)上各個(gè)容器之間的爭搶會增加,性能受到影響。宏觀上,整個(gè)彈性云的熱點(diǎn)機(jī)器會增加,可供調(diào)度的資源會降低,容器調(diào)度和擴(kuò)容的失敗率會上升。
今年,在降本增效的大前提下,不額外增加計(jì)算型服務(wù)器采購,如何保障資源供給以及確保高壓場景下的容器穩(wěn)定性,對彈性云而言是個(gè)巨大的挑戰(zhàn)。為了提供更穩(wěn)定的容器服務(wù),彈性云全面梳理了容器服務(wù)資源保障的每一個(gè)環(huán)節(jié),提出了新分級保障體系,提供了明確的容器資源保障等級,在此基礎(chǔ)上,針對不同優(yōu)先級的容器提供相應(yīng)的資源和穩(wěn)定性保障。
早期彈性云容器體系帶來的超賣隱患
彈性云早期分級體系提供了1/2/3級容器等級,只是對容器的優(yōu)先級進(jìn)行了簡單的區(qū)分,并未將容器優(yōu)先級與底層的資源保障關(guān)聯(lián)在一起。容器服務(wù)在使用過程中,會遇到以下問題:
- 資源爭搶嚴(yán)重
- 業(yè)務(wù)延遲較高,毛刺較多
- 擴(kuò)容失敗概率較高
- 業(yè)務(wù)容量評估不準(zhǔn)
- 物理機(jī)數(shù)量難以評估
之所以會存在這些問題,實(shí)際上還是因?yàn)樵谫Y源層面沒有相應(yīng)的保障。從單機(jī)資源看,部分物理機(jī)的 CPU 使用率峰值過高,并且容器的 CPU 資源存在不同程度的超賣。
從集群資源來看,舊體系下 quota 與物理機(jī)資源缺乏關(guān)聯(lián),導(dǎo)致業(yè)務(wù)申請的 quota 僅僅停留在數(shù)字層面,不指導(dǎo)物理機(jī)資源的準(zhǔn)備。此外,quota 還缺乏管控,導(dǎo)致 quota 的申請與實(shí)際需求嚴(yán)重脫節(jié)。
造成上述諸多問題很重要的一個(gè)原因就是彈性云資源整體上是超賣的,且比較嚴(yán)重。
所謂的資源超賣,指的是資源的申請量>供給量,表現(xiàn)為單機(jī) & 集群方面均超賣。
- 單機(jī)層面,一臺物理機(jī)上運(yùn)行的所有容器的規(guī)格相加大于物理機(jī)所能提供的資源總量。
- 集群層面,服務(wù)資源的 quota 總和大于集群物理機(jī)資源總量。
從上圖中可以看到,單是1級服務(wù)申請的資源量,就已經(jīng)超過了物理機(jī)的總資源量。在集群和單機(jī)都超賣的情況下,早期的分級體系并沒有確立明確的超賣規(guī)則,使得舊體系容器運(yùn)行環(huán)境整體處于無序和不確定的狀態(tài)下。
兩大超賣解決思路帶來的四大收益
思路一:核心服務(wù)鏈路不超賣
所有的核心服務(wù)鏈路上的服務(wù)均1:1對應(yīng)物理機(jī)資源,不超賣。通過對機(jī)房1和機(jī)房2進(jìn)行簡單的統(tǒng)計(jì), 發(fā)現(xiàn)核心服務(wù)鏈路中網(wǎng)約車+兩輪車+代駕服務(wù)的申請量總和占據(jù)了所有服務(wù)總申請量的大約一半,且機(jī)房1核心服務(wù)的申請量已經(jīng)超過總CPU數(shù),機(jī)房2核心服務(wù)的申請量基本接近總CPU數(shù)。所以,核心服務(wù)不超賣受限于資源,方式不可行。
思路二:核心服務(wù)鏈路中最重要的服務(wù)不超賣
受限于資源,無法做到所有的核心服務(wù)鏈路中的服務(wù)都不超賣,那退一步,在物理資源有限的情況下,保障核心服務(wù)鏈路中最重要的服務(wù)不超賣,并在此基礎(chǔ)上,對于剩余的服務(wù)制定合理的超賣規(guī)則。
因此,彈性云需要重新制定分級保障體系,同時(shí)為新分級體系制定明確的超賣規(guī)則。超賣規(guī)則如下:
- 核心服務(wù)中20% -> S級服務(wù):不超賣
- 老1級 -> A級服務(wù):2倍超賣
- 老2/3級 -> B級服務(wù):4倍超賣
在新的超賣規(guī)則下,可以看到,機(jī)房1和機(jī)房2的總物理CPU量是基本能滿足需求的(機(jī)房2的資源申請量略微超出, 可以通過新增機(jī)器或是縮容來滿足要求)。
這樣的重新設(shè)計(jì)下,我們在2022年元旦前完成所有S級服務(wù)的接入,2022年國慶前完成網(wǎng)約車核心服務(wù)/兩輪車核心服務(wù)/代駕核心服務(wù)接入新體系??傮w來看,這樣的改變帶來了四大收益:
- 收益1:資源層面,S級服務(wù)CPU外部爭搶降低60% ~80%,A級服務(wù)CPU外部爭搶降低30~50%。
- 收益2:業(yè)務(wù)延遲方面,業(yè)務(wù)99分位延遲(均值)降低7% ~ 20%業(yè)務(wù)99分位延遲(最大值)降低5% ~ 15%。
- 收益3:容量方面,高峰期S級服務(wù)比之前多承載30%+流量,S級服務(wù)比之前能縮容30%+資源。
- 收益4:業(yè)務(wù)收益角度,高峰期CPU外部爭搶下降65%~75%,毛刺基本消失,業(yè)務(wù)延遲指標(biāo)下降5%~25%,業(yè)務(wù)壓測CPU外部爭搶下降60%~70%。
彈性云新分級保障體系總體架構(gòu)
為了支持新分級保障體系,彈性云從下到上,針對每一層中的相關(guān)組件都進(jìn)行開發(fā)改造,同時(shí)也包含了系統(tǒng)部 CMP 系統(tǒng)quota相關(guān)的開發(fā)工作,主要體現(xiàn)在操作系統(tǒng)層、k8s 調(diào)度層、kube-odin 層、服務(wù)樹和系統(tǒng)部 CMP 系統(tǒng)。
從上述架構(gòu)圖中可以看到,位于最底層的是機(jī)房的物理機(jī)資源,物理機(jī)分別位于不同的機(jī)房。
操作系統(tǒng)層
物理機(jī)之上是操作系統(tǒng)層,操作系統(tǒng)層面分為內(nèi)核態(tài)和用戶態(tài)。在內(nèi)核態(tài)新增特性上,新分級體系對 CPU 調(diào)度,內(nèi)存管理,IO 讀寫都進(jìn)行了針對性的開發(fā)和優(yōu)化。
CPU 調(diào)度:
- 新增優(yōu)先級權(quán)重概念,不同優(yōu)先級容器的調(diào)度權(quán)重不同,用于區(qū)分不同等級容器調(diào)度優(yōu)先級。
- 新增 CPU Burst 技術(shù),允許部分重要容器能短時(shí)間內(nèi)突破規(guī)格的上線,臨時(shí)使用超量的 CPU。
內(nèi)存管理:
- 新增優(yōu)先級回收技術(shù),優(yōu)先回收低優(yōu)先級容器的內(nèi)存,最后回收高優(yōu)先級容器內(nèi)存。
- 新增分級水位特性,減少系統(tǒng)內(nèi)存緊張時(shí)高優(yōu)先級容器內(nèi)存分配受阻。
IO 讀寫:
- 新增帶寬限速特性,支持對低優(yōu)先級容器的 IO 讀寫帶寬進(jìn)行限速,以減少對高優(yōu)先級容器的影響。
- 新增優(yōu)先級帶寬分配特性,支持按容器優(yōu)先級分配 IO 帶寬。
在用戶態(tài)新增特性上,操作系統(tǒng)用戶態(tài)針對新分級體系的支持主要體現(xiàn)在 Kubelet、IRMAS 和單機(jī)資源調(diào)度這幾個(gè)組件上。其中,kubelet 和 IRMAS 主要新增了新分級體系容器的識別、信息采集上報(bào)、單機(jī)資源配置、環(huán)境適配等工作。新增單機(jī)資源調(diào)度模塊實(shí)現(xiàn)了極端情況下單機(jī)資源的壓制和恢復(fù),以及與 k8s 調(diào)度聯(lián)動(dòng)等功能。
k8s 調(diào)度層
在 k8s 容器調(diào)度層,針對新分級體系新增了最小資源保障策略,指的是通過合理的調(diào)度,保障任何時(shí)候,容器均能獲得承諾的資源量。
容器分級均衡打散策略指的是保證一臺物理機(jī)上不會存在過多同一級別的容器,將不同等級的容器均勻打散到不同的物理機(jī)上。
分級容量資源大盤指的是資源大盤新增新分級體系容器支持,實(shí)時(shí)觀察新分級容器容量健康情況。
擴(kuò)容成功率保障指的是新增容量預(yù)估特性,優(yōu)化資源申請流程,實(shí)時(shí)監(jiān)控彈性云可供擴(kuò)容資源量,有效提高擴(kuò)容成功率。
kube-odin 層
kube-odin 層配合新分級體系也進(jìn)行了相關(guān)改動(dòng)和升級:
- 新增新等級接入平臺:包括新等級容器查詢操作相關(guān)接口的適配。
- 計(jì)費(fèi)管理模塊:新增新分級體系容器的計(jì)費(fèi)支持,支持多種計(jì)費(fèi)場景。
- 服務(wù) quota 操作:新增 quota 操作接口。
服務(wù)樹
服務(wù)樹在保持兼容性的基礎(chǔ)上,新增了新分級體系集群信息的支持。
系統(tǒng)部 CMP 系統(tǒng)
新體系容器的 quota 申請和使用由系統(tǒng)部 CMP 系統(tǒng)操作和記錄。
CMP 系統(tǒng)通過獲取業(yè)務(wù)申請的 quota 信息,能明確推算所需的物理機(jī)資源,更好實(shí)現(xiàn)物理機(jī)資源的保障。針對新體系容器的 quota 支持,CMP 系統(tǒng)新增了 quota 成本賬戶、quota 成本賬戶以及 quota 申請模塊。
- quota 成本賬戶:包含S級/A級/B級的 quota 信息。
- quota 管控模塊:對 quota 的使用量進(jìn)行追蹤和考察,以便進(jìn)行有效的資源管控。
- quota 申請模塊:規(guī)范 quota 申請流程,明確 quota 申請規(guī)則。
新分級體系三大重點(diǎn)資源保障
新分級體系立足于核心問題,在單機(jī)層面和集群層面都對容器申請的資源進(jìn)行相應(yīng)保障。
單機(jī)資源保障:CPU
新分級體系資源保障的其中一個(gè)重點(diǎn)為:保障容器的 CPU 資源任何時(shí)刻都能按超賣比所規(guī)定的有效交付。
在前文中,我們提到新體系容器的超賣規(guī)則為:S級不超賣,A級2倍超賣,B級4倍超賣。那對于不同等級的容器,可輕松得知其所需的物理 CPU 個(gè)數(shù)。新分級體系所需要保證的就是一臺物理機(jī)上所有容器經(jīng)過超賣比計(jì)算后得到的物理 CPU 個(gè)數(shù)必須小于物理機(jī)上的 CPU 個(gè)數(shù)。
圖片
上述的示例中,對于一個(gè)40核的物理機(jī),可用的 CPU 數(shù)為: 40*90%=36核 (90%為計(jì)算各種 agent 和調(diào)度損耗之后的有效核數(shù))。容器總共申請的核數(shù)為56核,經(jīng)過超賣比計(jì)算后得到的所需物理核為36,剛好滿足要求。
通過明確超賣比,根據(jù)超賣比準(zhǔn)備對應(yīng)物理 CPU 資源的方式,在高負(fù)載期間,如果所有的容器都滿載運(yùn)行,則物理機(jī)上的 CPU 資源將會按照超賣比承諾的比例進(jìn)行分配。在低負(fù)載時(shí)刻,算力足夠時(shí),由于機(jī)器整體空閑,容器之間幾乎不發(fā)生爭搶,此時(shí)容器可以正常使用 CPU。
單機(jī)資源保障:內(nèi)存
在物理機(jī)層面,內(nèi)存是所有容器之間共享的資源,傳統(tǒng)內(nèi)核沒有對容器進(jìn)行優(yōu)先級的劃分,所有容器的內(nèi)存使用對于內(nèi)核而言都是一視同仁。
內(nèi)存對容器性能的影響主要體現(xiàn)在內(nèi)存分配和內(nèi)存回收上。
內(nèi)存分級水位
操作系統(tǒng)內(nèi)核會監(jiān)控整個(gè)系統(tǒng)的內(nèi)存使用情況,當(dāng)可用內(nèi)存低于一定水位時(shí),就會阻塞內(nèi)存分配路徑,觸發(fā)內(nèi)存回收操作。
某些場景下,低優(yōu)先級容器可能大量申請內(nèi)存,導(dǎo)致內(nèi)存水位線降職 min 水位以下,物理機(jī)面臨內(nèi)存分配和回收時(shí),高優(yōu)容器將會受到影響,無法及時(shí)的分配內(nèi)存。
針對這個(gè)場景,內(nèi)核新增了內(nèi)存分級水位特性,允許按照優(yōu)先級設(shè)置不同的 min 水位。這樣,在申請內(nèi)存時(shí),低優(yōu)先級容器會先達(dá)到回收水位線觸發(fā)低優(yōu)先級容器的內(nèi)存回收,而高優(yōu)先級容器的內(nèi)存回收水位線較低,可以正常分配。
內(nèi)存按優(yōu)先級回收
由于原生內(nèi)存沒有對內(nèi)存進(jìn)行優(yōu)先級區(qū)分,因此當(dāng)內(nèi)核走到內(nèi)存回收路徑,會無差別的進(jìn)行內(nèi)存回收動(dòng)作。此時(shí),可能高優(yōu)先級容器的內(nèi)存被回收,而低優(yōu)先級容器內(nèi)存則完好無損。
新分級體系的目標(biāo)顯然是要在回收內(nèi)存的時(shí)候優(yōu)先回收低優(yōu)先級容器的內(nèi)存,這樣可以最大程度保護(hù)高優(yōu)先級容器的內(nèi)存,進(jìn)而保障高優(yōu)先級容器的性能表現(xiàn)。
圖片
基于優(yōu)先級回收的思想,內(nèi)核所做的就是識別容器優(yōu)先級,然后按照容器優(yōu)先級逐一回收內(nèi)存,直至內(nèi)存水位線恢復(fù)健康水平。
先回收B級容器的內(nèi)存
再回收A級容器的內(nèi)存
集群資源保障:quota
業(yè)務(wù)在申請容器服務(wù)的時(shí)候,一般需要指定單個(gè)容器的規(guī)格(CPU/內(nèi)存大小)和申請的數(shù)量。匯總服務(wù)總共所需的資源量,即為 quota,quota 管理的最小單位為成本賬戶。
圖片
可以看到,在新分級體系下,quota 按照容器優(yōu)先級,分為了對應(yīng)的S級/A級/B級 quota。quota 是用于描述業(yè)務(wù)的資源申請量,而對于彈性云和系統(tǒng)部而言, 則可以根據(jù) quota,進(jìn)行物理資源的準(zhǔn)備。例如對于某個(gè)成本賬戶,申請的 quota 如下所示:
圖片
我們可以清楚看到,業(yè)務(wù)申請的 quota 量與實(shí)際準(zhǔn)備物理機(jī)資源量之間的對應(yīng)關(guān)系。
通過建立并規(guī)范 quota 的申請和使用流程,新分級體系能根據(jù)資源超賣規(guī)則有效的將 quota 的申請量與后臺真實(shí)物理資源的準(zhǔn)備量結(jié)合起來,從而實(shí)現(xiàn)資源層面的強(qiáng)保障。另外,在 quota 體系逐步完善之后,還能根據(jù) quota 使用率和容器的 CPU 使用率對 quota 進(jìn)行有效的資源管控。
總結(jié)
很長一段時(shí)間,舊的彈性云分級體系存在資源爭搶、業(yè)務(wù)延遲、擴(kuò)容失敗、業(yè)務(wù)無法準(zhǔn)確評估容量、物理機(jī)數(shù)量難以評估等問題。這些問題的本質(zhì)是由于沒有制定明確的資源準(zhǔn)備和分配規(guī)則。
新分級體系立足于核心問題,提出了明確的資源超賣規(guī)則,在單機(jī)層面和集群層面都對容器申請的資源進(jìn)行相應(yīng)保障。在單機(jī)層面,保證了按超賣比轉(zhuǎn)化后實(shí)際的物理機(jī)資源不會超過物理機(jī)所提供的最大資源量,同時(shí)制定了明確的資源爭搶規(guī)則。在集群層面,建立并規(guī)范了 quota 申請流程,明確了 quota 與物理機(jī)資源之間的對應(yīng)關(guān)系,保障了資源的供給,同時(shí),也有效管控了 quota ,避免資源的浪費(fèi)。
通過在容器資源申請、容器調(diào)度、運(yùn)行時(shí)保障、資源管控等多個(gè)方面添加資源保障策略,彈性云新分級體系支持容器高效穩(wěn)定的運(yùn)行,確保了彈性云整體的穩(wěn)定性,也一定程度降低了物理機(jī)運(yùn)營成本。