配置應用程式調整大小

透過 IBM Cloud® Code Engine,您無需費心處理應用程式的擴展問題,因為系統會根據傳入的工作負載,自動將應用程式的執行實例數量擴展或縮減(直至歸零)。 使用自動調整大小,您不會為未使用的資源付費。

Code Engine 會監視系統中的要求數,並擴增及縮減應用程式實例,以符合送入要求的負載,包括與應用程式的任何 HTTP 連線。 這些 HTTP 連線可以是來自專案外部的要求、來自在專案中執行的其他工作量,或來自您可能訂閱的事件生產者,而不論這些生產者位於何處。Code Engine 會自動抄寫應用程式實例並配置網路基礎架構,以在所有實例之間對要求進行負載平衡。

調整大小的運作方式

Code Engine 在應用程式並發設定的限制範圍內,監控系統中的請求數量,並據此調整應用程式執行個體的規模。

若要從 Code Engine 主控台 觀察應用程式調整大小,請導覽至特定的應用程式頁面。 當應用程式正在執行時,根據您指定的實例數上限,執行中實例數為 1 或以上。 當應用程式處理的要求數少於其已配置的目標並行處理數時,應用程式會將執行中實例數縮減至已配置的實例數下限。 如果實例數下限設為 0 (預設值),則應用程式會縮減為零,且應用程式的實例數會反映 0 實例。 當應用程式縮減並將要求遞送至應用程式時,Code Engine 會擴增應用程式並將要求遞送至新建立的應用程式實例。

為了讓應用程式能夠完全縮減,您的應用程式碼必須處理 SIGTERM 信號。 當 Code Engine 自動縮減規模時,系統會向您的應用程式發送一個 SIGTERM 訊號。 如果您的應用程式未處理 SIGTERM 信號,則您的應用程式實例會在要求逾時值所配置的時間 (預設值為 300 秒) 停留在 Terminating 狀態。 在請求超時後,Code Engine 會發送一個 SIGKILL 訊號,以強制停止處於 Terminating 狀態的應用程式執行個體。

調整界限

您可以透過設定最小與最大執行個體數的範圍,來配置擴展範圍; Code Engine 會根據此範圍自動調整您應用程式中正在執行的執行個體數量。 當您建立或更新應用程式時,請配置此範圍。

  • 實例數下限-一律在執行中的應用程式實例數下限,即使未處理任何要求也一樣。 設為 0 (預設值) Code Engine 會在沒有資料流量到達應用程式時移除所有實例。 若要一律保留應用程式的執行中實例,請將此值設為大於 0。 當您從主控台使用 Code Engine 建立或更新應用程式時,請在 資源與調整 標籤的「自動調整」區段中設定實例數下限值。 使用 CLI,在 app createapp update 指令上指定 --min-scale 選項。

  • 實例數上限-可以針對應用程式執行的實例數上限。 自動擴展將在此上限內進行。 如果您將此值設為 0,則應用程式會視需要進行調整,而且應用程式調整僅受限於應用程式專案的每個資源配額的實例。 請參閱 Code Engine的限制和配額。 當您從主控台使用 Code Engine 建立或更新應用程式時,請在 資源與調整 標籤的「自動調整」區段中設定實例數上限值。 使用 CLI,在 app createapp update 指令上指定 --max-scale 選項。 此選項的預設值為 10

當您將應用程式連接至事件生產者時,請記得在設定您的規模界限時,說明來自那些生產者的事件頻率及數量。 例如,如果您預期同時接收多個事件,且處理每一個事件可能需要數分鐘,則您可能需要比快速處理每一個事件更高的最大比例值。 如果您將值設得太低,則在等待釋放處理資源時,您可能會在接收事件時遇到延遲,甚至會因為逾時而捨棄事件。

並行和計時的自動調整設定

