1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Spring Boot Serverless 實(shí)戰(zhàn)系列 | 性能調(diào)優(yōu)

        共 3368字,需瀏覽 7分鐘

         ·

        2022-01-23 05:01

        點(diǎn)擊上方藍(lán)字關(guān)注我們



        作者 | 西流(阿里云函數(shù)計(jì)算專家)


        “?
        導(dǎo)讀:
        Spring Boot 是基于 Java Spring 框架的套件,它預(yù)裝了 Spring 的一系列組件,讓開發(fā)者只需要很少的配置就可以創(chuàng)建獨(dú)立運(yùn)行的應(yīng)用程序。在云原生的環(huán)境中,有大量的平臺可以運(yùn)行 Spring Boot 應(yīng)用,例如虛擬機(jī)、容器等。但其中最有吸引力的,是以 Serverless 的方式運(yùn)行 Spring Boot 應(yīng)用。

        我將通過一系列文章,從架構(gòu),部署,監(jiān)控、性能、安全等 5 個(gè)方面來分析 Serverless 平臺運(yùn)行 Spring Boot 應(yīng)用的優(yōu)劣。為了讓分析更有代表性,我選擇了 Github 上 star 數(shù)超過 50k 的電商應(yīng)用 mall?作為示例。這是系列文章的第四篇, 本文向大家展示如何對 Serverless 應(yīng)用進(jìn)行性能調(diào)優(yōu)。


        實(shí)例啟動(dòng)速度優(yōu)化



        在之前的文章實(shí)戰(zhàn)教程中,相信大家都感受到 Serverless 的便捷之美,只需上傳代碼包和鏡像就能夠輕松上線一個(gè)彈性高可用的 Web 應(yīng)用。


        但是它仍存在首次啟動(dòng)“冷啟動(dòng)延時(shí)”的問題,Mall 應(yīng)用實(shí)例的啟動(dòng)大約 30 秒左右,用戶會感受較長時(shí)間的冷啟動(dòng)延時(shí),在這個(gè)“即時(shí)時(shí)代”應(yīng)用程序響應(yīng)慢多少會有些瑕不掩瑜。(“冷啟動(dòng)”是指函數(shù)服務(wù)于特定調(diào)用請求時(shí)的狀態(tài),當(dāng)一段時(shí)間沒有請求后,Serverless 平臺則會回收函數(shù)實(shí)例;等到下一次再有請求時(shí),系統(tǒng)會再次實(shí)時(shí)拉起實(shí)例,該過程稱之為冷啟動(dòng)。)


        在優(yōu)化冷啟動(dòng)之前,我們要先分析清楚冷啟動(dòng)各個(gè)階段的耗時(shí)。

        首先在函數(shù)計(jì)算(FC) 控制臺的服務(wù)配置界面,開啟鏈路追蹤功能。



        對 mall-admin 服務(wù)發(fā)起請求,成功后查看 FC 控制臺,我們能夠看到相應(yīng)的請求信息。注意關(guān)閉“僅查看函數(shù)錯(cuò)誤”,這樣才會顯示所有請求。指標(biāo)監(jiān)控和調(diào)用鏈路數(shù)據(jù)收集會存在一定延時(shí),如果沒有顯示,請等待一會再刷新。找到冷啟動(dòng)標(biāo)記的請求,點(diǎn)擊 “更多” 下的 “請求詳情”。



        調(diào)用鏈路會顯示冷啟動(dòng)各個(gè)環(huán)節(jié)的耗時(shí)。冷啟動(dòng)包含以下幾個(gè)環(huán)節(jié):


        • 代碼準(zhǔn)備(PrepareCode):主要是下載代碼包或者鏡像。由于我們已經(jīng)啟用了鏡像加速功能,不需要下載全部的鏡像,因此這一步的延時(shí)非常短。

        • 運(yùn)行時(shí)初始化(RuntimeInitialization):從啟動(dòng)函數(shù)開始,到函數(shù)計(jì)算(FC)系統(tǒng)探測到應(yīng)用端口就緒為止。這中間包含了應(yīng)用啟動(dòng)時(shí)間。在命令行執(zhí)行 s mall-admin logs 查看相應(yīng)的日志時(shí)間,我們也能看到 Spring Boot 應(yīng)用的啟動(dòng)需要花大量的時(shí)間。

        • 應(yīng)用初始化(Initialization):函數(shù)計(jì)算提供了 Initializer 接口,用戶可以將一些初始化邏輯放在 Initializer 中執(zhí)行。

        • 調(diào)用延時(shí)(Invocation):處理請求的延時(shí),這個(gè)延時(shí)非常短。


        從上述鏈路追蹤圖來看,實(shí)例啟動(dòng)時(shí)間是瓶頸,但是我們可以采取多種方式來優(yōu)化。


        1、使用預(yù)留實(shí)例


        Java 類應(yīng)用普遍會啟動(dòng)較慢。應(yīng)用在初始化時(shí),也需要和很多外部服務(wù)交互,耗時(shí)較長。這類流程是業(yè)務(wù)邏輯需要的,很難優(yōu)化延時(shí)。因此函數(shù)計(jì)算提供了預(yù)留實(shí)例功能。預(yù)留實(shí)例的起停由用戶自己控制,沒有請求也會常駐在那,因此不會有冷啟動(dòng)的問題,當(dāng)然用戶需要為整個(gè)實(shí)例的運(yùn)行付費(fèi),即便實(shí)例沒有處理任何請求。


        在函數(shù)計(jì)算控制臺,我們可以在“彈性伸縮”頁面為函數(shù)設(shè)置預(yù)留實(shí)例。



        用戶在控制臺中配置最小和最大實(shí)例數(shù)。平臺會預(yù)留最小實(shí)例數(shù)目的實(shí)例,最大實(shí)例是指該函數(shù)下實(shí)例的上限。用戶也可以設(shè)置定時(shí)預(yù)留和按指標(biāo)預(yù)留的規(guī)則。



        創(chuàng)建預(yù)留規(guī)則后,系統(tǒng)就會創(chuàng)建預(yù)留實(shí)例。當(dāng)預(yù)留實(shí)例就緒后,我們再訪問函數(shù)就不會有冷啟動(dòng)。



        2、優(yōu)化實(shí)例啟動(dòng)速度


        延遲初始化


        在 Spring Boot 2.2 及更高版本中,可以開啟一個(gè)全局延遲初始化標(biāo)志。這將提高啟動(dòng)速度,但代價(jià)是第一個(gè)請求的延遲時(shí)間可能變長,因?yàn)樾枰却M件首次初始化。


        可在 s.yaml 中為相關(guān)應(yīng)用配置以下環(huán)境變量


        SPRING_MAIN_LAZY_INITIATIALIZATION=true

        關(guān)閉優(yōu)化編譯器


        默認(rèn)情況下,JVM 有多個(gè)階段的 JIT 編譯。雖然這些階段可以逐漸提高應(yīng)用的效率,但它們也會增加內(nèi)存使用的開銷,并增加啟動(dòng)時(shí)間。對于短期運(yùn)行的 Serverless 應(yīng)用,請考慮關(guān)閉此優(yōu)化,以犧牲長期效率換取更短的啟動(dòng)時(shí)間。


        可在 s.yaml 中為相關(guān)應(yīng)用配置以下環(huán)境變量:

        JAVA_TOOL_OPTIONS="-XX:+TieredCompilation -XX:TieredStopAtLevel=1"

        s.yaml 中設(shè)置環(huán)境變量示例:


        如下圖所示,對 mall-admin 函數(shù)配置環(huán)境變量。然后執(zhí)行 sudo -E s mall-admin deploy 部署。



        登錄實(shí)例檢查環(huán)境變量是否配置正確:


        在控制臺函數(shù)詳情頁的請求列表中找到對應(yīng)的請求,點(diǎn)擊更多中的“實(shí)例詳情鏈接”。



        在實(shí)例詳情頁中點(diǎn)擊“登錄實(shí)例”。



        在 shell 界面中執(zhí)行 echo 命令,查看對應(yīng)的環(huán)境變量是否設(shè)置正確。


        注意:對于非預(yù)留實(shí)例,一段時(shí)間沒有請求后,函數(shù)計(jì)算系統(tǒng)會自動(dòng)回收實(shí)例。此時(shí)無法再登入實(shí)例(上面的實(shí)例詳情頁面中的登錄實(shí)例按鈕會變灰)。所以請執(zhí)行調(diào)用后,在實(shí)例被回收之前盡快登錄。


        配置合理的實(shí)例參數(shù)



        當(dāng)我們選擇了應(yīng)用實(shí)例規(guī)格,比如 2C4G 或者 4C8G,接下來我們希望知道一個(gè)實(shí)例處理多少請求可以既能充分利用資源又能夠保證性能。當(dāng)處理的請求超過一個(gè)限制后,系統(tǒng)能夠快速彈出實(shí)例,保證應(yīng)用性能平滑。

        如何度量實(shí)例過載有多個(gè)維度,例如 qps 超過一定閾值,或者實(shí)例 CPU/Memory/Network/Load 等指標(biāo)超過閾值等等。函數(shù)計(jì)算使用實(shí)例并發(fā)度(Instance Concurrency)來作為實(shí)例負(fù)載的度量和實(shí)例伸縮的依據(jù)。

        實(shí)例并發(fā)度(Instance Concurrency)是指一個(gè)實(shí)例能同時(shí)執(zhí)行的請求數(shù)。例如將實(shí)例并發(fā)度設(shè)置為 20,則意味著一個(gè)實(shí)例在任意時(shí)刻最大能同時(shí)執(zhí)行 20 個(gè)請求。


        注意:請區(qū)分實(shí)例并發(fā)度和 QPS 的區(qū)別。

        使用實(shí)例并發(fā)度來度量負(fù)載有如下優(yōu)勢:

        • 系統(tǒng)能夠迅速統(tǒng)計(jì)實(shí)例并發(fā)度指標(biāo)值進(jìn)行擴(kuò)縮容CPU/Memory/Network/Load 等實(shí)例級別的指標(biāo)通常是后臺統(tǒng)計(jì),需要花費(fèi)數(shù)十秒的指標(biāo)統(tǒng)計(jì)后才能進(jìn)行伸縮,難以滿足在線應(yīng)用的彈性伸縮要求。


        • 在各種條件下,實(shí)例并發(fā)度指標(biāo)都能夠穩(wěn)定的反映系統(tǒng)負(fù)載高低。如果以請求延時(shí)作為指標(biāo),系統(tǒng)難以區(qū)分是實(shí)例過載導(dǎo)致延時(shí)變大,還是下游服務(wù)成為瓶頸導(dǎo)致延時(shí)變大。例如一個(gè)典型的 Web 應(yīng)用,通常會訪問 MySQL 數(shù)據(jù)庫。如果數(shù)據(jù)庫成為瓶頸,請求延時(shí)變大,此時(shí)擴(kuò)容不但毫無意義,而且會壓垮數(shù)據(jù)庫,讓情況更加惡化。QPS 和請求延時(shí)相關(guān),也會有上述問題。


        實(shí)例并發(fā)度作為伸縮依據(jù)雖然有上述優(yōu)點(diǎn),但用戶常常并不知道該設(shè)置多大的實(shí)例并發(fā)度。我推薦按照下述流程確定合理的并發(fā)度:


        1. 將應(yīng)用函數(shù)的最大實(shí)例數(shù)設(shè)置為 1,確保壓測到單個(gè)實(shí)例的性能。
        2. 使用負(fù)載壓測工具對應(yīng)用進(jìn)行壓測,查看 tps 和請求延時(shí)等指標(biāo)。
        1. 逐步調(diào)大實(shí)例并發(fā)度,如果性能仍然良好,則繼續(xù)調(diào)大;如果性能不符合預(yù)期,則調(diào)小并發(fā)度。


        文中網(wǎng)址匯總(可滑動(dòng))


        Spring Boot:https://spring.io/projects/spring-bootMall:https://github.com/macrozheng/mallServerless Devs 安裝文檔:http://serverlessdevs.com/zhcn/docs/installed/cliinstall.html函數(shù)計(jì)算:https://www.aliyun.com/product/fc





        獎(jiǎng)勵(lì)看到最后的你:


        # 點(diǎn)個(gè)在看,并在下方留言互動(dòng)
        # 然后,將
        截圖發(fā)送至后臺,試試手氣?
        # 本周互動(dòng)獎(jiǎng)品是
        “阿里云定制數(shù)據(jù)線”

        # 本期禮品開獎(jiǎng)時(shí)間1月25日?


        瀏覽 50
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            久久6| 原神18av黄漫网站钟离 | 欧美xXX一区二区 | 鸡巴视频αV | 周秀娜无删减床戏视频 | 女运动员裸体训练hd2014 | 五月天我淫我色 | 91精品变态操逼 | 精品国偷自产一区二区三区 | 免费视频在线观看黄 |