函数计算镜像加速:从分钟到秒的跨越
作者信息:
Shuai Chang,阿里云云原生 Serverless 團(tuán)隊(duì)高級(jí)技術(shù)專家,主導(dǎo)了函數(shù)計(jì)算同容器技術(shù)生態(tài)融合以及 FaaS 云原生可觀測(cè)。
體驗(yàn)文檔:
鏡像拉取加速文檔:https://help.aliyun.com/document_detail/193075.html
FaaS 和容器
容器鏡像因其顛覆式創(chuàng)新成為云原生時(shí)代應(yīng)用部署格式的事實(shí)標(biāo)準(zhǔn)。頭部云廠商 FaaS (Function-as-a-Service) 服務(wù)如阿里云函數(shù)計(jì)算、AWS Lambda 也相繼在2020年支持使用容器鏡像部署函數(shù),全面擁抱容器生態(tài)。自發(fā)布以來(lái),開(kāi)發(fā)者陸續(xù)將機(jī)器學(xué)習(xí)、音視頻處理、事件驅(qū)動(dòng)離線數(shù)據(jù)處理、前端自動(dòng)化等多個(gè)場(chǎng)景使用鏡像快速無(wú)服務(wù)器化,提高效率、降低成本。然而,冷啟動(dòng)一直是 Serverless 無(wú)法繞開(kāi)的問(wèn)題。容器鏡像需要將數(shù)據(jù)通過(guò)網(wǎng)絡(luò)遠(yuǎn)程下載并解壓,對(duì)于GB級(jí)別的鏡像,拉取時(shí)間可能高達(dá)分鐘級(jí)別,客觀上放大了冷啟動(dòng)副作用,阻礙實(shí)時(shí)應(yīng)用的 Serverless 演進(jìn)。
函數(shù)計(jì)算鏡像加速功能
傳統(tǒng)的鏡像拉取加速?gòu)?qiáng)調(diào)"開(kāi)發(fā)者負(fù)責(zé)",如精簡(jiǎn)鏡像,合理分配鏡像層,multi-stage 構(gòu)建,使用工具(如 docker-slim)去除不需要的數(shù)據(jù),遵循構(gòu)建最佳實(shí)踐等。這些工作不僅加重了用戶負(fù)擔(dān),加速效果有限,且有運(yùn)行時(shí)穩(wěn)定性風(fēng)險(xiǎn)。阿里集團(tuán)超大規(guī)模和場(chǎng)景高度復(fù)雜的容器環(huán)境,對(duì)鏡像存儲(chǔ)、加速技術(shù)有深厚的積累,出色地承擔(dān)了3年雙十一,雙十二,春節(jié)等大促秒殺場(chǎng)景的嚴(yán)苛的挑戰(zhàn)。阿里云 Serverless 同容器鏡像、存儲(chǔ)等服務(wù)深度合作,將內(nèi)部創(chuàng)新在函數(shù)計(jì)算輸出:杭州、北京、上海、美東、美西正式發(fā)布了鏡像加速功能。該功能將原本屬于開(kāi)發(fā)者的鏡像優(yōu)化負(fù)擔(dān)轉(zhuǎn)由函數(shù)計(jì)算承擔(dān),進(jìn)一步幫助開(kāi)發(fā)者提高生產(chǎn)效率,專注業(yè)務(wù)創(chuàng)新。
加速效果
我們?cè)谶x擇了內(nèi)部生產(chǎn)環(huán)境和開(kāi)源社區(qū)的工作負(fù)載,覆蓋機(jī)器學(xué)習(xí)、人工智能、前端自動(dòng)化、Web 應(yīng)用等7種鏡像大小、IO 訪問(wèn)模式、啟動(dòng)命令的不同組合作為 benchmark,部署在 FC 北京區(qū)域。如下圖所示,函數(shù)計(jì)算開(kāi)啟鏡像加速功能后加速普遍超過(guò) 50%,對(duì)于機(jī)器學(xué)習(xí)場(chǎng)景中常見(jiàn)的臃腫鏡像(如多個(gè)團(tuán)隊(duì)共享基礎(chǔ)鏡像, ml-small-import, ml-large-import, ai-cat-or-dog)加速效果更為明顯(約 70%-86%),鏡像越大優(yōu)化空間往往越高。
使用方式
鏡像加速可以通過(guò)控制臺(tái)、CLI 工具或是 FC SDK 開(kāi)啟,詳細(xì)步驟參加鏡像拉取加速文檔
? 方式一:在函數(shù)計(jì)算控制臺(tái)函數(shù)配置下選擇“開(kāi)啟鏡像加速”。
? 方式二:使用 Funcraft 工具部署
在已有的 CustomContainerConfig 配置下添加 AccelerationType: Default 如需關(guān)閉則配置 AccelerationType:
None
功能特點(diǎn)
FC 鏡像加速具備以下特點(diǎn):
鏡像拉取為什么慢?
一個(gè) OCI V1 容器鏡像包含多個(gè)層(layer),每層都是一個(gè)壓縮打包的文件系統(tǒng)(文件夾),通常以 tar.gz 格式存儲(chǔ)在遠(yuǎn)端服務(wù)(如對(duì)象、文件存儲(chǔ))。拉取鏡像時(shí)步驟如下:
上述步驟雖然簡(jiǎn)單,卻是鏡像拉取慢的主要原因:
? 文件格式缺陷、粗粒度數(shù)據(jù)分層、順序解壓:gzip 層導(dǎo)致無(wú)法細(xì)粒度隨機(jī)讀取應(yīng)用實(shí)際需要的數(shù)據(jù),且要求所有層單線程順序解壓。實(shí)際觀察發(fā)現(xiàn)鏡像層可以通過(guò)并發(fā)下載提高速度,然而解壓環(huán)節(jié)在 gzip 格式下卻很難優(yōu)化。
? 低效的壓縮/解壓縮算法:鏡像層采用的 gzip,benchmark gzip 解壓速度對(duì)比 lz4 平均慢接近9倍。
? 全量數(shù)據(jù)下載:同樣由于粗粒度的分層和 gzip 格式(不支持 seek),鏡像數(shù)據(jù)不論是否實(shí)際有用,都要被完整下載至本地。
綜上原理,鏡像拉取時(shí)間和鏡像大小成正比,而容器鏡像構(gòu)建過(guò)程中運(yùn)行 apt/yum install, 無(wú)用的測(cè)試、數(shù)據(jù)文件,構(gòu)建過(guò)程中執(zhí)行 chmod/chown 等命令造成同一數(shù)據(jù)復(fù)制多份,極易引入大量應(yīng)用不需要的數(shù)據(jù)。
加速原理
函數(shù)計(jì)算將阿里集團(tuán)成熟的鏡像加速技術(shù)應(yīng)用在公共云服務(wù)中,加速技術(shù)圍繞兩個(gè)核心思路:
? 按需加載:僅讀取應(yīng)用真實(shí)需要的數(shù)據(jù),極大減少數(shù)據(jù)傳輸量
? 更高效的存儲(chǔ)和算法:相同大小的數(shù)據(jù),更快地解壓
按需加載
Benchmark 中包含鏡像數(shù)據(jù)加載率在 12% - 84% 之間,除了鏡像較小的 web 應(yīng)用,大部分場(chǎng)景數(shù)據(jù)利用率低于 50%。以層(layer)作為數(shù)據(jù)分發(fā)單位的原始鏡像被轉(zhuǎn)換成支持細(xì)粒度按需讀取的數(shù)據(jù)格式,并存放在延遲和吞吐都更優(yōu)的存儲(chǔ)中。
高效解壓
除了按需加載帶來(lái)的下載步驟延時(shí)節(jié)省,鏡像加速技術(shù)在數(shù)據(jù)解壓步驟也同樣做了大量?jī)?yōu)化。下圖可以看出即使在加載 70% 以上全量數(shù)據(jù)的情況下,優(yōu)化效果仍然超過(guò) 60%。
未來(lái)規(guī)劃
函數(shù)計(jì)算正式發(fā)布了容器鏡像加速,通過(guò)按需讀取和更高效的解壓技術(shù)在不同場(chǎng)景下加速 50%-80%,即使 GB 級(jí)別的鏡像也可以在幾秒內(nèi)完成端到端啟動(dòng)。加速功能結(jié)合函數(shù)計(jì)算極致彈性和事件觸發(fā)的特點(diǎn),解鎖了更多對(duì)實(shí)時(shí)要求高的工作負(fù)載。容器應(yīng)用可以更容易地享受 Serverless 特性,真正做到縮容到0以及快速大規(guī)模擴(kuò)容。FC 在未來(lái)會(huì)持續(xù)優(yōu)化冷啟動(dòng)各個(gè)環(huán)節(jié)提供極致彈性,承擔(dān)更多用戶責(zé)任,使開(kāi)發(fā)者專注業(yè)務(wù)創(chuàng)新。
附錄:實(shí)驗(yàn)場(chǎng)景數(shù)據(jù)
| python-flask | Web 應(yīng)用 | 46MB | 118MB |
| ecommerce-nodejs | 電商, nodejs express | 130MB | 371MB |
| ml-small-import/;ml-large-import | 機(jī)器學(xué)習(xí),使用 numpy, pandas, pystan 等庫(kù) | 728MB | 2.392GB |
| ai-cat-or-dog | 機(jī)器學(xué)習(xí),人工智能,推理預(yù)測(cè) tensorflow, keras 等庫(kù) | 790MB | 1.824GB |
| puppeteer-pdf | Headless chrome,網(wǎng)頁(yè)轉(zhuǎn) PDF, 使用 puppeteer, nodejs express | 332MB | 894MB |
| cypress-chrome | 前端 UI 自動(dòng)化,cypress, headless chrome | 980MB | 2.608GB |
參考
? 函數(shù)計(jì)算支持容器鏡像-加速應(yīng)用 Serverless 進(jìn)程
? New for AWS Lambda – Container Image Support
? 函數(shù)計(jì)算鏡像拉取加速文檔
? Docker Slim: Minify and Secure Docker containers (free and open source!)
? christopher-talke/node-express-puppeteer-pdf-example
? awesome-fc/custom-container-docs
原文鏈接:https://developer.aliyun.com/article/781992?
版權(quán)聲明:本文內(nèi)容由阿里云實(shí)名注冊(cè)用戶自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,阿里云開(kāi)發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請(qǐng)查看《阿里云開(kāi)發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開(kāi)發(fā)者社區(qū)知識(shí)產(chǎn)權(quán)保護(hù)指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫(xiě)侵權(quán)投訴表單進(jìn)行舉報(bào),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。總結(jié)
以上是生活随笔為你收集整理的函数计算镜像加速:从分钟到秒的跨越的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 有赞 Flink 实时任务资源优化探索与
- 下一篇: 浅谈分库分表那些事儿