使用下列配置設定來控制應用程式調整大小。

  • 並行-此值指出每一個應用程式實例一次可以處理的要求數。 例如,貨幣值 100 表示您的程式碼可以同時處理 100 個並行要求。 此值是「硬性限制」,表示 Code Engine 不容許超過任何一個應用程式實例的要求數 (以並行設定指定)。 因此,如果您的程式碼是單一執行緒,且一次只能處理一個要求,請考量將並行設為 1。 將指定數目的要求傳送至應用程式的所有執行中實例時,Code Engine 會增加實例數目,以準備更多要求。 當您從主控台使用 Code Engine 建立或更新應用程式時,請在 資源與調整 標籤的「自動調整」區段中設定並行值上限。 使用 CLI,在 app createapp update 指令上指定 --concurrency 選項。

  • 目標並行-此值作為載入系統中每個實例的「軟性限制」或要求數。 例如,如果您將 concurrency 指定為 100,並將 target concurrency 指定為 70,則 Code Engine 會嘗試將每個實例的要求數限制為 70。 指定此選項無法確保每個實例的要求不會高於 70,因為它很可能在資料流量增加期間。 不過,70 到 100 之間的緩衝區可讓系統建立新的實例,以將每個實例的負載恢復到每個實例 70 (或更低)。 如果未指定 target concurrency,則預設值為 concurrency。 當您從主控台使用 Code Engine 建立或更新應用程式時,請在 資源與調整 標籤的「自動調整」區段中設定目標並行值。 使用 CLI,在 app createapp update 指令上指定 --concurrency-target 選項。

  • 要求逾時-應用程式必須回應要求的時間量 (以秒為單位),否則它們會失敗。 當您從主控台使用 Code Engine 建立或更新應用程式時,請在 資源與調整 標籤的「自動調整」區段中設定要求逾時值。 使用 CLI,在 app createapp update 指令上指定 --request-timeout 選項。

  • 縮減延遲 — 在降低並發數後,必須經過的時間(以秒為單位),應用程式才會開始縮減規模。 如果您知道應用程式送入要求的型樣,您可以選擇指定大於預設值 0 的值,以延遲縮減應用程式。 如果您對此選項使用高值,則並行執行的應用程式實例平均數可能會增加,這會產生額外成本。 即使縮減延遲設定為 0,系統也會在應用程式縮減實例數之前等待一小段時間,以確保要求並行性下降的穩定性足以保證縮減。 當您從主控台使用 Code Engine 建立或更新應用程式時,請在 資源與調整 標籤的「自動調整」區段中設定縮減延遲值。 使用 CLI,在 app createapp update 指令上指定 --scale-down-delay 選項。

例如,如果實例數上限值設為 10,且並行設為 100,則應用程式可以先處理 1000 個並行要求,然後可能發生要求的潛在佇列作業。 如果您預期並行超過 1000 個要求,則可以考慮增加應用程式的實例數上限值。

如需有關 Code Engine 如何運作的詳細資訊,請參閱 調整 IBM Cloud Code Engine Scale-Down 延遲以縮短應用程式回應時間

如果您將實例數下限設為等於實例數上限,則不會進行調整,且不會套用目標貨幣及縮減延遲值。 不過,並行值仍然有效。

自動調整的範例實務

假設您有一個應用程式已配置下列自動調整大小設定。

  • 實例的最小數量 = 4
  • 最大實例數 = 20
  • 並行 = 2

使用這些設定,您的應用程式可以同時處理 2 個並行要求。 沒有資料流量時,您的應用程式會自動縮減至 4 個實例。 4 個實例只能處理 4 * 2 (貨幣) = 8 個要求。 應用程式可以擴增至最多 20 個實例,因此 20 個實例可以處理 20 * 2 (貨幣) = 40 個要求,並假設應用程式有足夠的 CPU 及記憶體設定。

假設您的應用程式是靜態 Web 應用程式,需要對應用程式進行 6 次呼叫才能載入登入頁面。 假設 10 個人同時登入您的應用程式登入頁面 (10 * 6 = 60 個呼叫)。 因為 60 個呼叫會超過您應用程式可以處理的 40 個要求,所以應用程式的使用者可能會在將呼叫排入佇列時觀察到速度緩慢。

在大約一分鐘沒有針對您應用程式的資料流量之後,Code Engine 會開始自動縮減。 當您的應用程式縮減時,部分實例會設為 Terminating 狀態。Code Engine 會將 SIGTERM 信號傳送至應用程式,且您的程式碼必須處理此信號並關閉。 如果您的應用程式未處理此信號,則您的應用程式實例會在要求逾時值所配置的時間內保持 Terminating 狀態 (預設值為 300 秒)。 在要求逾時期間之後,Code Engine 會傳送 SIGKILL 信號,以強制停止處於 Terminating 狀態的應用程式實例。

如果您有 8 個作用中實例及 12 個實例停留在 Terminating 狀態 300 秒 (5 分鐘)。 這 12 個實例未收到任何要求。 如果超過 8 * 2 (貨幣) = 16 個要求,則 Code Engine 會擴增新的實例。

在此範例中,此靜態內容的並行值 2 是低值。 您必須決定要為應用程式設定的自動調整值,這取決於應用程式的實作可以使用其指派的 CPU 及記憶體資源來處理的項目。

將延遲和傳輸量最佳化

