<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Serverless 應(yīng)用優(yōu)化的四則秘訣

          共 4386字,需瀏覽 9分鐘

           ·

          2022-01-05 02:25

          作者 | 劉宇


          在 Serverless 架構(gòu)下,我們更多精力是關(guān)注于業(yè)務(wù)代碼,但是實(shí)際上對于一些配置和成本也是需要進(jìn)行關(guān)注的,并且在必要的時(shí)候,還需要根據(jù)配置與成本對我們的 Serverless 應(yīng)用進(jìn)行配置優(yōu)化和代碼優(yōu)化。



          資源評估依舊重要



          雖然 Serverless 架構(gòu)是按量付費(fèi)的,但是并不代表它就一定比傳統(tǒng)的服務(wù)器租用費(fèi)用低,如果我們對自己的項(xiàng)目評估不準(zhǔn)確,對一些指標(biāo)設(shè)置不合理,Serverless 架構(gòu)所產(chǎn)生的費(fèi)用可能是巨大的。


          一般情況下,F(xiàn)aaS 平臺的收費(fèi)是和三個(gè)指標(biāo)具有直接關(guān)系的:


          • 所配置的內(nèi)存規(guī)格;

          • 程序所消耗的時(shí)間;

          • 以及產(chǎn)生的流量費(fèi)用。


          通常情況下程序所消耗的時(shí)間可能會與內(nèi)存規(guī)格、程序本身所處理的業(yè)務(wù)邏輯有關(guān)。流量費(fèi)用與程序本身和客戶端交互的數(shù)據(jù)包大小有關(guān),所以在這三個(gè)常見的指標(biāo),可能因?yàn)榕渲貌灰?guī)范導(dǎo)致計(jì)費(fèi)出現(xiàn)比較大偏差的就是內(nèi)存規(guī)格。以阿里云函數(shù)計(jì)算為例,我們假設(shè)有一個(gè) Hello World 的程序,每天都會被執(zhí)行 10000 次,可以統(tǒng)計(jì)不同規(guī)格的實(shí)例所產(chǎn)生的費(fèi)用(不包括網(wǎng)絡(luò)費(fèi)用):

          阿里云函數(shù)計(jì)算不同內(nèi)存規(guī)格收費(fèi)統(tǒng)計(jì)


          通過上表可以看到,當(dāng)程序在 128MB 規(guī)格的內(nèi)存中可以正常執(zhí)行,如果我們錯(cuò)誤地將內(nèi)存規(guī)格設(shè)置成了 3072MB,可能每月產(chǎn)生的費(fèi)用將會暴漲 25 倍!所以我們在上線 Serverless 應(yīng)用之前,要對資源進(jìn)行評估,以便得到更合理的配置來進(jìn)一步降低我們的成本。


          合理的代碼包規(guī)格



          各個(gè)云廠商的 FaaS 平臺中都對代碼包大小有著限制,拋掉云廠商對代碼包的限制,單純地說代碼包的規(guī)格可能會產(chǎn)生的影響,通過函數(shù)的冷啟動(dòng)流程可以看到:

          函數(shù)冷啟動(dòng)流程簡圖

          在函數(shù)啟動(dòng)的過程中,有一個(gè)過程是加載代碼的過程,那么當(dāng)我們所上傳的代碼包過大,或者說文件過多導(dǎo)致解壓速度過慢,就會直接導(dǎo)致加載代碼這個(gè)過程變長,進(jìn)一步直接導(dǎo)致冷啟動(dòng)時(shí)間變久。


          可以設(shè)想一下,當(dāng)我們有兩個(gè)壓縮包,一個(gè)是只有 100KB 的代碼壓縮包,另一個(gè)是 200MB 的代碼壓縮包,兩者同時(shí)在千兆的內(nèi)網(wǎng)帶寬下理想化(即不考慮磁盤的存儲速度等)下載,即使最大速度可以達(dá)到 125MB/S,那么前者的下載速度只有不到 0.01s,后者需要 1.6s。除了下載時(shí)間之外,還有文件的解壓時(shí)間,那么兩者的冷啟動(dòng)時(shí)間可能就相差 2s。


          一般情況下,一個(gè)傳統(tǒng)的 Web 接口,如果要 2s 以上的響應(yīng)時(shí)間,實(shí)際上對很多業(yè)務(wù)來說是不能接受的,所以在我們打包代碼時(shí)就要盡可能的降低壓縮包大小。以 Node.js 項(xiàng)目為例,打包代碼包時(shí),可以采用 Webpack 等方法,來壓縮依賴包大小,進(jìn)一步降低整體代碼包的規(guī)格,提升函數(shù)的冷啟動(dòng)效率。


          合理利用實(shí)例的復(fù)用



          在各個(gè)云廠商的 FaaS 平臺中,為了更好的解決冷啟動(dòng)的問題,為了更合理的利用資源,是存在“實(shí)例”復(fù)用情況的。所謂的實(shí)例復(fù)用,就是當(dāng)一個(gè)實(shí)例完成一個(gè)請求后并不會釋放,而是進(jìn)入“靜默”的狀態(tài)。在一定時(shí)間范圍內(nèi),如果有新的請求被分配過來,則會直接調(diào)用對應(yīng)的方法,而不需要再初始化各類資源等,這在很大程度上減少了函數(shù)冷啟動(dòng)的情況出現(xiàn)。為了驗(yàn)證,我們可以創(chuàng)建兩個(gè)函數(shù):

          • 函數(shù) 1:

          # -*- coding: utf-8 -*-
          def handler(event, context): print("Test") return 'hello world'
          • 函數(shù) 2:

          # -*- coding: utf-8 -*-
          print("Test")
          def handler(event, context): return 'hello world'

          我們在控制臺多次點(diǎn)擊“測試”按鈕,對這兩個(gè)函數(shù)進(jìn)行測試,判斷其是否在日志中輸出了 “Test”,我們可以統(tǒng)計(jì)結(jié)果:


          函數(shù)復(fù)用記錄


          根據(jù)上面的情況,我們可以看到,其實(shí)實(shí)例復(fù)用的情況是存在的。因?yàn)椤昂瘮?shù) 2”并不是每次都會執(zhí)行入口函數(shù)之外的一些語句。根據(jù)“函數(shù) 1”和“函數(shù) 2”,我們也可以進(jìn)一步思考,如果 print("Test") 語句是一個(gè)初始化數(shù)據(jù)庫連接,或者是加載一個(gè)深度學(xué)習(xí)的模型,是不是“函數(shù) 1”的寫法就是每次請求都會執(zhí)行,而“函數(shù) 2”的寫法是可以存在復(fù)用已有對象的情況?


          所以在實(shí)際的項(xiàng)目中,有一些初始化操作,是可以按照“函數(shù) 2”來進(jìn)行實(shí)現(xiàn)的,例如:


          • 機(jī)器學(xué)習(xí)場景下,在初始化的時(shí)候加載模型,避免每次函數(shù)被觸發(fā)都會加載模型帶來的效率問題,提高實(shí)例復(fù)用場景下的響應(yīng)效率;
          • 數(shù)據(jù)庫等鏈接操作,可以在初始化的時(shí)候進(jìn)行鏈接對象的建立,避免每次請求都創(chuàng)建鏈接對象;
          • 其他一些需要首次加載時(shí)下載文件,加載文件的場景,在初始化的時(shí)候進(jìn)行這部分需求的實(shí)現(xiàn),可以在實(shí)例復(fù)用的時(shí)候效率更高;


          善于利用函數(shù)特性



          各個(gè)云廠商的 FaaS 平臺都有一些“平臺特性”,所謂的平臺特性,是指這些功能可能并不是《CNCF WG-Serverless Whitepaper v 1.0》中規(guī)定的能力,或者描述的能力,僅僅是作為云平臺根據(jù)自身業(yè)務(wù)發(fā)展和訴求,從用戶角度出發(fā)挖掘出來,并且實(shí)現(xiàn)的功能,可能只在某個(gè)云平臺或者某幾個(gè)云平臺所擁有的功能。這類功能一般情況下如果利用得當(dāng)會讓我們的業(yè)務(wù)性能等有質(zhì)的提升。


          1、Pre-freeze & Pre-stop


          以阿里云函數(shù)計(jì)算為例,在平臺發(fā)展過程中,用戶痛點(diǎn)(尤其是傳統(tǒng)應(yīng)用平滑遷移至 Serverless 架構(gòu))如下:


          • 異步背景指標(biāo)數(shù)據(jù)延遲或丟失:如果在請求期間沒有發(fā)送成功,則可能被延遲至下一次請求,或者數(shù)據(jù)點(diǎn)被丟棄。
          • 同步發(fā)送指標(biāo)增加延遲:如果在每個(gè)請求結(jié)束后都調(diào)用類似 Flush 接口,不僅增加了每個(gè)請求的延遲,對于后端服務(wù)也產(chǎn)生了不必要的壓力。
          • 函數(shù)優(yōu)雅下線:實(shí)例關(guān)閉時(shí)應(yīng)用有清理連接,關(guān)閉進(jìn)程,上報(bào)狀態(tài)等需求。在函數(shù)計(jì)算中實(shí)例下線時(shí)機(jī)開發(fā)者無法掌握,也缺少 Webhook 通知函數(shù)實(shí)例下線事件。

          根據(jù)這些痛點(diǎn)發(fā)布了運(yùn)行時(shí)擴(kuò)展(runtime extensions)功能。該功能在現(xiàn)有的 HTTP 服務(wù)編程模型上擴(kuò)展,在已有的 HTTP 服務(wù)器的模型中增加了 PreFreeze 和 PreStop webhooks。擴(kuò)展開發(fā)者實(shí)現(xiàn) HTTP handler,監(jiān)聽函數(shù)實(shí)例生命周期事件,如下圖所示:

          擴(kuò)展編程模型與現(xiàn)有編程模型處理的工作內(nèi)容簡圖


          • PreFreeze:在每次函數(shù)計(jì)算服務(wù)決定冷凍當(dāng)前函數(shù)實(shí)例前,函數(shù)計(jì)算服務(wù)會調(diào)用 HTTP GET /pre-freeze 路徑,擴(kuò)展開發(fā)者負(fù)責(zé)實(shí)現(xiàn)相應(yīng)邏輯以確保完成實(shí)例冷凍前的必要操作,例如等待指標(biāo)發(fā)送成功等。函數(shù)調(diào)用 InvokeFunction 的時(shí)間不包 PreFreeze Hook 的執(zhí)行時(shí)間。

          PreFreeze 時(shí)序圖


          • PreStop:在每次函數(shù)計(jì)算決定停止當(dāng)前函數(shù)實(shí)例前,函數(shù)計(jì)算服務(wù)會調(diào)用 HTTP GET /pre-stop 路徑,擴(kuò)展開發(fā)者負(fù)責(zé)實(shí)現(xiàn)相應(yīng)邏輯以確保完成實(shí)例釋放前的必要操作,如關(guān)閉數(shù)據(jù)庫鏈接,以及上報(bào)、更新狀態(tài)等。

          PerStope 時(shí)序圖


          2、單實(shí)例多并發(fā)


          眾所周知,各個(gè)廠商的函數(shù)計(jì)算通常是請求級別的隔離,即當(dāng)客戶端同時(shí)發(fā)起 3 個(gè)請求到函數(shù)計(jì)算,理論上會產(chǎn)生三個(gè)實(shí)例來進(jìn)行應(yīng)對,這個(gè)時(shí)候可能會涉及到冷啟動(dòng)問題,可能會涉及到請求之間狀態(tài)關(guān)聯(lián)問題等,但是部分云廠商提供了單實(shí)例多并發(fā)的能力(例如阿里云函數(shù)計(jì)算),該能力允許用戶為函數(shù)設(shè)置一個(gè)實(shí)例并發(fā)度(InstanceConcurrency),即單個(gè)函數(shù)實(shí)例可以同時(shí)處理多少個(gè)請求。


          如圖下圖,假設(shè)同時(shí)有 3 個(gè)請求需要處理,當(dāng)實(shí)例并發(fā)度設(shè)置為 1 時(shí),函數(shù)計(jì)算需要?jiǎng)?chuàng)建3個(gè)實(shí)例來處理這 3 個(gè)請求,每個(gè)實(shí)例分別處理 1 個(gè)請求;當(dāng)實(shí)例并發(fā)度設(shè)置為 10 時(shí)(即 1 個(gè)實(shí)例可以同時(shí)處理 10 個(gè)請求),函數(shù)計(jì)算只需要?jiǎng)?chuàng)建 1 個(gè)實(shí)例就能處理這 3 個(gè)請求。


          單實(shí)例多并發(fā)效果簡圖


          單實(shí)例多并發(fā)的優(yōu)勢如下:


          • 減少執(zhí)行時(shí)長,節(jié)省費(fèi)用。例如,偏 I/O 的函數(shù)可以在一個(gè)實(shí)例內(nèi)并發(fā)處理,減少實(shí)例數(shù)從而減少總的執(zhí)行時(shí)長。
          • 請求之間可以共享狀態(tài)。多個(gè)請求可以在一個(gè)實(shí)例內(nèi)共用數(shù)據(jù)庫連接池,從而減少和數(shù)據(jù)庫之間的連接數(shù)。
          • 降低冷啟動(dòng)概率。由于多個(gè)請求可以在一個(gè)實(shí)例內(nèi)處理,創(chuàng)建新實(shí)例的次數(shù)會變少,冷啟動(dòng)概率降低。
          • 減少占用 VPC IP 在相同負(fù)載下,單實(shí)例多并發(fā)可以降低總的實(shí)例數(shù),從而減少 VPC IP 的占用。


          單實(shí)例多并發(fā)的應(yīng)用場景是比較廣泛的,例如函數(shù)中有較多時(shí)間在等待下游服務(wù)的響應(yīng)的場景就比較適合使用該種功能,但是單實(shí)例多并發(fā)也并不適合全部應(yīng)用場景,例如當(dāng)函數(shù)中有共享狀態(tài)且不能并發(fā)訪問的場景,單個(gè)請求的執(zhí)行要消耗大量 CPU 及內(nèi)存資源的場景,就不適合使用單實(shí)例多并發(fā)這個(gè)功能。

          關(guān)于作者:


          劉宇(花名:江昱)國防科技大學(xué)電子信息專業(yè)在讀博士,阿里云 Serverless 產(chǎn)品經(jīng)理,阿里云 Serverless 麒麟布道師。


          新書推薦





          本書通過多個(gè)開源項(xiàng)目、多個(gè)云廠商的多款云產(chǎn)品,以及多種途徑向讀者介紹什么是 Serverless 架構(gòu)、如何上手 Serverless 架構(gòu)、不同領(lǐng)域中 Serverless 架構(gòu)的應(yīng)用以及如何從零開發(fā)一個(gè) Serverless 應(yīng)用等。幫助讀者將 Serverless 架構(gòu)融入到自己所在的領(lǐng)域,把 Serverless 項(xiàng)目真實(shí)落地,獲得 Serverless 架構(gòu)帶來的技術(shù)紅利。


          社區(qū)官網(wǎng)

          Serverless?Devs


          社區(qū)官網(wǎng) http://www.serverless-devs.com/項(xiàng)目倉庫 https://github.com/Serverless-Devs/Serverless-DevsServerless?Desktop?桌面客戶端 https://serverlessdevs.resume.net.cn/zh-cn/desktop/index.htmlServerless應(yīng)用開發(fā)者套件 http://serverlessdk.oss.devsapp.net/docs/tutorial-dk/intro/reactServerless?Devs?CLI https://serverlessdevs.resume.net.cn/zhcn/cli/index.htmlServerless?Hub?應(yīng)用中心 https://serverlesshub.resume.net.cn/#/hubs/special-view


          ?原文,可報(bào)名 1.13 Serverless 技術(shù)實(shí)踐營南京站!
          瀏覽 35
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲操逼123 | 不卡成人免费在线视频 | 国产免费一区二区三区四区午夜视频 | 日韩在线免费 | 青青草在线撸 |