全部產品
Search
文件中心

Function Compute:執行個體伸縮限制及規則

更新時間:Nov 05, 2024

您可以根據按量模式和預留模式的執行個體總數及對應的執行個體擴容速度的限制資訊配置Auto Scaling規則。在預留模式下,您可以通過定時伸縮和水位伸縮兩種方式解決預留執行個體利用不充分的問題。

執行個體伸縮行為

在處理函數調用請求時,Function Compute會優先使用已有的可用執行個體。若當前執行個體已經滿載,Function Compute會建立新的執行個體來處理請求。隨著調用請求量的增加,Function Compute會持續建立新的執行個體,直到有足夠的執行個體處理請求或者達到您設定的執行個體數上限。在執行個體擴容的過程中,將受到擴容速度限制,具體請參見各地區執行個體擴容速度限制

當函數調用請求增加時,按量模式和預留模式的執行個體伸縮行為如下。配置預留執行個體後,可以提前準備好函數執行個體,從而避免執行個體冷啟動帶來的請求延時問題。

按量模式執行個體伸縮

當執行個體總數或者執行個體擴容速度超過限制後,Function Compute將返迴流控錯誤(HTTP Status429)。下圖展示在一個調用量快速增長的情境下,Function Compute的流控行為。

image

  • 圖示中①:在達到突增執行個體數前,Function Compute立即建立執行個體,這個過程中有冷啟動,但沒有流控錯誤。

  • 圖示中②:達到突增執行個體數後,執行個體數的增長受速度限制,部分請求會收到流控錯誤。

  • 圖示中③:執行個體數超過限制後,部分請求收到流控錯誤。

預留模式執行個體伸縮

當突發的調用量較大時,大量的執行個體建立會受到流控限制導致請求失敗,執行個體的冷啟動也會增加請求延時。為避免這些問題,您可以使用Function Compute的預留執行個體,即提前準備好函數執行個體。

與按量模式執行個體相同的負載情境下,使用預留執行個體後的流控行為如下。

image

  • 圖示中①:在預留執行個體被用滿之前,請求立即被執行,這個過程既沒有冷啟動,也沒有流控錯誤。

  • 圖示中②:在預留執行個體被用滿後,按量執行個體達到突增執行個體數之前,Function Compute立即建立執行個體,這個過程中有冷啟動,但沒有流控錯誤。

各地區執行個體擴容速度限制

地區

突增執行個體數

執行個體增長速度

華東1(杭州)、華東2(上海)、華北2(北京)、華北3(張家口)、華南1(深圳)

300

300/分鐘

其他

100

100/分鐘

  • 相同地區下,預留模式和按量模式的執行個體擴容速度限制一致。

  • GPU執行個體的擴容速度小於CPU執行個體,建議配合預留模式使用。

說明

如果您對擴容速度有更高的需求,請加入DingTalk使用者群(DingTalk群號64970014484)申請。

預留執行個體自動Auto Scaling

為預留執行個體配置固定的預留值可能會導致預留執行個體利用不充分的問題,您可以通過配置定時伸縮和水位伸縮兩種方式解決該問題。

說明

如果同時設定了定時伸縮和水位伸縮,最終會以這些伸縮規則得到的最大值作為預留執行個體數。

定時伸縮

適用情境

函數有明顯的周期性規律或可預知的流量高峰。當函數調用並發大於定時預留值時,超出的部分會分配至按量模式的函數執行個體。

配置樣本

配置兩個定時操作:在函數調用流量到來前,通過第一個定時配置將預留執行個體擴容至較大的值;當流量減小後,通過第二個定時配置將預留執行個體縮容到較小的值。具體如下圖所示。

image

在使用PutProvisionConfig API配置定時伸縮的請求參數時可參考以下資訊。為函數function_1配置定時伸縮策略,指定時區為Asia/Shanghai,即北京時間,配置的生效區間為2024-08-01 10:00:00至2024-08-30 10:00:00(北京時間),在每天20:00(北京時間)將預留函數執行個體擴容至50,在每天22:00(北京時間)再將預留函數執行個體收縮至10。

"scheduledActions": [
    {
      "name": "scale_up_action",
      "startTime": "2024-08-01T10:00:00",
      "endTime": "2024-08-30T10:00:00",
      "target": 50,
      "scheduleExpression": "cron(0 0 20 * * *)",
      "timeZone": "Asia/Shanghai"
    },
    {
      "name": "scale_down_action",
      "startTime": "2024-08-01T10:00:00",
      "endTime": "2024-08-30T10:00:00",
      "target": 10,
      "scheduleExpression": "cron(0 0 22 * * *)",
      "timeZone": "Asia/Shanghai"
    }
  ]

參數說明如下。

參數

說明

name

配置的定時任務名稱。

startTime

配置開始生效的時間,如果未設定時區,預設以UTC時間運行。

endTime

配置結束生效的時間,如果未設定時區,預設以UTC時間運行。

target

目標預留執行個體數。

scheduleExpression

定時資訊,如果未設定時區,預設以UTC時間運行,即北京時間減去8小時。

支援以下兩種格式:

  • At expressions - "at(yyyy-mm-ddThh:mm:ss)":只調度一次。

    例如,需要北京時間2024年04月01日20:00開始調度,配置時區為Asia/Shanghai,則此參數可以配置為at(2024-04-01T20:00:00)

  • Cron expressions - "cron(0 0 4 * * *)":調度多次,使用標準crontab格式。

    例如,需要北京時間每天20:00點進行調度,配置時區為Asia/Shanghai,則此參數可以配置為cron(0 0 20 * * *)

