混合多雲第二課——混合技術如何每年為京東節省上億元成本?

京東雲開發者發表於2023-03-29

大家好,我叫侯竹玲,歡迎大家收看我在京東做研發。接下來我來介紹混合多雲第二課 全場景混布。

為什麼要介紹混部?因為現在除了網際網路企業以外,各大國央企、金融企業都在探索全量業務容器化,那麼容器化之後又希望不同的特徵業務的工作負載,能夠進行不同的排程,充分利用負載之間消峰填谷的這種效應,讓工作負載可以更穩定、更高效、更低成本去使用資源,就是業界我們常提到的“混部”。

京東是在2014年就開始探索容器化,17年的時候開始探索混部,經過我們多輪的架構的升級,延伸到了現在的這種混部架構,實現了全場景的混部,混部資源 CPU使用率常態化的保證在了80%左右,幫助京東節省了大量的資源成本。

京東混部其實它是在京東內部超大規模混部生產實踐經驗而來,旨在為使用者打造雲原生場景下,全場景混部的一套解決方案,可以真正的幫助企業做到降本增效,實現雲原生後時代持續的紅利釋放。

2022年的春晚紅包,其實我們在12月28號才開始啟動專案會,1月6號的時候真正的做系統的改造,1月31號春晚就要播出。

那麼在20多天的時間下,我們業務在沒有增加任何的線上資源的前提下,利用混部技術對離線資源做壓制,保證了線上業務資源的充足使用,助力春晚紅包順利進行。

接下來我們進入正題,下面我會從三個方面來介紹混部。

第一混部整體的介紹和在京東的歷程。第二混部的架構和功能。第三各模組的混布的技術。

1.混部的價值是什麼?在京東有哪些重要的應用歷程? 好,我們進入第一塊,第一個模組主要是混部的介紹和歷程,我們來介紹一下什麼是混部。

混部其實用一句話說,就是將高優先順序的業務和低優先順序的業務混合部署在一個節點上。那麼從業務場景上來說,混部其實是透過線上作業執行的過程當中,把離線的任務填充進來,充分的利用負載之間的削峰填谷的效應來提高資源的利用率。

從右面這張圖我們可以看一下上面的兩張圖,第一張圖是線上業務資源使用情況,第二張圖是離線業務的使用情況。

線上業務使用情況我們看到它這種資源利用率都比較低,但是會存在波峰波谷比較明顯。

而離線業務這張圖資源利用率比較高,但是它的業務比較密集,所以我們在整合了混部之後,下面這張圖可以看到它整體的利用資源利用率平均保持在了80%左右,並且不會存在這種很頻繁的波峰波谷的效應。

線上業務執行的過程當中,離線業務不影響線上業務的使用

保證了資源利用率的提升,這就是混部,那麼整體京東混部使用的效果,其實剛才已經講過了,整體我們利用對資源的使用率有了明顯的提升,並且整體的資源使用率保持在了80%左右。

我們接下來看一下京東混部的發展歷程。

京東在2014年的時候就推出了jdos1.0的容器平臺,然後在2017年的時候我們就推出2.0,也就是基於kubernetes的應用容器平臺,在2018年的時候在雲原生的基礎上做了排程的增強,增加了阿基米德的排程,支援了資料庫中介軟體等有狀態應用的混部。

在2019年的時候又支援了大資料實時資料的混部,在20年的時候做了擴充套件,支援了大資料離線任務的混部,在2022年的時候擴大了混布的規模,進一步做了降本。

整個的在混布的過程中,資源利用率不斷提升,現在的混部節點的CPU的使用率平均已經提升了40%以上,每年為京東節省的資源成本達到數億元。

可以看到這張圖是現在京東混部的使用的現狀和規模,我們剛才講了整個資源的利用率已經常態化的資源,這是我們線上一張截圖,可以看到,CPU的使用率平均常態保持在了80%,比未做混部的叢集資源利用率提升了40%以上,整個業務已經做到了全場景的混部,有離線的大資料、實時的計算,以及零售的一些核心業務中介軟體、資料庫,還有廣告搜尋以及AI等各種場景的應用,都可以做到同步混部的效果。