若要最佳化應用程式延遲及傳輸量,請瞭解一些常見模型的優缺點,以及配置儲存器並行性的最佳作法。

使用並行設定來指定當您建立或更新應用程式時,每個實例可以同時處理的要求數上限。 在 Code Engine 控制台中,於「執行階段」區段中設定並發數值。 在 CLI 中,搭配使用 --concurrency 選項 (別名 --cn) 與 app createapp update 指令。

Code Engine 應用程式中的並行範例
型號 優點 缺點
單一並行 --cn=1 當應用程式處理記憶體密集或 CPU 密集的工作量時,請選擇單一並行配置,因為一次只有一個要求進入應用程式實例,因此會取得針對實例配置的完整 CPU 和記憶體數量。 使用單一並行模型快速橫向擴充的應用程式。 橫向擴充可能會帶來額外的延遲和較低的傳輸量,因為建立新的應用程式實例比重複使用現有的應用程式實例更昂貴。 如果可以同時處理要求,且延遲是應用程式的重要層面,請不要選擇此模型。
高並行,--cn=100 (預設值) 或更高 如果您的應用程式提供大量 HTTP 要求或回應工作量,這些工作量不是 CPU 密集或記憶體密集,且可以等待資源,請選擇此配置。 您可以為 API 後端選擇此並行配置,以在遠端資料庫的建立、擷取、更新及刪除作業上讀取及寫入資料。 當部分要求等待 I/O 時,可以處理其他要求,而不會影響整體延遲及傳輸量。 當並行要求競爭 CPU、記憶體或 I/O 時,此設定不是最佳設定,因為對資源的競爭可能會延遲執行,並對延遲和傳輸量產生負面影響。
最佳並行,--cn=N 如果您知道單一要求所需的資源數量,以符合您應用程式想要的回應時間,請選擇最佳並行配置。 如果您的應用程式是自然語言翻譯應用程式,其中用於語言轉換的機器學習模型是 32 GB,且每個要求需要 0.7 vCPU 的單一翻譯計算,則可以選擇此配置。 您可以選擇每個實例的 9 vCPUs 及 32 GB 記憶體的配置。 最佳儲存器並行性是關於 13 (9 vCPU/0.7 vCPU)。 如果您不知道應用程式的資源需求,請不要選擇最佳並行配置。 設定錯誤的儲存器並行可能會導致太積極或太懶惰的調整,這可能會影響應用程式的延遲、錯誤率及成本。 如需相關資訊,請參閱 判定應用程式儲存器的並行性
無限並行,--cn=0 (已停用) 已停用 Code Engine中不支援無限並行配置。 無限並行配置會將儘可能多的要求轉遞至單一應用程式實例,這可能會延遲其他應用程式實例的調整。

判斷應用程式儲存器的並行性

最佳儲存器並行值取決於應用程式在可接受要求延遲的情況下可處理的並行要求數目上限。

儲存器並行會直接影響應用程式的成功率、延遲時間及傳輸量。 當儲存器並行值太高,應用程式無法處理時,延遲和傳輸量會受到負面影響,您可能會觀察到 502503 錯誤回應。

當儲存器並行值對應用程式而言太低時,系統會更快速地橫向擴充應用程式,並將要求分散在許多應用程式實例中,造成額外成本及延遲。 在負載激增期間,當系統內部緩衝區執行時,低並行值也會導致暫時 502 回應。

若要判定應用程式的儲存器並行配置,請檢查要求及延遲。

  1. 建立應用程式,並將其並行性設為 1000 (上限),並將 min-scalemax-scale 兩者設為 1

    ibmcloud ce application create --name APPNAME --image APPIMAGE --min-scale=1 --max-scale=1 --concurrency=1000
    
  2. 從傳送高速率的要求開始。 如果發生 502 錯誤,請降低該比率,直到結果顯示 100% 成功率為止。

  3. 尋找步驟 2 輸出的要求延遲。 如果無法接受要求延遲,請進一步降低要求速率,直到要求延遲看起來可接受為止。 請注意,如果要求的計算花費 2 秒或 100 毫秒,則要求持續時間也很重要,因為它會造成差異。

    您可接受的要求速率及延遲會根據您的應用程式性質及調整大小配置而有所不同。 例如,如果應用程式內的計算大約需要 100 毫秒,且您的並行設定是 10,則一個應用程式實例可以每秒處理大約 100 個要求,延遲大約 100 毫秒 (忽略網路延遲)。

  4. 若要計算應用程式的儲存器並行值,請採用步驟 2 (在 req/s 中) 中的 速率,並除以步驟 3 (以秒為單位) 的 延遲: CC = RATE/LATENCY。 例如,如果速率為每秒 80 個要求,且延遲為 2 秒,則產生的並行性為並行性 = 80 req/s / 2 s = 40

  5. 請更新應用程式,將儲存器並行設為您在前一個步驟中找到的值,然後重新執行工作量,以檢查成功率和延遲時間是否可接受。

  6. 增加儲存器並行值並觀察成功率和延遲時間,以實驗應用程式。

  7. 以最佳儲存器並行值更新應用程式,並移除 min-Scalemax-scale 界限,以容許應用程式自動調整。