timeZone

指定的時區。

Cron運算式說明

cron(Seconds Minutes Hours Day-of-month Month Day-of-week)欄位說明如下。

欄位名

取值範圍

允許的特殊字元

Seconds

0~59

Minutes

0~59

, - * /

Hours

0~23

, - * /

Day-of-month

1~31

, - * ?/

Month

1~12或JAN~DEC

, - * /

Day-of-week

1~7或MON~SUN

, - * ?

Cron運算式中特殊字元說明如下。

字元名

定義

樣本

*

表示任一,每一。

Minutes欄位中:0表示每分鐘的0秒都執行。

,

表示列表值。

Day-of-week欄位中:MON,WED,FRI表示星期一、星期三和星期五。

-

表示一個範圍。

Hours欄位中:10-12表示UTC時間從10點到12點。

?

表示不確定的值。

與其他指定值一起使用。例如,如果指定一個特定的日期,但您不在乎它是星期幾,那麼在Day-of-week欄位中就可以使用。

/

表示一個值的增加幅度,n/m表示從n開始,每次增加m。

minute欄位中:3/5表示從3分鐘開始,每隔5分鐘執行。

水位伸縮

適用情境

Function Compute系統周期性採集預留的函數執行個體並發利用率或執行個體的資源使用率指標,使用指標並結合您配置的最小預留執行個體數、最大預留執行個體數來控制預留模式函數執行個體的伸縮,使預留的函數執行個體量更好的貼合資源的真實使用量。

配置樣本

以預留執行個體並發利用率指標伸縮為例:當流量不斷增加時,觸發擴容閾值,預留模式的函數執行個體開始擴容,當達到設定的最大值時停止擴容,超出部分的請求分配至按量模式函數執行個體;當流量不斷減小時,觸發縮容閾值,預留模式的函數執行個體開始縮容。具體如下圖所示。

image

說明
  • 使用預留模式的水位伸縮時,必須開啟執行個體層級指標功能,否則會報錯400 InstanceMetricsRequired。關於開啟執行個體層級指標的方法,請參見配置執行個體層級指標

  • 預留執行個體的並發利用率只統計預留模式的並發情況,不包含按量模式的資料。

  • 預留執行個體的並發利用率為預留模式函數執行個體正在響應的請求並發值與所有預留函數執行個體最大可響應並發值的佔比,數值範圍為[0,1]。

在使用PutProvisionConfig API配置水位伸縮的請求參數時可參考以下資訊。為function_1函數配置水位伸縮策略,指定的時區為Asia/Shanghai,即北京時間,配置的生效區間為2024-08-01 10:00:00至2024-08-30 10:00:00(北京時間),追蹤預留模式函數執行個體並發利用率ProvisionedConcurrencyUtilization指標,並發利用率追蹤值為60%,超過60%時開始擴容,擴容上限為100;並發利用率低於60%時開始縮容,縮容下限為10。

"targetTrackingPolicies": [
    {
      "name": "action_1",
      "startTime": "2024-08-01T10:00:00",
      "endTime": "2024-08-30T10:00:00",
      "metricType": "ProvisionedConcurrencyUtilization",
      "metricTarget": 0.6,
      "minCapacity": 10,
      "maxCapacity": 100,
      "timeZone": "Asia/Shanghai"
    }
  ]

參數說明如下。

參數

說明

name

配置的指標任務名稱。

startTime

配置水位伸縮開始生效的時間,如果未設定時區,預設以UTC時間運行。

endTime

配置水位伸縮結束生效的時間,如果未設定時區,預設以UTC時間運行。

metricType

追蹤的指標名稱,本文樣本為ProvisionedConcurrencyUtilization。

metricTarget

指標的追蹤值。

minCapacity

擴容的最大值。

maxCapacity

縮容的最小值。

timeZone

指定時區。

擴縮容計算原理

縮容時會通過縮容係數來實現相對保守的縮容過程,縮容係數取值範圍為(0,1]。縮容係數為系統參數,用於減緩縮容速度,防止縮容過快,您無需設定。擴縮容目標值對計算結果向上取整得到最終結果,計算邏輯如下。

  • 擴容目標值=當前預留模式的函數執行個體數×(當前指標值/設定的利用率閾值)

  • 縮容目標值=當前預留模式的函數執行個體數×縮容係數×(1-當前指標值/設定的利用率閾值)

計算樣本:

當前指標值為80%,設定的利用率閾值為40%,當前預留模式的函數執行個體數為100,經過計算100×(80%/40%)=200。預留模式的函數執行個體數會擴容到200(不能超出設定的最大預留執行個體數),以保證擴容後利用率閾值維持在40%附近。

最大可響應並發值

不同的執行個體並發數,函數執行個體可響應的最大並發值計算邏輯如下:

  • 單一實例單並發

    最大可響應並發值=函數執行個體數量

  • 單一實例多並發

    最大可響應並發值=函數執行個體數量×單一實例並發度

關於執行個體並發度的應用情境、優勢、配置及影響,請參見設定執行個體並發度

相關文檔

  • 按量模式和預留模式執行個體的基本概念及計費方式,請參見執行個體類型及使用模式

  • 如果您想解決預留執行個體利用不充分的問題,請參見配置預留執行個體

  • 預設情況下,一個阿里雲帳號在同一個地區下的所有函數共用上述伸縮限制。當需要限制某個函數的執行個體數時,您可以配置並發執行個體數上限。配置後,當此函數處於執行狀態的函數執行個體總數超過限制後,Function Compute將返迴流控錯誤。