可以看到這是一張2022年雙11開門紅的一張圖,我們可以看到整體的資源利用率都在80%左右,但是在大促和非大促的時候,離線和線上的使用的資源的情況一有一些變化,可以看到第一張圖是整體的資源,第二張圖是線上資源,第三張圖是離線的資源。

那麼在非大促的時候,離線的整體資源的使用率是比較高的,達60%左右,線上的資源使用率是在40%到50%之間。那麼在大促的時候,也就是我們在8點開始做大促,在7點的時候我們把離線業務做了壓制,到8點的時候,就看到線上的資源的使用率已經上升達到了60%左右,而離線的資源使用率降到了20%左右。那麼在整體資源保持穩定的情況下,離線上資源做了一個調整,就是我們在不增加任何資源的情況下,保證了線上業務的正常的執行。

好,我們來介紹一下京東全場景混部的價值。

其實混部的價值用一句話說就是在不影響線上業務的前提下,大幅提升資源的利用率,節省資源的成本,助力企業降本增效。

其實大部分企業它的離線的機房和線上的機房是完全隔離的,在這種情況下就會造成資源的浪費,我們可以將這些資源做規劃,做統一的排程利用削峰填谷的效應來提高資源的利用率。下面我們重點從成本、效率和效能三個方面來介紹一下混部。

成本的話,剛剛提到的我們可以將離線資源和線上資源給它進行統一歸一化之後,統一做排程,整體可以將常態化資源利用率保持在80%左右,極大的節約機器的成本。效率的話,整個叢集的管理也好,我們可做了快速的上下線,並且對於新增刪除節點這個機器的一些流轉,都進行了整個的平臺化的效率提升。再一個混部配置有了統一的管理,提升了管控的效率。

效能方面,我們看到在整機使用率在70%的情況下,離線對線上的QPS和TP95的影響,我們控制在了4%以內。做了資源的歸一化策略之後,會根據每個節點的效能來給它去做打分,保證任務的一個排程的統一。我們在做平衡排程的時候,會根據不同節點的打分來做統一的排程。

第三個就是說如果我們在排程的過程當中,我們可以快速的識別出故障並且去做處理,這樣減少了一些利舊裝置對業務的影響。

下面我們來看一下,那麼剛剛上面我們講到了混部它是透過線上作業在執行過程當中來填充離線的作業,那麼我們既要保證線上任務正常執行,又要提升資源的利用率,那麼這個就給混部其實帶來了一定的挑戰和難點。

挑戰和難點會在哪幾個方面?

離線任務在填充過程中不能無限的填充,需要保證線上作業不受影響,那就要保證SLO在可接受的範圍內,同時離線作業,要快速的支援切換上下線那麼當我線上業務需要的時候,你能快速的讓出資源,我不需要的時候,你又能夠快速的去使用這些已有的資源。當然了,離線執行起來之後,還得保證離線作業的一個成功率,不能因為資源讓出來而導致了它的失敗。

所以我們要在保證這些前提下,對我們混部的挑戰有以下幾點,第一點就是說我們如何去減少低階別的應用,對高階別應用的干擾呢?在保證它的SLO的前提下,怎麼樣去更多的去使用資源。第二點就是說如何滿足高低階別應用的排程的需求,在整體上去做質量的把控,我既要保證高階別應用的所需要的資源的需求,並且我還不能夠讓低階別的應用它的作業的失敗,所以這個就是要從全域性上去做統一的排程。

第三點怎麼樣去避免高階別的應用和低階別的應用,不被同時排程在一個核上,發生搶佔時間的執行。別因為低階別的應用排程,在同一個節點上造成了高階別應用不能夠去使用當前的一個資源。第四個記憶體的資源是有限的,那麼我們如何去做合理的分配?避免高階別和低階別應用發生對儲存記憶體資源的相互爭搶。

