全部產品
Search
文件中心

Function Compute:Function Compute冷啟動最佳化最佳實務

更新時間:Jul 06, 2024

本文介紹如何通過設定Function Compute的預留模式執行個體最佳化按量模式執行個體的冷啟動和函數效能。

什麼是冷啟動

Function Compute提供了按量模式和預留模式兩種執行個體使用模式。按量模式是指函數執行個體的分配和釋放完全由Function Compute系統負責,您只需要根據執行個體執行請求的時間按需付費。按量模式降低了管理應用資源的難度,但也造成了冷啟動,延時等效能問題。

冷啟動是指在函數調用鏈路中的代碼下載、啟動函數執行個體容器、運行時初始化、代碼初始化等環節。當冷啟動完成後,函數執行個體就緒,後續請求就能直接被執行。

最佳化按量模式的冷啟動

冷啟動的最佳化使用者和平台配合完成。Function Compute已經對系統側的冷啟動做了大量最佳化。對於使用者側的冷啟動,建議您從以下幾方面最佳化:

  • 精簡程式碼封裝

    開發人員要盡量縮小程式碼封裝。去掉不必要的依賴。例如,在Node.js中執行npm prune命令,在Python中執行autoflake 。另外,某些第三方庫中可能會包含測試案例原始碼,無用的二進位檔案和資料檔案等,刪除無用檔案可以降低函數代碼下載和解壓時間。

  • 選擇合適的函數語言

    由於語言理念的差異,Java運行時冷啟動時間通常要高於其他語言。對於冷啟動延遲敏感的應用,在暖開機延遲差別不大的情況下,使用Python輕量語言可以大幅降低長尾延遲。

  • 選擇合適的記憶體

    在並發量一定的情況下,函數記憶體越大,分配的CPU資源相應越多,因此冷啟動表現越優。

  • 降低冷啟動機率

    • 使用定時觸發器預熱函數。

    • 使用Initializer函數入口,Function Compute會非同步呼叫初始化介面,消除掉代碼初始化的時間,在Function Compute系統升級或者函數更新過程中,您對冷啟動無感知。

混合模式

使用者側的冷啟動一般難以消除。例如,在深度學習推理中,要載入大量的模型檔案時;函數要和遺留系統互動,必須使用初始化耗時很長的用戶端時。在這些情境下,如果函數對延時非常敏感,您可以為函數設定預留模式執行個體,或者在同一個函數裡同時使用預留模式執行個體和按量模式執行個體。

預留模式執行個體的分配和釋放由您管理,根據執行個體的運行時間長度計費。當負載對資源的需求超過預留模式執行個體的能力後,系統自動使用按量模式執行個體,從而在效能和資源使用率上獲得平衡。通過預留模式執行個體,您能夠根據函數的負載變化提前分配好計算資源,系統能夠在擴容按量模式執行個體時仍然使用預留模式執行個體處理請求,從而徹底消除冷啟動帶來的延時。

下圖展示了混合使用預留模式執行個體和按量模式執行個體,既避免了冷啟動的延時,又實現了極高的資源使用率。

按量執行個體和預留執行個體

當您混合使用預留模式執行個體和按量模式執行個體時,保證優先使用預留模式執行個體。假設您為函數預留了10個執行個體,如果一秒內需要的執行個體數超過10個,系統會建立新的按量模式執行個體處理請求。判斷一個執行個體是否滿載和該執行個體上的並發請求數配置有關。系統追蹤每個函數執行個體上正在處理的請求數,當並發的請求數達到您設定的上限後,系統會選擇其他的函數執行個體。當所有執行個體的請求數都達到上限後,建立新的執行個體。預留模式執行個體由您管理,即使沒有請求,您也需要為閑置的預留模式執行個體付費。按量模式執行個體由Function Compute系統管理,系統在適當的時候將回收沒有請求處理的閑置按量模式執行個體。您只需為按量模式執行個體實際處理請求的時間段付費。計費規則詳情,請參見計費概述。您可以設定按量模式執行個體的使用上限,確保資源的使用在期望的範圍內。