觀察您的應用程式如何使用 CLI 進行調整

您可以使用 CLI 來觀察應用程式的執行中實例數。

  1. 使用 app create 指令建立應用程式。

    ibmcloud ce application create --name myapp --image icr.io/codeengine/helloworld
    
  2. 呼叫應用程式。 您可以從 app create 指令的輸出取得應用程式的 URL,也可以執行 ibmcloud ce app get --name myapp --output url

    curl https://myapp.4svg40kna19.us-south.codeengine.appdomain.cloud
    
  3. 執行 application get 指令,以顯示應用程式的狀態。 尋找 Running instances 的值。 在此範例中,應用程式具有 1 執行中實例。 例如,

    ibmcloud ce application get --name myapp
    

    輸出範例

    [...]
    OK
    Name:          myapp
    [...]
    URL:           https://myapp.4svg40kna19.us-south.codeengine.appdomain.cloud
    Cluster Local URL:  http://myapp.4svg40kna19.svc.cluster.local
    Console URL:   https://cloud.ibm.com/codeengine/project/us-south/01234567-abcd-abcd-abcd-abcdabcd1111/application/myapp/configuration
    Status Summary:  Application deployed successfully
    Environment Variables:
        Type     Name             Value
        Literal  CE_API_BASE_URL  https://api.private.us-south.codeengine.cloud.ibm.com
        Literal  CE_APP           myapp
        Literal  CE_DOMAIN        us-south.codeengine.appdomain.cloud
        Literal  CE_PROJECT_ID    abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
        Literal  CE_REGION        us-south
        Literal  CE_SUBDOMAIN     abcdabcdab
    Image:                icr.io/codeengine/helloworld
    Resource Allocation:
        CPU:                1
        Ephemeral Storage:  400M
        Memory:             4G
    Revisions:
    myapp-ds8fn-1:
        Age:                6m25s
        Traffic:            100%
        Image:              icr.io/codeengine/helloworld (pinned to fe0446)
        Running Instances:  1
    Runtime:
        Concurrency:    100
        Maximum Scale:  10
        Minimum Scale:  0
        Timeout:        300
    Conditions:
        Type                 OK    Age    Reason
        ConfigurationsReady  true  6m10s
        Ready                true  5m56s
        RoutesReady          true  5m56s
    Events:
        Type    Reason   Age    Source              Messages
        Normal  Created  6m28s  service-controller  Created Configuration "myapp"
        Normal  Created  6m28s  service-controller  Created Route "myapp"
    Instances:
        Name                                       Revision       Running  Status   Restarts  Age
        myapp-ds8fn-1-deployment-79bdd76749-khtmw  myapp-ds8fn-1  2/2      Running  0         32s
    

    請等待幾分鐘,因為您的應用程式可能需要幾分鐘才能擴充至零。

  4. 重新執行 application get 指令,並注意 Running instances 的值已調整為零。 當應用程式處理的要求數少於其已配置的目標並行處理數時,應用程式會將執行中實例數縮減至已配置的實例數下限。 在此實務範例中,執行中實例數會自動調整為零。 當 --min-scale 選項設為 0 (預設值) 時,執行中實例數會自動調整為零。

    請等待幾分鐘,因為您的應用程式可能需要幾分鐘才能擴充至零。

    ibmcloud ce application get -n myapp
    

    輸出範例

    OK
    Name:          myapp
    [...]
    URL:           https://myapp.4svg40kna19.us-south.codeengine.appdomain.cloud
    Cluster Local URL:  http://myapp.4svg40kna19.svc.cluster.local
    Console URL:   https://cloud.ibm.com/codeengine/project/us-south/01234567-abcd-abcd-abcd-abcdabcd1111/application/myapp/configuration
    Image:                icr.io/codeengine/helloworld
    Resource Allocation:
        CPU:                1
        Ephemeral Storage:  400M
        Memory:             4G
    Revisions:
    myapp-ds8fn-1:
        Age:                12m
        Traffic:            100%
        Image:              icr.io/codeengine/helloworld (pinned to 548d5c)
        Running Instances:  0
    Runtime:
        Concurrency:         100
        Maximum Scale:       10
        Minimum Scale:       0
        Timeout:             300
    Conditions:
        Type                 OK    Age    Reason
        ConfigurationsReady  true  3m7s
        Ready                true  2m54s
        RoutesReady          true  2m54s
    Events:
        Type    Reason   Age    Source              Messages
        Normal  Created  3m21s  service-controller  Created Configuration "myapp"
        Normal  Created  3m20s  service-controller  Created Route "myapp"
    
  5. 重新呼叫應用程式以從零開始調整。

    curl https://myapp.4svg40kna19.us-south.codeengine.appdomain.cloud
    
  6. 重新執行 application get 指令,並注意 Running instances 的值已從零擴增。 例如,

    ibmcloud ce application get -n myapp
    

    輸出範例

    OK
    Name:          myapp
    [...]
    URL:           https://myapp.4svg40kna19.us-south.codeengine.appdomain.cloud
    Cluster Local URL:  http://myapp.4svg40kna19.svc.cluster.local
    Console URL:   https://cloud.ibm.com/codeengine/project/us-south/01234567-abcd-abcd-abcd-abcdabcd1111/application/myapp/configuration
    Status Summary:     Application deployed successfully
    Environment Variables:
        Type     Name             Value
        Literal  CE_API_BASE_URL  https://api.private.us-south.codeengine.cloud.ibm.com
        Literal  CE_APP           myapp
        Literal  CE_DOMAIN        us-south.codeengine.appdomain.cloud
        Literal  CE_PROJECT_ID    abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
        Literal  CE_REGION        us-south
        Literal  CE_SUBDOMAIN     abcdabcdab
    Image:                  icr.io/codeengine/helloworld
    Resource Allocation:
    CPU:                1
    Ephemeral Storage:  400M
    Memory:             4G
    Revisions:
    myapp-00001:
        Age:                42s
        Latest:             true
        Traffic:            100%
        Image:              icr.io/codeengine/helloworld (pinned to 1cee99)
        Running Instances:  1
    Runtime:
    Concurrency:       100
    Maximum Scale:     10
    Minimum Scale:     0
    Scale Down Delay:  0
    Timeout:           300
    Conditions:
    Type                 OK    Age  Reason
    ConfigurationsReady  true  25s
    Ready                true  12s
    RoutesReady          true  12s
    Events:
    Type    Reason   Age  Source              Messages
    Normal  Created  44s  service-controller  Created Configuration "myapp"
    Normal  Created  43s  service-controller  Created Route "myapp"
    Instances:
    Name                                    Revision     Running  Status   Restarts  Age
    myapp-00001-deployment-d59b87654-xkqh7  myapp-00001  3/3      Running  0         43s
    