第五個,高階別應用和低階別應用,它在執行的過程當中都會跟網路是密切相關的,那麼網路它要如何去做隔離,再最後一個就是說高階別應用和低階別應用,它在對 io的使用過程中也會發生搶佔,那麼如何制定有效的io的隔離策略呢?以上的這些問題和挑戰,我們在下面的介紹當中會一一去做一些解答。

2.混部的主要架構和重要功能有哪些?

接下來我們介紹一下混部的架構和相關的技術。

可以看到這是整個混部架構的全景圖。架構的核心分了幾大塊,第一塊就是資源的隔離,如果我要保證離線的任務,對線上業務的干擾最少,我就要去做到各種維度的隔離,有CPU、記憶體、磁碟,各種維度都要做這種隔離的控制。

第二個如果我要保證整個的叢集的資源的排程要做到均衡,所以我們要去做排程,排程的時候要去做負載感知的排程,做排程任務的壓制驅逐,過載保護等一系列保證資源的均衡的執行。

第三塊就是我們的可觀測性,不管隔離也好,排程也好,我可以實時的觀測到各種維度的資源的監控,比如叢集資源監控,節點的負載的排程的以及干擾的各種資料都可以透過大盤去看到。

再一個就是故障的探測與恢復,可以做軟體層面故障的探測,硬體的故障探測,以及故障之後的故障的隔離自愈都可以在我們整個混部裡頭去做,自己去做閉環完成。再往上就是我們的業務,不管這是線上業務還是離線的資料以及資料庫中介軟體和AI,支援多場景的這樣的一個混部,這就是混部的整個架構圖,那麼接下來我會分在每個層面詳細的介紹一下這幾塊的能力。

第一個我們可以看到這幾塊是沉澱出了核心的能力,有第一個就是我們剛才提到排程,排程這個就是有阿基米德排程,它有負載均衡幹排程,然後這一塊是隔離,有CPU隔離、磁碟隔離、記憶體隔離這一大塊是隔離的內容,再一塊就是可觀測性,我們可以提到了不管是底層指標還是上層業務指標,它可以透過多維度去做這樣的一個監控。

呈現出來的7大能力,第一塊就是我們的離線資源的視覺化,我可以識別出有哪些空閒的資源去做上報,我可以整體去控制有哪些離線資源。負載的分級,、透過負載分了4級,對相比原生的Qos的3級來說,它更貼近了混部,業務在做排程和驅逐,或者是在隔離的時候都會用到負載的應用的分級。

排程的增強就是說基於負載預測的排程,可以有效的把全域性資源分配支援這種gang排程,就批次的排程一些資源的預留等這樣的一些策略。接下來還有一個功能就是我們剛才提到隔離,那都是支援CPU記憶體、磁碟網路等多維度的一些隔離,還有我們的一個離線大框策略,那就是可以最大限度的避免了資源的相互干擾。

水位線的調節,我們可以支援有排程水位線隔離水位線,可以透過水位線的配置去做調控,把控叢集的一個整體的水位,可觀測性就是可以支援多維度的一個監控指標以及的一個檢視。

在你的離線有干擾的時候,我們可以第一時間捕捉到這樣的一些資訊。最後一個就是侵入性,我們這個混部它是一個外掛,它對原生k8s是無侵入的。

3.混部包含哪些關鍵的技術?

接下來我們來介紹一下混部技術。

首先可以看一下應用QoS的分級,分了4級,級別整體上分了兩個維度,第一個維度是延遲敏感型的線上業務的,第二個維度是資源消耗性的離線業務。4個級別前三個級別是給分給了線上業務,最後一個級別是分給了離線業務。為什麼要去做分級?它的目的就是說在單機資源緊張的時候,我們會根據優先順序來去做資源的排程,會保證線上資源的應用可以優先獲得資源。

第二塊是我們的負載均衡的容器的排程.

