服務的並行要求數量上限

如果是 Cloud Run 服務,每個修訂版本都會自動調整為所需的執行個體數量,以處理所有傳入要求。

當越來越多的執行個體處理要求時,便會使用更多的 CPU 和記憶體,導致費用水漲船高。

為提供更多控制權,Cloud Run 提供「每個執行個體的並行要求數上限」設定,指定特定執行個體可同時處理的要求數量上限。

每個執行個體的並行要求數量上限

您可以設定每個執行個體的並行要求數量上限。最多可增加至 1000 個。根據預設,使用 Google Cloud CLI 或 Terraform 部署的 Cloud Run 執行個體,其最大並行數是虛擬 CPU 數量的 80 倍。這項預設值只會在建立新服務時套用,不會套用至後續的修訂版本部署作業。使用 Google Cloud 控制台部署的 Cloud Run 執行個體,預設並行數為 80。

雖然您應該使用預設值,但如有需要,可以降低並行上限。舉例來說,如果程式碼無法處理並行要求,請將並行設為 1

指定的並行值是上限。如果執行個體的 CPU 使用率已偏高,Cloud Run 可能不會傳送那麼多要求至特定執行個體。在這些情況下,Cloud Run 執行個體可能會顯示並未達到並行要求數量上限。舉例來說,如果 CPU 使用率持續偏高,執行個體數量可能會改為向上擴充。

下圖顯示「每個執行個體的並行要求數量上限」設定,如何影響處理傳入並行要求所需的執行個體數量:

每個執行個體的並行要求數量上限圖表

調整並行數,以利自動調度資源及提升資源使用率

調整每個執行個體的並行數上限,會大幅影響服務的擴充方式和資源使用情形。

  • 降低並行:強制 Cloud Run 為相同要求量使用更多執行個體,因為每個執行個體處理的要求較少。這有助於改善應用程式的回應速度,特別是未針對高內部平行處理進行最佳化的應用程式,或是您希望根據要求負載更快擴充的應用程式。
  • 提高並行:每個執行個體可處理更多要求,因此可能減少運作中的執行個體數量,進而降低成本。這類執行個體適合用於可有效執行並行 I/O 繫結工作的應用程式,或可真正利用多個 vCPU 處理並行要求的應用程式。

請先使用預設並行數,密切監控應用程式的效能和使用率,然後視需要調整。

多個 vCPU 執行個體的並行作業

如果服務使用多個 vCPU,但應用程式是單一執行緒或實際上是單一執行緒 (受 CPU 限制),調整並行作業就特別重要。

  • vCPU 熱點:在多 vCPU 執行個體上,單一執行緒應用程式可能會耗盡一個 vCPU 的資源,而其他 vCPU 則處於閒置狀態。Cloud Run CPU 自動調度器會測量所有 vCPU 的平均 CPU 使用率。在這種情況下,平均 CPU 使用率可能會維持在低得令人誤解的程度,導致無法根據 CPU 有效調度資源。
  • 使用並行來驅動資源調度:如果 CPU 型自動調度資源功能因 vCPU 熱點而失效,降低並行上限就會成為重要工具。如果單一執行緒應用程式因記憶體需求高而選擇多個 vCPU,通常就會發生 vCPU 熱點。使用並行來驅動擴充,會根據要求輸送量強制擴充。這可確保啟動更多執行個體來處理負載,減少每個執行個體的佇列和延遲時間。

何時將並行限制在一次一個要求?

您可以限制並行,如此一來,一次只會傳送一個要求到每個執行中的執行個體。若出現以下狀況,您就可以考慮限制並行:

  • 每個要求都佔用大部分可用 CPU 或記憶體。
  • 容器映像檔在設計時並未考慮同時處理多個要求,例如容器需依賴兩個要求無法共用的全域狀態。

請注意,並行 1 可能會對資源調度效能造成負面影響,因為許多執行個體需要開始處理大幅增加的傳入需求。如需更多考量事項,請參閱「輸送量與延遲時間的取捨」。

個案研究

下列指標顯示的用途是:400 個用戶端每秒向 Cloud Run 服務發出 3 個要求,而該服務的每個執行個體並行要求數量上限設為 1。頂端的綠線代表一段時間內的要求數,底部的藍線則代表為處理要求而啟動的執行個體數量。

並行處理數量設為 1

下列指標顯示 400 個用戶端每秒向 Cloud Run 服務發出 3 個要求,而該服務的每個執行個體並行要求數量上限設為 80。綠色頂線顯示一段時間內的要求,藍色底線則顯示為處理要求而啟動的執行個體數量。請注意,處理相同要求量所需的執行個體數量大幅減少。

並行處理數量設為 80

原始碼部署的並行作業

啟用並行功能後,Cloud Run 不會隔離同一執行個體處理的並行要求。在這種情況下,您必須確保程式碼可安全地並行執行。如要變更這項設定,請設定不同的並行值。建議您先從較低的並行數 (例如 8) 開始,然後再逐步提高。如果一開始設定的並行數過高,可能會因資源限制 (例如記憶體或 CPU) 而導致非預期的行為。

語言執行階段也可能影響並行。以下列舉部分語言專屬影響:

  • Node.js 本質上是單一執行緒。如要善用並行功能,請使用 JavaScript 的非同步程式碼樣式,這是 Node.js 的慣用做法。詳情請參閱 Node.js 官方說明文件中的「非同步流程控制」。

  • 如要支援 Python 3.8 以上版本,且每個執行個體都具有高並行處理量,建議您設定執行階段環境變數,讓執行緒值等於並行值,例如:THREADS=8

後續步驟

如要管理 Cloud Run 服務每個執行個體的並行要求數量上限,請參閱「設定每個執行個體的並行要求數量上限」。

如要最佳化每個執行個體的並行要求數量上限設定,請參閱調整並行的開發提示