配置應用程式調整大小
透過 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 create及app update指令上指定--min-scale選項。 -
實例數上限-可以針對應用程式執行的實例數上限。 自動擴展將在此上限內進行。 如果您將此值設為
0,則應用程式會視需要進行調整,而且應用程式調整僅受限於應用程式專案的每個資源配額的實例。 請參閱 Code Engine的限制和配額。 當您從主控台使用 Code Engine 建立或更新應用程式時,請在 資源與調整 標籤的「自動調整」區段中設定實例數上限值。 使用 CLI,在app create及app update指令上指定--max-scale選項。 此選項的預設值為10。
當您將應用程式連接至事件生產者時,請記得在設定您的規模界限時,說明來自那些生產者的事件頻率及數量。 例如,如果您預期同時接收多個事件,且處理每一個事件可能需要數分鐘,則您可能需要比快速處理每一個事件更高的最大比例值。 如果您將值設得太低,則在等待釋放處理資源時,您可能會在接收事件時遇到延遲,甚至會因為逾時而捨棄事件。
並行和計時的自動調整設定
使用下列配置設定來控制應用程式調整大小。
-
並行-此值指出每一個應用程式實例一次可以處理的要求數。 例如,貨幣值 100 表示您的程式碼可以同時處理 100 個並行要求。 此值是「硬性限制」,表示 Code Engine 不容許超過任何一個應用程式實例的要求數 (以並行設定指定)。 因此,如果您的程式碼是單一執行緒,且一次只能處理一個要求,請考量將並行設為
1。 將指定數目的要求傳送至應用程式的所有執行中實例時,Code Engine 會增加實例數目,以準備更多要求。 當您從主控台使用 Code Engine 建立或更新應用程式時,請在 資源與調整 標籤的「自動調整」區段中設定並行值上限。 使用 CLI,在app create及app update指令上指定--concurrency選項。 -
目標並行-此值作為載入系統中每個實例的「軟性限制」或要求數。 例如,如果您將
concurrency指定為100,並將target concurrency指定為70,則 Code Engine 會嘗試將每個實例的要求數限制為 70。 指定此選項無法確保每個實例的要求不會高於 70,因為它很可能在資料流量增加期間。 不過,70 到 100 之間的緩衝區可讓系統建立新的實例,以將每個實例的負載恢復到每個實例 70 (或更低)。 如果未指定target concurrency,則預設值為concurrency。 當您從主控台使用 Code Engine 建立或更新應用程式時,請在 資源與調整 標籤的「自動調整」區段中設定目標並行值。 使用 CLI,在app create及app update指令上指定--concurrency-target選項。 -
要求逾時-應用程式必須回應要求的時間量 (以秒為單位),否則它們會失敗。 當您從主控台使用 Code Engine 建立或更新應用程式時,請在 資源與調整 標籤的「自動調整」區段中設定要求逾時值。 使用 CLI,在
app create及app update指令上指定--request-timeout選項。 -
縮減延遲 — 在降低並發數後,必須經過的時間(以秒為單位),應用程式才會開始縮減規模。 如果您知道應用程式送入要求的型樣,您可以選擇指定大於預設值
0的值,以延遲縮減應用程式。 如果您對此選項使用高值,則並行執行的應用程式實例平均數可能會增加,這會產生額外成本。 即使縮減延遲設定為0,系統也會在應用程式縮減實例數之前等待一小段時間,以確保要求並行性下降的穩定性足以保證縮減。 當您從主控台使用 Code Engine 建立或更新應用程式時,請在 資源與調整 標籤的「自動調整」區段中設定縮減延遲值。 使用 CLI,在app create及app 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 create 或 app update 指令。
| 型號 | 優點 | 缺點 |
|---|---|---|
單一並行 --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中不支援無限並行配置。 無限並行配置會將儘可能多的要求轉遞至單一應用程式實例,這可能會延遲其他應用程式實例的調整。 |
判斷應用程式儲存器的並行性
最佳儲存器並行值取決於應用程式在可接受要求延遲的情況下可處理的並行要求數目上限。
儲存器並行會直接影響應用程式的成功率、延遲時間及傳輸量。 當儲存器並行值太高,應用程式無法處理時,延遲和傳輸量會受到負面影響,您可能會觀察到 502 和 503 錯誤回應。
當儲存器並行值對應用程式而言太低時,系統會更快速地橫向擴充應用程式,並將要求分散在許多應用程式實例中,造成額外成本及延遲。 在負載激增期間,當系統內部緩衝區執行時,低並行值也會導致暫時 502 回應。
若要判定應用程式的儲存器並行配置,請檢查要求及延遲。
-
建立應用程式,並將其並行性設為
1000(上限),並將min-scale及max-scale兩者設為1。ibmcloud ce application create --name APPNAME --image APPIMAGE --min-scale=1 --max-scale=1 --concurrency=1000 -
從傳送高速率的要求開始。 如果發生
502錯誤,請降低該比率,直到結果顯示 100% 成功率為止。 -
尋找步驟 2 輸出的要求延遲。 如果無法接受要求延遲,請進一步降低要求速率,直到要求延遲看起來可接受為止。 請注意,如果要求的計算花費
2秒或100毫秒,則要求持續時間也很重要,因為它會造成差異。您可接受的要求速率及延遲會根據您的應用程式性質及調整大小配置而有所不同。 例如,如果應用程式內的計算大約需要 100 毫秒,且您的並行設定是 10,則一個應用程式實例可以每秒處理大約 100 個要求,延遲大約 100 毫秒 (忽略網路延遲)。
-
若要計算應用程式的儲存器並行值,請採用步驟 2 (在
req/s中) 中的 速率,並除以步驟 3 (以秒為單位) 的 延遲:CC = RATE/LATENCY。 例如,如果速率為每秒80個要求,且延遲為2秒,則產生的並行性為並行性 =80 req/s / 2 s = 40。 -
請更新應用程式,將儲存器並行設為您在前一個步驟中找到的值,然後重新執行工作量,以檢查成功率和延遲時間是否可接受。
-
增加儲存器並行值並觀察成功率和延遲時間,以實驗應用程式。
-
以最佳儲存器並行值更新應用程式,並移除
min-Scale及max-scale界限,以容許應用程式自動調整。
觀察您的應用程式如何使用 CLI 進行調整
您可以使用 CLI 來觀察應用程式的執行中實例數。
-
使用
app create指令建立應用程式。ibmcloud ce application create --name myapp --image icr.io/codeengine/helloworld -
呼叫應用程式。 您可以從
app create指令的輸出取得應用程式的 URL,也可以執行ibmcloud ce app get --name myapp --output url。curl https://myapp.4svg40kna19.us-south.codeengine.appdomain.cloud -
執行
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請等待幾分鐘,因為您的應用程式可能需要幾分鐘才能擴充至零。
-
重新執行
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" -
重新呼叫應用程式以從零開始調整。
curl https://myapp.4svg40kna19.us-south.codeengine.appdomain.cloud -
重新執行
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 從主控台自動調整應用程式執行中實例數的範圍,請遵循下列步驟。
- 導覽至您的應用程式。
- 選取「設定」索引標籤。
- 選取「資源與擴展」索引標籤。
- 設定應用程式的實例數下限及上限。
- (選用) 檢閱並設定要求並行及計時設定,以自動調整應用程式。
- 按一下 部署,以儲存變更並部署應用程式修訂。
當您更新應用程式時,您的應用程式會建立新的修訂,並將資料流量遞送至該實例。
使用 CLI 變更自動調整範圍
若要使用 CLI 變更 Code Engine 自動調整應用程式的執行中實例數的範圍,請執行 application update 指令,並將 --min-scale 及 --max-scale 選項設為您應用程式想要的實例數。
您可以選擇性地設定應用程式的要求並行性及計時設定。 這些選項包括 --concurrency、--concurrency-target、--request-timeout 及 --scale-down-delay。 如需設定這些自動調整值的相關資訊,請參閱 調整界限 及 並行及計時的自動調整設定。
當您更新應用程式時,您的應用程式會建立新的修訂,並將資料流量遞送至該實例。