Serverless冷啟動(dòng):如何讓函數(shù)計(jì)算更快更強(qiáng)?
問(wèn)題背景
Serverless計(jì)算也稱(chēng)服務(wù)器無(wú)感知計(jì)算或函數(shù)計(jì)算,是近年來(lái)一種新興的云計(jì)算編程模式。其致力于大幅簡(jiǎn)化云業(yè)務(wù)開(kāi)發(fā)流程,使得應(yīng)用開(kāi)發(fā)者從繁雜的服務(wù)器運(yùn)維工作中解放出來(lái)(例如自動(dòng)伸縮、日志和監(jiān)控等)。借助Serverless計(jì)算,開(kāi)發(fā)者僅需上傳業(yè)務(wù)代碼并進(jìn)行簡(jiǎn)單的資源配置便可實(shí)現(xiàn)服務(wù)的快速構(gòu)建部署,云服務(wù)商則按照函數(shù)服務(wù)調(diào)用量和實(shí)際資源使用收費(fèi),從而幫助用戶(hù)實(shí)現(xiàn)業(yè)務(wù)的快速交付 (fast built & Relia. Deliv.)和低成本運(yùn)行。
然而,Serverless計(jì)算的無(wú)狀態(tài)函數(shù)編程在帶來(lái)高度彈性和靈活性的同時(shí),也導(dǎo)致了不可避免的冷啟動(dòng)問(wèn)題。由于函數(shù)通常在執(zhí)行完請(qǐng)求后被釋放,當(dāng)請(qǐng)求到達(dá)時(shí),如果沒(méi)有可用實(shí)例則需要從零開(kāi)始啟動(dòng)新的實(shí)例處理請(qǐng)求(即冷啟動(dòng))。當(dāng)冷啟動(dòng)發(fā)生時(shí),Serverless平臺(tái)需要執(zhí)行實(shí)例調(diào)度、鏡像分發(fā)、實(shí)例創(chuàng)建、資源配置、運(yùn)行環(huán)境初始化以及代碼加載等一系列操作,這一過(guò)程引發(fā)的時(shí)延通??蛇_(dá)請(qǐng)求實(shí)際執(zhí)行時(shí)間的數(shù)倍。相對(duì)于冷啟動(dòng)調(diào)用,熱調(diào)用(即請(qǐng)求到達(dá)時(shí)有可用實(shí)例)的準(zhǔn)備時(shí)間可以控制在亞毫秒級(jí)。在特定領(lǐng)域例如AI推理場(chǎng)景,冷啟動(dòng)調(diào)用導(dǎo)致的高時(shí)延問(wèn)題則更為突出,例如,使用TensorFlow框架的啟動(dòng)以及讀取和加載模型可能需要消耗數(shù)秒或數(shù)十秒。
因此,如何緩解Serverless函數(shù)的冷啟動(dòng)問(wèn)題,改善函數(shù)性能是當(dāng)前Serverless領(lǐng)域面臨的主要挑戰(zhàn)之一。
解決方案
從研究思路上看,目前工業(yè)界和學(xué)術(shù)界主要從兩個(gè)方面入手解決冷啟動(dòng)問(wèn)題:
(1)加快實(shí)例啟動(dòng)速度:當(dāng)冷啟動(dòng)調(diào)用發(fā)生時(shí),通過(guò)加速實(shí)例的初始化過(guò)程來(lái)減少啟動(dòng)時(shí)延;
當(dāng)冷啟動(dòng)發(fā)生時(shí),Serverless平臺(tái)內(nèi)部實(shí)例的初始化過(guò)程可以劃分為準(zhǔn)備和加載兩個(gè)階段。其中,準(zhǔn)備階段主要包括控制面決策調(diào)度/鏡像獲取、Runtime運(yùn)行時(shí)初始化、應(yīng)用數(shù)據(jù)/代碼傳輸幾個(gè)部分。而加載階段位于實(shí)例內(nèi)部,包括用戶(hù)應(yīng)用框架和代碼的初始化過(guò)程。在工業(yè)界和學(xué)術(shù)界公開(kāi)的研究成果中,針對(duì)實(shí)例啟動(dòng)過(guò)程中的每個(gè)階段都有大量的技術(shù)手段和優(yōu)化方法。如下圖所示,經(jīng)過(guò)優(yōu)化,實(shí)例冷啟動(dòng)的準(zhǔn)備階段和加載階段時(shí)間可被極大得縮短。
下面列舉了一些近年來(lái)發(fā)表在計(jì)算機(jī)系統(tǒng)領(lǐng)域知名會(huì)議的相關(guān)工作,主要可以分為五個(gè)方面:
1、調(diào)度優(yōu)化/鏡像快速分發(fā)/本地池化:
例如基于樹(shù)結(jié)構(gòu)的跨節(jié)點(diǎn)快速鏡像分發(fā) FaasNet [ATC'21];Pod池+特化實(shí)例跳過(guò)鏡像傳輸 [華為FunctionGraph]。其中,快速鏡像分發(fā)依賴(lài)于VM節(jié)點(diǎn)的上/下行網(wǎng)絡(luò)帶寬,Pod池特化技術(shù)則是典型的以空間換時(shí)間的做法。
2、輕量級(jí)虛擬化/安全容器:
例如針對(duì)傳統(tǒng)容器Docker的精簡(jiǎn)優(yōu)化工作SOCK [ATC'21];更側(cè)重安全性的輕量級(jí)虛擬化技術(shù)(Kata Containers, gVisor等);基于安全容器的進(jìn)一步的精簡(jiǎn)優(yōu)化工作 (Catalyzer [ASPLOS'20], REAP[ASPLOS'21])。通過(guò)裁剪優(yōu)化,安全容器的啟動(dòng)時(shí)延最快可以被壓縮至亞毫秒級(jí)。
3、數(shù)據(jù)共享/跨節(jié)點(diǎn)傳輸優(yōu)化:
例如基于RDMA共享內(nèi)存減少跨節(jié)點(diǎn)啟動(dòng)過(guò)程的數(shù)據(jù)拷貝 RemoteFork [OSDI'23];或者利用本地代碼緩存跳過(guò)代碼傳輸 [華為FunctionGraph, 字節(jié)ByteFaaS等]?;赗DMA技術(shù)的跨節(jié)點(diǎn)數(shù)據(jù)傳輸時(shí)延可降低至微妙級(jí)。
4、用戶(hù)代碼精簡(jiǎn)/快速加載:
例如針對(duì)Java語(yǔ)言的JVM(Java Virtual Machine)運(yùn)行時(shí)優(yōu)化技術(shù) [FunctionGraph];以及針對(duì)Python運(yùn)行時(shí)庫(kù)的裁剪優(yōu)化工作FaasLight [arxiv'23]。通過(guò)特定的優(yōu)化,JVM啟動(dòng)時(shí)間可由數(shù)秒降低至數(shù)十毫秒,而Python代碼的啟動(dòng)加載時(shí)延可降低約1/3。
5、其它非容器運(yùn)行時(shí)技術(shù):
例如WASM(即WebAssembly)技術(shù)以及針對(duì)WASM的內(nèi)存隔離方面的優(yōu)化工作Faasm [ATC'20]。相比容器化技術(shù),直接以進(jìn)程和線程方式組織運(yùn)行函數(shù),可在保證低開(kāi)銷(xiāo)函數(shù)運(yùn)行的同時(shí)具備高度靈活性。
(2)降低冷啟動(dòng)發(fā)生率:通過(guò)函數(shù)預(yù)熱、復(fù)用或?qū)嵗蚕淼确椒ㄌ岣邔?shí)例的利用效率,減少冷啟動(dòng)調(diào)用的發(fā)生
盡管已有的一些實(shí)例啟動(dòng)加速方法已經(jīng)可以將運(yùn)行時(shí)環(huán)境的初始化時(shí)間壓縮至數(shù)十毫秒甚至是數(shù)毫秒,然而用戶(hù)側(cè)的延遲卻仍然存在,例如程序狀態(tài)的恢復(fù),變量或者配置文件的重新初始化,相關(guān)庫(kù)和框架的啟動(dòng)。具體來(lái)講,在機(jī)器學(xué)習(xí)應(yīng)用中,TensorFlow框架的啟動(dòng)過(guò)程往往需要花費(fèi)數(shù)秒,即使實(shí)例運(yùn)行時(shí)環(huán)境的啟動(dòng)時(shí)間再短,應(yīng)用整體的冷啟動(dòng)時(shí)延對(duì)用戶(hù)而言依然是無(wú)法接受的(注:通常大于200ms的時(shí)延可被用戶(hù)察覺(jué))。在這種情況下,可以從另一個(gè)角度入手解決冷啟動(dòng)問(wèn)題,即降低冷啟動(dòng)調(diào)用的發(fā)生率。例如,通過(guò)緩存完整的函數(shù)實(shí)例,請(qǐng)求到達(dá)時(shí)可以快速恢復(fù)并處理請(qǐng)求,從而實(shí)現(xiàn)近乎零的初始化時(shí)延(例如Docker unpause操作時(shí)延小于0.5ms)。
降低冷啟動(dòng)發(fā)生率的相關(guān)研究可以分為如下幾個(gè)方面:
1、實(shí)例?;?實(shí)例預(yù)留:
例如基于Time-to-Live的keepalive保活機(jī)制 [AWS Lambda, OpenWhisk];或者通過(guò)并發(fā)配置接口預(yù)留一定數(shù)量的實(shí)例 [AWS Labmda等];這些方法原理簡(jiǎn)單,易于實(shí)現(xiàn),但是在面對(duì)負(fù)載變化時(shí)緩存效率較低。
2、基于負(fù)載特征學(xué)習(xí)的動(dòng)態(tài)緩存:
例如基于請(qǐng)求到達(dá)間隔預(yù)測(cè)的動(dòng)態(tài)緩存方案 Serverless in the Wild [ASPLOS'20];學(xué)習(xí)長(zhǎng)短期負(fù)載變化特征的動(dòng)態(tài)緩存方案 INFless [ASPLOS'22];基于優(yōu)先級(jí)的可替換緩存策略FaasCache [ATC'21];面向異構(gòu)服務(wù)器集群的低成本緩存方案 IceBreaker [ASPLOS'22]。這些動(dòng)態(tài)緩存方案根據(jù)負(fù)載特征學(xué)習(xí)決定實(shí)例緩存數(shù)量或時(shí)長(zhǎng),從而在降低冷啟動(dòng)調(diào)用率的同時(shí)改善緩存資源消耗。
3、優(yōu)化請(qǐng)求分發(fā)提高命中率:
例如兼顧節(jié)點(diǎn)負(fù)載和本地化執(zhí)行的請(qǐng)求調(diào)度算法 CH-RLU [HPDC'22]。通過(guò)權(quán)衡節(jié)點(diǎn)負(fù)載壓力和緩存實(shí)例的命中率來(lái)對(duì)請(qǐng)求的分發(fā)規(guī)則進(jìn)行優(yōu)化設(shè)計(jì),避免節(jié)點(diǎn)負(fù)載過(guò)高導(dǎo)致性能下降,同時(shí)兼顧冷啟動(dòng)率。
4、改善并發(fā)/實(shí)例共享或復(fù)用:
例如允許同一函數(shù)工作流的多個(gè)函數(shù)共享Sandbox環(huán)境 SAND [ATC'18];使用進(jìn)程或線程編排多個(gè)函數(shù)到單個(gè)實(shí)例中運(yùn)行 Faastlane [ATC'21];提高實(shí)例并發(fā)處理能力減少實(shí)例創(chuàng)建 Fifer [Middle'20]; 允許租戶(hù)復(fù)用其它函數(shù)的空閑實(shí)例減少冷啟動(dòng)時(shí)間 Pagurus [ATC'22]。這些實(shí)例共享或者復(fù)用技術(shù)可以同緩存方案結(jié)合使用,降低冷啟動(dòng)帶來(lái)的性能影響。
總結(jié)
Serverless的無(wú)狀態(tài)設(shè)計(jì)賦予了函數(shù)計(jì)算高度彈性化的擴(kuò)展能力,然而也帶來(lái)了難以避免的冷啟動(dòng)問(wèn)題。消除Serverless函數(shù)的冷啟動(dòng)開(kāi)銷(xiāo)還是從降低函數(shù)冷啟動(dòng)率和加速實(shí)例啟動(dòng)過(guò)程兩個(gè)角度綜合入手。對(duì)于冷啟動(dòng)開(kāi)銷(xiāo)比較大的函數(shù),在函數(shù)計(jì)算框架的設(shè)計(jì)機(jī)制中進(jìn)行優(yōu)化,盡量避免冷啟動(dòng)發(fā)生;當(dāng)冷啟動(dòng)發(fā)生時(shí),采用一系列啟動(dòng)加速技術(shù)來(lái)縮短整個(gè)過(guò)程進(jìn)行補(bǔ)救。在Serverless平臺(tái)的內(nèi)部,冷啟動(dòng)的管理在實(shí)踐中可以做進(jìn)一步精細(xì)的劃分,例如針對(duì)VIP大客戶(hù),針對(duì)有規(guī)律負(fù)載的,或是針對(duì)冷啟動(dòng)開(kāi)銷(xiāo)小的函數(shù),通過(guò)分類(lèi)做定制化、有目的的管理可以進(jìn)一步改善系統(tǒng)效率。
8月22日-9月15日,華為云828營(yíng)銷(xiāo)季火熱進(jìn)行中!多款明星產(chǎn)品和解決方案匯聚一堂,為千行百業(yè)及個(gè)人開(kāi)發(fā)者提供技術(shù)支持、降低上云成本、實(shí)現(xiàn)創(chuàng)新發(fā)展。即刻登錄華為云官網(wǎng),暢享華為云828營(yíng)銷(xiāo)季專(zhuān)屬福利,抓住上云采購(gòu)好時(shí)機(jī)!