每年雙十一創造奇跡的背后,是巨大的成本投入。為了完成對流量峰值的支撐,我們需要大量的計算資源,而在平時,這些資源往往又是空閑的。另一方面,為了在極端情況下,如機房整體斷電等還能保障阿里巴巴的業務不受損失,也需要在全國各地建立冗余資源。而且就算是一天當中,在線服務的負載也是不一樣的,白天一般情況下要比凌晨高得多。根據蓋特納和麥肯錫前幾年的調研數據,全球的服務器的CPU 利用率只有 6% 到 12%。即使通過虛擬化技術優化,利用率還是只有 7% -17%,而阿里巴巴的在線服務整體日均利用率也在 10% 左右。
另一方面,全球從 IT時代全面走向了 DT時代,現在又在向更深入的 AI 時代邁進。各各樣的大數據處理框架不斷涌現,從 hadoop 到 Spark,從 JStorm 到 Flink,甚至包括深度學習框架 Tensorflow 的出現,成千上萬的數據分析背后是大量的計算任務,占用了大量的計算資源。由于計算任務占用的計算量很高,CPU 水位通常在50%-60% 以上,不同于在線服務,計算任務的峰值通常出現在凌晨,水位甚至能達到 70% 以上。所以我們往往就會建立獨立的計算任務集群。
很多人都被車堵過,而堵車的時候,并不是所有的車道都在堵車。有一個比較有趣的情況,我們稱之為潮汐現象,而它造成的問題是在早高峰的時候是進城方向堵車,而晚高峰是出城方向堵。而為了緩解這個問題,我們使用了潮汐車道的方式。
那么同樣的原理,是否如果能讓這兩個集群混合起來部署,讓計算任務的一部分任務跑到在線服務的資源之上,把在線服務空閑的資源利用起來呢?答案是肯定的。
混部技術簡介
混部技術示意圖
把集群混合起來,將不同類型的任務調度到相同的物理資源上,通過調度,資源隔離等控制手段 , 在保障 SLO 的基礎上,充分使用資源能力,極大降低成本,我們稱這樣的技術為混部(Co-loaction)。
打個比方,跑在容器里的在線服務就像石塊;而計算任務我們把它比喻成沙子和水。當在線壓力小的時候,計算任務就占住那些空隙,把空閑的資源都使用起來,而當在線忙的時候,計算任務就立即退出那些空隙,把資源還給在線業務。這樣的技術一方面在平時,我們可以極大地提升資源的利用率;另一方面,在大促活動需要突增在線服務器的時候,又可以通過在線業務占用計算任務資源的方式,來頂住那短暫的峰值壓力。
從原理中我們可以看到可以混部在一起的任務有兩個比較重要的特征:
1.可以劃分優先級:一定需要優先級比較低的任務,它們能像水和沙子一樣,隨時能被趕走,而不會受到不可承受的影響,讓優先級高的任務不受干擾。在線的特點是:峰值壓力時間不長,香港服務器租用,對延時比較敏感,業務的壓力抖動比較厲害,典型的如早上 10 點的聚劃算活動,就會在非常短的時間內,造成交易集群的壓力瞬間上升 10 幾倍,對于穩定的要求非常高,在混部的時候,必須要保證在線的通暢,需要有極強的抗干擾能力。而計算任務的特點是:平時的壓力比較高,相對來說計算量可控,并且延遲不敏感,失敗后也可以重跑。至少需要幾分鐘跑完的計算任務,相對于幾秒甚至幾十秒的延遲,并不會產生嚴重的問題,正好可以承提起水和沙子的角色。
2.資源占用互補性:兩種任務在不同的時間點對水位的占用不一樣。如在線服務是,平時比較低,大促時比較高;凌晨比較低,白天比較高。而計算任務則反過來,平時比較高,服務器租用 免備案服務器,大促時可以降級;凌晨非常高,白天卻要低一些。
這種方式帶來的成本節省是非常巨大的:假設數據中心有 N 臺服務器,利用率從R1 提高到 R2,不考慮其他實際制約因素的情況下,節約 X 臺,那么理想的公式是:
N*R1 = (N-X)*R2
=> X*R2 = N*R2 – N*R1
=> X = N*(R2-R1)/R2
也就是說如果企業有 10 萬臺服務器,利用率從 28% 提升到 40%,代入上述公式,就能節省出 3 萬臺機器。假設一臺機器的成本為 2 萬元,那么節約成本就有6 個億。
2015 年,Google 發表了 Borg 論文,其中就提到了在線服務與計算任務之間的混合運行,也就是我們說的混部技術。Borg 論文中描述了 Google 由于采用了這項技術,為 Google 節省了 20%-30% 的機器規模。
混部技術的歷程
阿里巴巴早期混合云架構