小米科技|Spring Boot Serverless 實戰系列 | 性能調優

小米科技|Spring Boot Serverless 實戰系列 | 性能調優

文章圖片

【小米科技|Spring Boot Serverless 實戰系列 | 性能調優】小米科技|Spring Boot Serverless 實戰系列 | 性能調優

文章圖片

小米科技|Spring Boot Serverless 實戰系列 | 性能調優

文章圖片

小米科技|Spring Boot Serverless 實戰系列 | 性能調優

文章圖片

小米科技|Spring Boot Serverless 實戰系列 | 性能調優

文章圖片


SpringBoot 是基于 Java Spring 框架的套件 , 它預裝了 Spring 的一系列組件 , 讓開發者只需要很少的配置就可以創建獨立運行的應用程序 。 在云原生的世界 , 有大量的平臺可以運行 SpringBoot 應用 , 例如虛擬機 , 容器等 。 但其中最有吸引力的 , 是以 Serverless 的方式運行 SpringBoot 應用 。 我將通過一系列文章 , 從架構 , 部署 , 監控、性能、安全等5個方面來分析 Serverless 平臺運行 SpringBoot 應用的優劣 。 為了讓分析更有代表性 , 我選擇了 github 上 star 數超過 50k 的電商應用 mall 作為示例 。 這是系列文章的第四篇 ,向大家展示如何對 Serverless 應用性能調優 。
實例啟動速度優化 在之前的文章實戰教程中 , 相信大家都感受到 Serverless 的便捷之美 , 只需上傳代碼包和鏡像就能夠輕松上線一個彈性高可用的 Web 應用 。 但是它仍存在首次啟動“冷啟動延時”的問題 , Mall 應用實例的啟動大約 30 秒左右 , 用戶會感受較長時間的冷啟動延時 , 在這個“即時時代”應用程序響應慢多少會有些瑕不掩瑜 。 (“冷啟動”是指函數服務于特定調用請求時的狀態 , 當一段時間沒有請求后 , Serverless 平臺則會回收函數實例;等到下一次再有請求時 , 系統會再次實時拉起實例 , 這個過程稱之為冷啟動 。 )
在優化冷啟動之前 , 我們先要分析清楚冷啟動各個階段的耗時 。 首先在函數計算(FC) 控制臺的服務配置界面 , 開啟鏈路追蹤功能 。

對 mall-admin 服務發起請求 , 成功后查看 FC 控制臺 , 我們能夠看到相應的請求信息 。 注意關閉“僅查看函數錯誤” , 這樣才會顯示所有請求 。 指標監控和調用鏈路數據收集會存在一定延時 , 如果沒有顯示 , 請等待一會再刷新 。 找到冷啟動標記的請求 , 點擊 “更多” 下的 “請求詳情” 。

調用鏈路會顯示冷啟動各個環節的耗時 。 冷啟動包含以下幾個環節:
代碼準備(PrepareCode):主要是下載代碼包或者鏡像 。 由于我們已經啟用了鏡像加速功能 , 不需要下載全部的鏡像 , 因此這一步的延時非常短 。運行時初始化(RuntimeInitialization):從啟動函數開始 , 到函數計算(FC)系統探測到應用端口就緒為止 。 這中間包含了應用啟動時間 。 在命令行執行 s mall-admin logs 查看相應的日志時間 , 我們也能看到 Spring Boot 應用的啟動需要花大量的時間 。應用初始化(Initialization):函數計算提供了 Initializer 接口 , 用戶可以將一些初始化邏輯放在 initializer 中執行 。調用延時(Invocation):處理請求的延時 , 這個延時非常短 。
從上述鏈路追蹤圖來看 , 實例啟動時間是瓶頸 , 我們可以采取多種方式來優化 。
1.1. 使用預留實例
Java 類應用普遍啟動較慢 。 應用在初始化時 , 也需要和很多外部服務交互 , 耗時較長 。 這類流程是業務邏輯需要的 , 很難優化延時 。 因此函數計算提供了預留實例功能 。 預留實例的起停由用戶自己控制 , 沒有請求也會常駐在那 , 因此不會有冷啟動的問題 , 當然用戶需要為整個實例的運行付費 , 即便實例沒有處理任何請求 。

相關經驗推薦