負載均衡剛才提到了我要保證整體的資源保證在80%左右上去執行,我就得做負載均衡的整體的排程,為什麼要去做均衡的排程?因為如果你的利用率不均衡的時候,會導致資源的無法正常的充分的利用。

第二個如果是把你的業務排程在熱點機器上的話,會導致離線業務和線上業務的嚴重衝突,所以我們要去做平衡排程,那麼做平衡排程是怎麼樣去做的呢?

首先我們會透過監控系統,實時上報資源的使用率,透過資源使用率,去把業務分配到不同的節點上去,避免分配到熱點機器上。

第二個基於資源的一個預測,我們會能夠預測到你的業務會使用多少資源,那麼根據這個資源來做整體整個節點資源的一個把控。

第三個我們會支援 Cpu和記憶體維度的整體資源利用率的控制均衡的排程.

我們來看一下Gang排程,Gang排程也是資源平衡排程的一個最核心的能力,它就是主要解決了是什麼?我們原生的是我們會進行一個去做排程,Gang排程解決的就是批次排程,我可以等著一次性把所有的應用所有的資源都分配好了之後一次性排程完成,那避免了有的任務。

在輪巡的過程當中,當一部分業務任務完成,另外一部分任務沒完成的時候,它會等待,造成了資源使用的一個浪費。資源預留就是我們在大促也好,或者是在有些核心業務的時候,有這種資源預留的訴求,就是說我有些特定的業務一定要排程到某些特定的資源上去,比如ES他要排程到大磁碟的node上去,這個時候我們就用了資源預留,我可以把某些資源特定給到某種業務這樣排程上來的時候,我就直接可以把相關的業務排程到特定的資源上去。

Request最佳化推薦,就是我們可以能做到根據真正的資源使用情況,去智慧的推薦你的Request,因為往往業務在自己申請 Request資源的時候,為了避免有這種高流量突發的情況,會多去申請一些資源出來,真正使用的時候,其實它使用不了這麼多量,會造成一個資源的浪費。

所以針對這種場景,又做了一個最佳化,我會根據真正的業務的使用資源,再加上你業務未來的預測會用到多少資源,兩者整體做評估之後,給出一個 request的值的推薦。這個值既能保證你業務的正常執行,也能夠去減少資源的浪費,可以進一步做到資源的使用的最佳化,降低成本。

資源超賣也是排程裡頭的核心能力。

我們可以根據線上業務的情況,透過下面一個公式,實時的計算出線上的實際的使用量,然後去評估出離線資源可用的資源有多少,上報給上層的管理端,讓他知道當前離線資源可以有多少資源,根據這個資源再排程水為線,然後再去排程離線資源,看可以有多少的離線業務被排程上來。

當然離線可用資源,比如說我可以根據排程水為線,離線的任務排程到哪個節點上,所以這些都是會有一些引數去做設定的。

設定完了之後我們再計算透過計算的能力去算出哪些資源,離線的任務可以被調上來,哪些不可以被調上來。驅逐和排程是混部裡頭的核心的能力,那麼就是說如果我的離線業務已經被調上來了,當線上的資源使用率達到了一定的高度的時候,怎麼辦?就需要去做驅逐,比如下面的驅逐,比如說記憶體達到一定的高度的時候,我就要把離線的資源給它驅逐掉,保證線上的資源的正常的使用。

當然排程的水位線也是為了保證資源的管控,不可能把所有離線任都給往上排程,會有一定的排程水位線的控制,但高於調水位線的時候,離線的任務是沒辦法再排程到這個點節點上來的。

我們來介紹一下隔離能力。

首先看一下算力隔離,算力隔離第一項就是CPU Burst,CPU Burst就是我們可以把設定CPU Burst的量,當你不用的時候把空閒的時間可以折算成你的一個使用量的buffer,當你未來有峰值的時候,可以有一定量的buffer去做使用。

第二塊就是程式的排程,程式排程是我們自研的排程類,在原生的基礎上做了改造的,改造之後能做到線上立即搶佔離線,就是當線上的程式來了之後,當資源不夠的時候,可以立即把這個離線的程式給搶佔掉。第三個就是離線壓制,我們可以在透過動態的預測調整離線的一個CPU的頻寬的使用量。