設定應用程式的實例數下限及上限

您可以透過更新應用程式實例數的最小值和最大值,來變更應用程式的執行中實例數。

應用程式實例數下限的預設值為 0。 如果您的應用程式未收到任何資料流量,則會擴充至 0,且沒有應用程式實例在執行中。 在此狀況下,當您的應用程式再次接收資料流量時,其回應速度可能會較慢,同時會擴增。 您可以透過在主控台或 CLI 中更新應用程式並將最小比例設定為 1,來變更此行為。

您應用程式的最大執行個體數預設值為 10。 如需相關資訊,請參閱 調整界限

從主控台變更自動調整範圍

若要變更 Code Engine 從主控台自動調整應用程式執行中實例數的範圍,請遵循下列步驟。

  1. 導覽至您的應用程式。
  2. 選取「設定」索引標籤。
  3. 選取「資源與擴展」索引標籤。
  4. 設定應用程式的實例數下限及上限。
  5. (選用) 檢閱並設定要求並行及計時設定,以自動調整應用程式。
  6. 按一下 部署,以儲存變更並部署應用程式修訂。

當您更新應用程式時,您的應用程式會建立新的修訂,並將資料流量遞送至該實例。

使用 CLI 變更自動調整範圍

若要使用 CLI 變更 Code Engine 自動調整應用程式的執行中實例數的範圍,請執行 application update 指令,並將 --min-scale--max-scale 選項設為您應用程式想要的實例數。 您可以選擇性地設定應用程式的要求並行性及計時設定。 這些選項包括 --concurrency--concurrency-target--request-timeout--scale-down-delay。 如需設定這些自動調整值的相關資訊,請參閱 調整界限並行及計時的自動調整設定

當您更新應用程式時,您的應用程式會建立新的修訂,並將資料流量遞送至該實例。