作者:啟超 汪喆 譚霖等
美團Hulk調(diào)度系統(tǒng)團隊在集群服務質(zhì)量與資源利用率運營的長期落地實踐中,基于業(yè)務實際場景,自主設計研發(fā)了集群負載自動調(diào)控系統(tǒng)(LAR)以及配套的運營體系,在提升集群整體資源利用率的同時保障了業(yè)務服務質(zhì)量。
隨著云計算時代的到來,大規(guī)模資源運營面臨著如何在保障服務質(zhì)量的同時提升資源利用率(降本增效)。但這兩個目標的達成在當前的軟硬件技術水平上,是相互矛盾的。本文介紹的LAR(Load Auto-Regulator)系統(tǒng),即是探索這兩個矛盾方向間的平衡點,在保證質(zhì)量的前提下,提升資源的利用率。LAR通過資源分級池化,完備的QoS保障機制,做到精細化的單機資源調(diào)度與隔離,在提升整體資源利用率的同時,能夠根據(jù)服務的優(yōu)先級和特征保證服務的質(zhì)量。LAR的整體設計可以適用于多個場景,包括在線場景和混部場景。目前LAR已經(jīng)在美團在線場景中投入生產(chǎn)使用,并取得了較好的效果。
1 背景
1.1 云計算時代數(shù)據(jù)中心資源規(guī)模爆炸
云計算時代的到來,資源規(guī)?;\營成為必然的選擇,大規(guī)模數(shù)據(jù)中心成為當今企業(yè)級互聯(lián)網(wǎng)應用和云計算系統(tǒng)的關鍵支撐。據(jù)權威報告指出,2020年全球數(shù)據(jù)中心的服務器總量將達到1800萬臺,并且正以每年100萬臺的速度增長。然而,伴隨著數(shù)據(jù)中心的急速擴容,資源利用率卻始終處于較低狀態(tài)。統(tǒng)計數(shù)據(jù)表明,目前全球數(shù)據(jù)中心資源利用率僅為10%~20%,如此低的資源利用率意味著數(shù)據(jù)中心大量的資源浪費,進而導致目前數(shù)據(jù)中心的成本效率極低。
1.2 資源利用率提升影響巨大
在國家戰(zhàn)略層面,數(shù)據(jù)中心資源利用率低,造成大量的資源浪費,包括物力資源和電能浪費,這與可持續(xù)發(fā)展的理念是沖突的。2021年7月,工業(yè)和信息化部印發(fā)《新型數(shù)據(jù)中心發(fā)展三年行動計劃(2021-2023年)》,提出用3年時間,基本形成布局合理、技術先進、綠色低碳、算力規(guī)模與數(shù)字經(jīng)濟增長相適應的新型數(shù)據(jù)中心發(fā)展格局。計劃中重點提出建設綠色高效的數(shù)據(jù)中心目標,將資源利用率提升作為核心目標。
在公司經(jīng)營上,提升資源利用率可以提升運營效率降低運營成本。谷歌在2019年發(fā)表的論文“Borg-the Next Generation”披露其2011年數(shù)據(jù)中心核心集群(統(tǒng)計1.2萬臺服務器)的月平均CPU利用率在30%左右,而到2019年,其數(shù)據(jù)中心核心集群(統(tǒng)計9.6萬臺服務器)的月平均CPU利用率達到了50%左右,8年時間內(nèi)提升了約20%,資源使用效能的大幅提升,幫助谷歌節(jié)省成本累計數(shù)十億美元。國內(nèi)各大云服務提供商和互聯(lián)網(wǎng)公司,目前投入大量人力物力去做提升數(shù)據(jù)中心資源利用率的工作,包括阿里巴巴、騰訊、百度、華為等公司均陸續(xù)提出了比較完善的資源利用率提升方案,在內(nèi)部落地實踐并取得了一定的成績。
提升資源利用率,降本增效,能給數(shù)據(jù)中心節(jié)省大量的成本。以數(shù)百萬核CPU的規(guī)模的數(shù)據(jù)中心為例,整體資源利用率每提升1個百分點,節(jié)省成本(包括采購成本和運營成本,運營成本主要是機房租金、電費以及運維費用等)每年將達到數(shù)千萬元。如果考慮到集群運營人工成本等,隨著資源規(guī)模持續(xù)擴大,這個收益將持續(xù)增長。持續(xù)提升機器的資源利用率,降低單核成本,提升集群服務質(zhì)量,是美團Hulk團隊的核心目標之一。針對用戶對降本增效的需求,Hulk調(diào)度團隊在集群資源利用率提升和服務質(zhì)量保障方向率先做出相關探索,提出了一系列的建設方案,并推進落地。本文重點介紹在Hulk整體資源利用率運營體系中的核心系統(tǒng)集群負載自動均衡管理系統(tǒng)。
2 什么是LAR?
LAR全稱是集群負載自動均衡管理系統(tǒng)(LAR,Load Auto-Regulator),是美團Hulk團隊基于Kubernetes研發(fā)的容器編排系統(tǒng)。LAR在Kubernetes之上,通過提供分級的QoS管理機制和負載管控能力,實現(xiàn)從時空維度對資源的精確調(diào)度分配管理。
2.1 目標與挑戰(zhàn)
提升資源利用率從大的層面講,符合國家降本增效、節(jié)能減排的綠色低碳發(fā)展戰(zhàn)略;從小的層面講,通過提升資源利用率,可以為企業(yè)每年節(jié)省數(shù)億的成本,并且降低整體系統(tǒng)復雜度及運維風險。提升資源利用率,竟有這么大的收益?可能超乎絕大多數(shù)人的預料。按照很多同學的理解,通過非常簡單的操作即可達成這個目標——提高單機的服務部署密度。但如此簡單的操作,為何全球數(shù)據(jù)中心資源利用率僅為10%~20%呢?利用率如此之低,這里最為關鍵的因素有三個:
- 部署到同一臺物理機的服務在資源使用上存在相互干擾。
- 服務在流量上存在高低峰,反映在資源使用上也有高低峰。
- 關鍵核心在線服務的服務質(zhì)量下降無法接受。
整體來說,從當前硬件架構和操作系統(tǒng)設計上看,雖然在資源分配上,理論上是進程作為獨立的分配單位,資源相互隔離,但在實際使用上卻是共享的,典型的包括CPU、網(wǎng)卡、I/O總線、Cache以及內(nèi)核軟件資源等。當然,軟硬件如此設計本身就是為了提升整體資源利用的效率,提升整體任務的處理能力。而提升資源利用率,從本質(zhì)上講,是提升資源的復用共享,避免資源閑置浪費。但是提升資源共享復用水平,多少都會影響進程運行的效率,且隨著復用水平越高,影響越大。
操作系統(tǒng)提供了一系列的資源隔離保障措施,意圖降低服務在資源使用時彼此間的干擾,一定程度上在保障資源共享復用的同時提升了資源隔離的能力,但由于底層硬件架構上的限制,這種提升是有限的。而對于大多數(shù)業(yè)務的在線服務,服務質(zhì)量的波動,比如延時增加、TPS下降等是難以接受的,特別是類似支付、訂單類的核心服務。這是造成了當前數(shù)據(jù)中心整體資源利用率低的根本矛盾:一方面是在線業(yè)務對資源競爭導致的服務質(zhì)量下降是難以容忍的,在線服務質(zhì)量必須保障,另一方面當前大規(guī)模的數(shù)據(jù)中心在整體上資源利用率水平低,運營成本居高不下,亟需提升資源利用率,而提升資源利用率、降低運營成本會直接影響到在線業(yè)務服務質(zhì)量。
一方面,“服務質(zhì)量”關系著業(yè)務的服務體驗,直接關系到營收,而另一方面,“提升資源利用率”,又有著巨大的成本空間可以降低,能夠增加整體的收益。二者對于企業(yè)來說,就像“魚與熊掌不可兼得”的矛盾。
圖1 美團在線服務雙峰特征
當前業(yè)界,很多企業(yè)和研究單位都在投入大量的資源來研究如何解決這一矛盾,努力實現(xiàn)整體利益的最大化。
LAR(Load Auto-Regulator),聚焦于“資源利用率提升”和“服務質(zhì)量保障”這一矛盾的解決,整個系統(tǒng)設計的根本出發(fā)點,即是在集群資源運營上要實現(xiàn)資源利用率和服務質(zhì)量的雙重保障,解決數(shù)據(jù)中心運營中的“魚與熊掌不可兼得”難題和挑戰(zhàn)。
2.2 系統(tǒng)架構
提升資源利用率的本質(zhì)是提升資源共享復用水平,而保障服務質(zhì)量則需要通過資源隔離能力,保障服務的性能穩(wěn)定。針對上述兩個根本點,LAR在Kubernetes上提出兩個核心創(chuàng)新點:
- 資源池化分級
通過將單機資源劃分到不同的資源池,提升資源在池內(nèi)的共享復用水平。
不同的資源池之間有不同的優(yōu)先級,并提供不同的資源隔離水平(資源隔離水平越高,資源共享復用水平越低)。
資源在不同優(yōu)先級的資源池之間根據(jù)優(yōu)先級和資源池的資源負載水平流動,優(yōu)先保障高優(yōu)資源池服務的資源使用,從而保障其服務質(zhì)量。
- 動態(tài)負載和靜態(tài)資源映射
- 資源的分配,本質(zhì)上是負載空間的分配。假設單機整體CPU利用率小于50%的情況下,運營在其上的服務的服務質(zhì)量不會有影響,那么這個機器的靜態(tài)資源其實對應的就是節(jié)點50% CPU利用率的負載空間。換個角度看,就是無論如何調(diào)度分配資源,只要這個節(jié)點的負載不超過50%即可。
- 業(yè)務靜態(tài)的資源申請,根據(jù)服務的特征經(jīng)過調(diào)度計算后,服務被放入對應的資源池,而資源池的資源配置則根據(jù)池內(nèi)所有服務的實際負載進行資源配置,并可以實時地根據(jù)負載調(diào)整資源配置,實現(xiàn)靜態(tài)資源分配和動態(tài)負載的映射管理。
上述兩個核心創(chuàng)新點在幫助提升資源共享復用的同時,通過負載管理和操作系統(tǒng)提供的單機資源隔離能力,實現(xiàn)分級的服務質(zhì)量保障的機制,具有很強的通用性,應用場景也比較廣泛。結合上述的核心創(chuàng)新點,LAR的整體設計目標包括:
- 相較于Kubernetes,提供分級可編輯更細致靈活的QoS服務質(zhì)量保障機制,充分保障核心服務的資源供給及服務質(zhì)量。
- 建立負載與資源之間的映射關系,解決Kubernetes基于Request的靜態(tài)資源調(diào)度難以解決的節(jié)點負載問題,降低負載動態(tài)調(diào)度的整體復雜度。
- 提供靈活且具有一定通用性的單機資源調(diào)度能力,實現(xiàn)不同服務間資源的錯峰復用。
- 提供更強力的資源隔離能力,保障核心在線業(yè)務的服務質(zhì)量前提下,提升整體的資源利用率。
圖2 Hulk資源利用率運營體系
在Hulk整體資源利用率運營體系中,LAR基于Kubernetes擴展,負責單個集群的資源管理和調(diào)度。相較于Native的Kubernetes,LAR提供分級可編輯更細致靈活的QoS服務質(zhì)量保障機制,充分保障不同服務的資源供給及服務質(zhì)量。
而LAR依托于底層的MTOS提供的資源隔離能力和調(diào)度資源Buffer池的物理機彈性伸縮能力,并根據(jù)集群運營數(shù)據(jù)中心和服務畫像提供的集群及服務等特征,向上提供精細化的動態(tài)資源調(diào)整、負載管理以及QoS服務質(zhì)量保障能力。統(tǒng)一調(diào)度系統(tǒng)在LAR之上,根據(jù)LAR提供的動態(tài)資源及服務質(zhì)量數(shù)據(jù),完成不同應用場景下,包括在線服務和離線服務的跨集群統(tǒng)一調(diào)度。
LAR處于整個資源利用率運營體系中核心關鍵位置,從功能上來看,整個產(chǎn)品分為五大主要功能模塊:
- 資源分級管理模塊
- 資源池配置管理模塊
- 服務質(zhì)量保障模塊
- 資源隔離管理模塊
- 策略配置模塊
上述五大功能模塊由LAR系統(tǒng)中3個核心組件來落地實現(xiàn)。LAR是基于原生的Kubernetes進行研發(fā)擴展,如下圖3的整體架構所示,LAR在Kubernetes的基礎功能上,擴展了Scheduler和Kubelet的功能,并新增Recommender和QoSAdaptor兩個組件。對Kubernetes原生組件的擴展均采用插件開發(fā)的模式,減少對原生組件的入侵式修改,從而降低未來運維和升級的成本;對于新增組件,遵循云原生的開發(fā)模式,包括代碼風格以及運行機制,和Kubernetes保持統(tǒng)一。
圖3 LAR系統(tǒng)架構
QoSAdaptor
QoSAdaptor主要負責服務質(zhì)量保障,其核心功能是負責單機資源的分池分級管理,提供分級的單機QoS服務質(zhì)量保障機制。QoSAdaptor分為五個功能模塊:
- 指標采集模塊:通過Cadvisor、Node-Exporter等工具采集節(jié)點與容器的指標,為資源池管理提供決策依據(jù)。
- 資源池管理模塊
資源動態(tài)配置管理:根據(jù)數(shù)據(jù)指標對資源池實時進行負載計算,并基于負載策略及優(yōu)先級動態(tài)調(diào)整資源在各級資源池的配置。
QoS服務質(zhì)量保障:實時監(jiān)控負載指標,依據(jù)資源池的優(yōu)先級管理策略,在資源競爭的情況下,通過資源搶占、服務降級及驅(qū)逐等多種手段分優(yōu)先級保障服務質(zhì)量。
- 資源配置管理模塊:基于各資源池的配置,通過Cgroup等系統(tǒng)工具,對不同資源池的資源進行隔離與限制。
- 資源上報模塊:周期Patch節(jié)點的資源使用情況、資源池負載等信息。
圖4 QoSAdaptor與KubeletQoSAdaptor
以DaemonSet的形式部署在Kubelet節(jié)點上,核心功能是實現(xiàn)資源池和容器的資源配置管理。如上圖4所示,我們通過自研的CRI Plugin,以Runtime Hook的形式在容器生命周期管理中引入自定義的QoS保障機制。
由于QoSAdaptor的資源調(diào)整與QoS服務質(zhì)量保障動作,均基于本地指標采集并進行實時的負載和策略計算,不依賴外部監(jiān)控系統(tǒng),減少了數(shù)據(jù)傳輸時延,在保證服務的穩(wěn)定性同時確??梢悦爰夗憫Y源配置調(diào)整和服務質(zhì)量保障動作,保障業(yè)務容器的穩(wěn)定性。
Recommender
Recommender主要負責LAR運行中策略及參數(shù)的配置更新,依托外部服務數(shù)據(jù),周期性計算并更新LAR相關策略參數(shù),提供統(tǒng)一的集群策略配置入口。
圖5 Recommender與其它服務組件調(diào)用關系
Recommender以集群為維度,每個集群部署一套服務。如上圖5所示,Recommender通過集群運營數(shù)據(jù)中心和服務畫像服務的離線數(shù)據(jù),周期迭代計算LAR的策略參數(shù)。主要功能模塊包括:
- 資源預測:根據(jù)離線監(jiān)控數(shù)據(jù)及服務畫像數(shù)據(jù),對節(jié)點物理資源未來的使用情況進行提前預估,指導節(jié)點的不同資源池的資源配置,并可能觸發(fā)QoS服務質(zhì)量保障動作以及集群級別的資源調(diào)整,比如節(jié)點擴容及服務重調(diào)度等。
- 策略計算:根據(jù)節(jié)點的各級資源池負載數(shù)據(jù)及集群運營數(shù)據(jù)中心的集群服務質(zhì)量數(shù)據(jù),周期性迭代更新各級資源池的負載控制及資源配置策略,保障服務質(zhì)量的同時不斷提升資源利用效率。此外,策略計算會定期更新QoS服務質(zhì)量保障機制中的相關策略,比如服務降級、驅(qū)逐等判斷條件。
- 參數(shù)配置:提供統(tǒng)一的QoSAdaptor參數(shù)配置,實現(xiàn)配置變更分發(fā)的功能。
Scheduler
在LAR中,通過靜態(tài)資源和動態(tài)負載之間的映射,進而在調(diào)度層屏蔽了動態(tài)負載變化,在調(diào)度層面降低了根據(jù)負載進行動態(tài)調(diào)度的復雜度。
Kubernetes默認根據(jù)業(yè)務申請的資源規(guī)格進行資源的調(diào)度分配,并以此設計調(diào)度計算框架和算法。但由于業(yè)務申請的資源規(guī)格是個靜態(tài)值,且業(yè)務方對服務資源的使用通常傾向于放大評估,進而導致整體的資源申請和實際資源使用時存在較大的Gap。我們進一步考慮到資源的使用通常是動態(tài)的,也具有規(guī)律性的波峰波谷。這兩點因素導致在集群的運營上,整體資源分配率接近滿分配的情況下,資源使用率平均水平其實很低。
傳統(tǒng)的方案通過節(jié)點資源超售來解決資源申請和實際資源使用之間存在的Gap,并引入根據(jù)負載的動態(tài)調(diào)度策略。調(diào)整節(jié)點資源超售,雖然能在一定程度上緩解資源申請和使用的Gap問題,但由于Gap在不同的服務間并不相同,加上服務資源使用的波峰波谷分布集中的情況(美團在線業(yè)務的典型特征),此方法在整體上過于粗放,會導致節(jié)點間的負載分布不均衡,部分節(jié)點負載很高,影響服務質(zhì)量;另一部分節(jié)點負載極低,實際上形成資源浪費。而根據(jù)負載直接進行資源調(diào)度,由于負載是動態(tài)變化的,在調(diào)度算法設計及計算框架實現(xiàn)上會非常復雜,且效果一般。
在LAR中,我們通過引入資源配置因子(RCF,Resource Configuration Factor,資源池內(nèi)的資源配比,動態(tài)控制池內(nèi)容器的實際可用資源,數(shù)值區(qū)間為(0, 1]),根據(jù)負載調(diào)整實際的資源分配,從而將負載的變化映射為可調(diào)度剩余資源的變化。如下圖6所示,資源負載即為實際的使用資源,是動態(tài)變化的,靜態(tài)資源是指資源總量和業(yè)務申請的資源規(guī)格,RCF由服務所在的節(jié)點的資源池決定,根據(jù)服務的歷史資源使用數(shù)據(jù)和服務畫像進行計算,并周期進行迭代更新。
圖6 RCF實現(xiàn)節(jié)點負載和可調(diào)度資源轉換
2.3 關鍵能力實現(xiàn)
圍繞資源利用率提升和服務質(zhì)量保障,LAR系統(tǒng)實現(xiàn)了以下關鍵技術:
- 分級池化資源模型:實現(xiàn)資源分池動態(tài)管理以及資源池優(yōu)先級管理。
- 資源動態(tài)視圖:實現(xiàn)負載和資源配置之間的動態(tài)映射,簡化負載管理,保證負載的均衡度,保障服務質(zhì)量。
- QoS保障機制:根據(jù)負載管理的資源配置,在資源競爭的場景下,提供資源搶占以及服務降級驅(qū)逐等功能,提供分級服務質(zhì)量的保障能力。
- 資源智能運營:通過池間資源配置、池內(nèi)負載配置、歷史負載預測等運營策略,自動化調(diào)控節(jié)點資源分配情況,從而達到提升資源利用率的目的。
2.3.1 分級池化資源模型
分級池化資源模型是LAR整個設計的核心,整個模型包括資源分池動態(tài)管理和資源池優(yōu)先級管理兩個核心設計。
資源分池動態(tài)管理機制
資源分池動態(tài)管理引入資源池的概念,通過將節(jié)點資源進行分池管理,實現(xiàn)資源池內(nèi)部資源高度共享,在提高資源復用率的同時,通過池間資源隔離達到池間服務的干擾隔離。資源池內(nèi)資源的配置依據(jù)服務的負載進行動態(tài)調(diào)整,并通過資源配置的調(diào)整,控制資源池內(nèi)部的資源負載維系在相對穩(wěn)定的范圍內(nèi),從而保證服務質(zhì)量。
資源池優(yōu)先級管理機制
在資源分池動態(tài)管理機制基礎上,LAR引入資源池優(yōu)先級管理機制,通過分級的服務質(zhì)量保障機制,保障業(yè)務的服務質(zhì)量。在資源池優(yōu)先級管理機制中,不同的資源池具有不同的優(yōu)先級,對應不同級別的服務質(zhì)量保障級別。不同優(yōu)先級的資源池,在資源配置管理上有3點區(qū)別:
- 資源配置管理策略不同:資源配置管理策略用于決策資源池的資源配置,并通過資源配置控制資源池的資源供給和負載水平。對于優(yōu)先級高的資源池,資源配置充裕,資源池內(nèi)的負載維系在安全穩(wěn)定的水平,并通過資源池的資源隔離能力,實現(xiàn)對資源池內(nèi)部服務資源使用的優(yōu)先保障,從而保證更高的服務質(zhì)量。
- 資源隔離保障能力不同:高級別的資源池依托系統(tǒng)內(nèi)核等提供的資源隔離能力,提供更高級別的資源池資源隔離級別,通過實現(xiàn)資源的獨占或優(yōu)先搶占使用,達到高優(yōu)資源池內(nèi)部服務在系統(tǒng)進程級別資源調(diào)度時的優(yōu)先保障。比如,對于高優(yōu)資源池,可以進行獨立的CPU互斥綁定、I/O隔離等,保障其內(nèi)部服務不受池外服務的影響。
- 優(yōu)先級資源搶占機制:資源池的資源配置可以動態(tài)調(diào)整,在高級別資源池配置資源不足,池內(nèi)負載過高時,QoS服務質(zhì)量保障機制會根據(jù)資源池優(yōu)先級,高優(yōu)資源池可以搶占低優(yōu)資源池已配置的資源,通過犧牲低優(yōu)資源池服務質(zhì)量水平,優(yōu)先保障高級別資源池的資源供給,保障高優(yōu)服務的服務質(zhì)量。
在LAR的分級池化的資源模型中,節(jié)點空閑資源,放置到優(yōu)先級最低的資源池內(nèi),其它資源池的資源配置由服務的資源申請規(guī)格、資源池資源配置管理策略以及資源池資源負載決定。在資源池資源配置管理策略中,包含資源池目標負載和資源池RCF兩部分內(nèi)容。資源池具體的配置資源由服務申請的資源和資源池實時負載決定。當實時負載升高時,LAR會調(diào)整對應資源池的RCF,增加資源池的資源配置,降低資源池負載;當資源池負載降低時,LAR會通過調(diào)整RCF降低資源池的資源配置,釋放冗余資源。
圖7 LAR單機資源分配及資源池資源調(diào)整
上圖7以3級資源池為例,節(jié)點資源被劃分為0、1、2三類資源池,優(yōu)先級依次降低。初始整個機器無服務調(diào)度其上,資源全部集中在Pool2。隨著服務的調(diào)度,Pool1先調(diào)度了服務1,這時會根據(jù)上述的資源計算方式,LAR將Pool2的對應的資源調(diào)整至Poo1,Pool2資源減少。隨著Pool1中服務增多,配置的資源隨之增多,Pool2相應資源減少。優(yōu)先級最高的Pool0調(diào)入服務后,同樣的資源從Pool2調(diào)整至Pool0;Pool2調(diào)度入服務時,Pool2資源不變。
3個資源池配置不同的資源配置管理策略,0號池優(yōu)先級最高,池內(nèi)目標CPU負載控制在30%~50%之間;1號池優(yōu)先級次之,池內(nèi)目標CPU負載控制在45%~60%之間;2號池優(yōu)先級最低,池內(nèi)目標CPU負載控制在50%~80%。已分配的資源由資源池內(nèi)服務共享,在池間相互隔離。在負載低時,不同資源池根據(jù)資源池管理策略,自動調(diào)整各資源池的資源配置,保證資源池內(nèi)負載穩(wěn)定;出現(xiàn)資源緊張時,高優(yōu)資源池可以從低優(yōu)資源池搶占資源,優(yōu)先保障高優(yōu)服務的資源需求。
2.3.2 動態(tài)資源視圖
LAR通過引入動態(tài)資源視圖,將靜態(tài)資源與動態(tài)負載進行映射,并基于資源池的實際負載進行更精確的資源分配決策。
當在線資源池出現(xiàn)負載波動時,池內(nèi)分配資源會隨著負載進行變化,引起池間的資源流動。池間資源流動遵循以下規(guī)則:
- 所有資源池的池內(nèi)分配資源之和為節(jié)點可分配的資源總量。
- 當池內(nèi)負載降低,釋放資源到最低等級的資源池,復用閑時資源。
- 當池內(nèi)負載升高,向等級低于自身的資源池,根據(jù)從低到高的順序進行資源請求,根據(jù)優(yōu)先級滿足服務資源需求。
- 池內(nèi)的資源最多不會超過用戶申請的量。
圖8 動態(tài)資源視圖(以三級池為例)
如圖8所示,以3級資源池為例:
- 當Pool1負載升高時,從等級更低的Pool2搶占資源,優(yōu)先保障自身的服務資源需求,Pool1負載降低時,將冗余的資源釋放回Pool2。
- 當Pool0負載升高時,優(yōu)先從Pool2搶占資源,當Pool2資源不足時,從Pool1搶占資源,保證更高等級的服務資源需求,當Pool0負載降低時,冗余的資源被釋放回Pool2,此時若Pool1存在負載壓力,則會重新從Pool2搶占資源。
下圖為資源池內(nèi)負載與池內(nèi)分配資源的變化情況,可以看到其變化趨勢與美團在線服務負載特性基本保持一致。
圖9 節(jié)點池內(nèi)負載與池內(nèi)分配資源變化情況
2.3.3 QoS服務質(zhì)量保障機制
提升資源利用率會導致資源競爭,LAR通過池間、池內(nèi)兩層QoS服務質(zhì)量保障機制,分級保證服務的隔離性和穩(wěn)定性。
池間多維度資源隔離
LAR對資源池進行了多維度的資源隔離與限制。除了基礎資源(CPU、Memory),還對磁盤I/O、CPU調(diào)度、Memory Cache、內(nèi)存帶寬、L3 Cache、OOM Score、網(wǎng)絡帶寬等更細粒度的資源進行了隔離,進一步提升不同等級服務間的隔離性,保證服務不會受到其他資源池的影響。
圖10 多維度資源隔離
美團操作系統(tǒng)團隊針對LAR場景進行了隔離增強,關于MTOS相關特性的詳細介紹,大家可持續(xù)關注美團技術團隊公眾號的相關內(nèi)容。
池內(nèi)多層級保障策略
當資源池內(nèi)負載出現(xiàn)不符合預期的情況時(如容器負載異常),由于資源池內(nèi)資源共享,整個資源池的服務都可能受到影響。LAR基于資源池內(nèi)不同的負載等級,制定了多級保障策略。LAR提供了資源釋放、資源搶占、CPU降級、Cache釋放、容器驅(qū)逐等負載處理策略。QoSAdaptor周期性(秒級)地獲取節(jié)點負載的數(shù)據(jù),并計算資源池的負載等級。當負載達到一定的資源等級時,執(zhí)行對應的負載策略。通過CPU降級、驅(qū)逐等行為,根據(jù)優(yōu)先級對部分容器進行資源降級,保障池內(nèi)絕大多數(shù)容器的穩(wěn)定性。
- 容器驅(qū)逐:Kubernetes原生的驅(qū)逐策略基于整個節(jié)點的負載,LAR中將策略縮小到了資源池維度,當池內(nèi)Memory使用接近Cgroup限制,避免整個資源池出現(xiàn)OOM,影響所有容器的正常運行,會結合優(yōu)先級篩選Memory使用較多的容器進行驅(qū)逐操作。
- CPU降級:池內(nèi)CPU負載超過一定負載等級,避免高負載導致的容器間互相影響,LAR會結合優(yōu)先級篩選CPU使用較多的容器,對其CPU使用進行單獨的限制。降級操作存在定時檢查機制,當負載恢復正常,或有資源可以搶占的情況下,會將CPU限制進行恢復。
- 強制搶占:從更低等級的資源池搶占資源,與普通資源搶占的區(qū)別為,即使資源已經(jīng)被其他池使用,強制搶占會優(yōu)先滿足高等級資源池的需求。
2.3.4 資源智能運營
LAR基于資源池的歷史負載與歷史分配情況,對池內(nèi)高峰資源使用情況進行預測,為節(jié)點資源調(diào)整提供指導。由于資源池負載變化比較頻繁,同時受到池內(nèi)服務變更、資源總量、高低峰時間區(qū)間等因素的影響,節(jié)點基于實時負載進行池內(nèi)資源的變更較不穩(wěn)定。Recommender周期性地根據(jù)各節(jié)點資源池的歷史負載與分配情況進行高峰資源預測,并下發(fā)到節(jié)點,提供高峰負載控制指導,提升資源池資源保障的穩(wěn)定性。同時通過RCF完成動態(tài)負載和靜態(tài)資源的轉換,在調(diào)度層屏蔽了動態(tài)負載變化,減少負載頻繁變化對調(diào)度準確性的影響。
圖11 基于歷史負載的資源預測
3 應用場景
LAR的設計目標是在保障服務質(zhì)量的同時提升整體資源的利用率,在資源分池分級的設計上,針對通用的在線服務進行服務分級,對接不同資源池,提供不同的服務質(zhì)量保障,從而提升資源的利用率。而對于離線服務,本身相對于在線服務的服務質(zhì)量要求低,故而LAR天然地適用于混部場景。
3.1 在線場景
對于在線服務,通過對服務進行分級,并通過服務畫像對服務進行細致刻畫,將資源敏感型服務和關鍵核心服務部署到LAR優(yōu)先級最高的資源池中;而對于一般的在線服務,部署在次優(yōu)先級資源池。高優(yōu)資源池提供更細粒度與嚴格的資源隔離手段(包括綁核、進程級優(yōu)先調(diào)度、I/O隔離、網(wǎng)絡隔離、Cache隔離等),以及在資源競爭時高優(yōu)的資源供給保障,保證池內(nèi)服務的質(zhì)量穩(wěn)定。
圖12 LAR在線場景資源池
如上圖12所示,一方面我們對高優(yōu)資源池配置更強的資源隔離策略(比如CPU綁核、進程優(yōu)先調(diào)度等),另一方面在池內(nèi)資源配置上,高優(yōu)資源池的資源配置更高。轉換成資源池的資源利用率,高優(yōu)池資源利用率控制在一個安全較低的水位;而低優(yōu)池,則相對在一個更高的水平。
而由于高優(yōu)池主要針對關鍵核心且對資源敏感的在線服務,其在整個在線服務中相對比例不超過20%。從而能整體提升整機的資源利用率水平。LAR在線服務場景中的應用,目前在Hulk的線上線下均已落地,如圖13所示線上LAR集群(藍色曲線表示)的整體平均CPU利用率相對于Native的Kubernetes集群(橙色和綠色曲線表示)平均高5到10個百分點,但整體平均服務質(zhì)量(圖14)和Native的Kubernetes集群反而更穩(wěn)定。其中LAR集群目前作為在線集群使用,暫無離線服務接入。
圖13 在線集群資源利用率
圖14 集群服務質(zhì)量
3.2 混部場景
混部主要就是通過將延時和穩(wěn)定性容錯性更高的離線服務和在線服務混合部署,實現(xiàn)在線服務和離線服務在資源使用時空上的削峰填谷,如下圖15所示:
圖15 混部場景資源復用
從上述章節(jié)介紹的LAR資源模型可知,LAR資源模型的核心特征包括:
- 資源分池分級管理,池內(nèi)資源共享,池間資源隔離。
- 資源池資源配置由資源池優(yōu)先級和資源池內(nèi)負載決定。
- QoS服務質(zhì)量保障機制根據(jù)負載調(diào)整資源池的資源配置,優(yōu)先保障高優(yōu)資源池資源供給。
有了上述能力的保障,LAR天然地適應于混部場景。在混部場景中,假設將資源池分為0、1、2三個級別,優(yōu)先級依次由高到低。0和1號池分別對應核心關鍵在線服務和一般的在線服務,而2號池對應離線服務使用的資源池。LAR的資源動態(tài)調(diào)整保障負載能力,會自動將0號池與1號池在業(yè)務低峰期(負載低)的閑置資源回收,提供給2號池的離線服務使用。并且QoS服務質(zhì)量保障機制,可以確保在業(yè)務高峰來臨時,秒級搶占2號池資源(對于內(nèi)存等非復用型資源,通過驅(qū)逐方式強制回收),從而保障在線服務的資源使用。
目前,LAR集群已陸續(xù)接入離線服務進行混部的驗證。
4 演進規(guī)劃
圖16 LAR演進規(guī)劃LAR系統(tǒng)
從2021年開始規(guī)劃并啟動建設,1.0版本我們完成了資源分級系統(tǒng)、負載驅(qū)動的動態(tài)資源視圖建設。2.0版本,我們主要完成了服務質(zhì)量保障體系建設。目前,我們正在與美團內(nèi)部多個業(yè)務方深度進行合作,探索服務分級接入及混部場景的應用。未來,LAR會繼續(xù)在自動化智能化運營和混部場景應用進行探索迭代。
5 作者簡介
啟超、汪喆、譚霖等,均來自美團基礎技術部/基礎軟件中心Hulk調(diào)度系統(tǒng)。