第四個是L3 Cache,Cache也是可以做到動態的壓制,透過監控的指標來監控它的使用量,動態的調整離線任務的緩衝的一個配置。當設定好了一定比例之後,當線上的Cache使用的多的時候,會把離線的Cache壓制掉,去給線上使用。記憶體cache就是在做記憶體方面的一些隔離,第一塊非同步記憶體的回收,也就是當容器記憶體用量超過水位線的時候,它就會啟動非同步回收,會減少記憶體配置延時。

第二塊就是快速記憶體回收。

當一項任務銷燬的時候,馬上就做回收。第三個就是 GroupOOM也就是在一個容器上,把程式殺掉的時候,他可以一併把所有的程式殺掉,減少無效的佔用。第四個就是記憶體水位線的保護,就是可以優先回收離線的業務,保證線上的業務的記憶體不被回收。Mba的動態壓制也是透過監控線上的一個使用量動態的調整,離線任務在記憶體的頻寬上的一個配額,也是為了優先保證線上業務。

最後一個是oom的優先順序。在oom的時候就會根據優先順序去執行,可以先優先殺掉離線任務,保證線上業務的正常的使用。

磁碟IO的隔離分三塊,第一塊就是我們支援了離線線上分盤管理,就說離線線上的可以分別使用不同的盤,這樣可以避免了相互的干擾。

第二個磁碟的限速,你可以去配置一些磁碟的一些吞吐和IOPS的使用。第三個就是磁碟IO的優先順序,我可以設定一定的優先順序,這樣保證線上業務比離線業務的使用的磁碟要強,我們會保證優先順序高的業務使磁碟。

網路隔離是我們自研開發的一款 CNI外掛天鏈,它可以做到網路的限速,它能夠支援單方向和雙方向的一個限速。

第二個它支援配置優先順序,我們整個優先順序分了5級,可以根據優先順序的高低來去做流量的一個轉發,在整體的增強能力上還做了優先順序加限速混合使用,我可以支援業務在不同的優先順序上進行限速,靈活的控制各優先順序頻寬的使用。

第二塊我們做到了精細化的流量的管控,就支援按照四元組來進行流量的轉化的控制。

第三塊增強能力是做了IP保留和固定的IP池,這兩類的 IP的保留。的業務方可以根據自己業務的場景的不同靈活的使用這種保留的情況。離線大框是我們整體對離線資源的管控設計,我們可以把所有的離線的任務放在一個大框下,這樣可以方便統一管理離線資源的使用。

Cpu記憶體的壓制水位線就是我們在設定了混部的時候可以設定各種的水位線,有排程水位線,有壓制水位線,但你如果設定了壓制水位線之後,當這個節點資源的CPU和記憶體使用率超過設定水位線的時候,那就會對離線資源去做壓制。

也還可以設定一個最小保證量,不能把離線任務的資源都給壓制沒了,我們可以設定一個最小保障量,在壓到最小量的時候就不會再壓了,保證離線資源還有一定的資源在用,但是它也不會佔用很多的資源,給線上業務留出足夠的資源去使用。

下一個大塊主要就是視覺化,我們分支援做了多維度的監控,可以

從叢集、節點、namespace、工作負載等多個維度去觀測自己的監控大盤,有問題或者有故障的時候實時的去做監控與發現。

元件監控比如有ETCD元件,API server監控,核心的一些元件,都支援監控,就可以自己隨時觀測到自己元件的一個狀態。

排程監控就是我們在做整體資源排程的時候,我們可以看到這張盤,你可以實時的看到自己的排程的佇列,那排程的QPS時延及其的負載是多少,都可以隨時觀察到,你有沒有排程不均的情況,你有沒有把排程的熱點上的問題存在,都可以從這張圖上去做實時的監控。

好,我今天的分享就這些,謝謝大家。

相關文章