預估以使用量為基礎的成本
本文內容
本文說明如何預估使用量及 Flex 使用量主控方案的方案成本。
Azure Functions 目前為您的函數應用程式提供四個不同的主控方案,每個方案都有自己的定價模式:
您應一律選擇能為函式執行的功能、效能和成本需求提供最佳支援的方案。 若要深入了解,請參閱 Azure Functions 規模調整和主控 。
本文著重於使用量及 Flex 使用量方案,因為這些方案的計費取決於每個執行個體內的主動執行期間。
Durable Functions 也可以在這些方案中執行。 若要深入了解使用 Durable Functions 時的成本考量,請參閱 Durable Functions 計費 。
以使用量為基礎的成本
以使用量為基礎的成本計算方式 (包括免費授與) 取決於特定方案。 如需最新的成本和授與資訊,請參閱 Azure Functions 定價頁面 。
單一函數執行的執行「成本」 是以 GB/秒 為單位來測量。 執行成本的計算方式是將其記憶體使用量與其執行時間結合。 執行而產生較多成本的函數,就像耗用更多記憶體的函數。
請考慮函數所使用的記憶體數量維持不變的情況。 在此情況下,計算成本是簡單的乘法。 例如,假設您的函數在 3 秒內耗用 0.5 GB。 則執行成本是 0.5GB * 3s = 1.5 GB-seconds
。
因為記憶體使用量會隨著時間變更,所以計算基本上是一段時間內記憶體使用量的整數。 系統會定期取樣程序 (和子程序) 的記憶體使用量來執行此計算。 如定價頁面 上所述,記憶體使用量會進位到最接近的 128 MB 貯體。 當您的程序使用 160 MB 時,您需要支付 256 MB 的費用。 計算會考慮並行,這是在相同的程序中執行多個並行函數。
注意
雖然執行成本並未直接考量 CPU 使用量,但會在影響函數執行時間時影響成本。
針對 HTTP 觸發的函數,如果您的函數程式碼在開始執行之前發生錯誤,則您不需要支付執行費用。 這表示 API 金鑰驗證或 App Service 驗證/授權功能所造成且來自平台的 401 回應不會計入執行成本。 同樣地,在函式處理要求之前,在平台中發生 5xx 狀態碼回應時,並不會計入這些回應。 當您的函程式碼開始執行之後,平台所產生的 5xx 回應仍會計算為執行,即使您的函式程式碼未引發錯誤也是一樣。
在 Flex 使用量方案中執行應用程式時,決定成本的模式有兩種。 每個模式都是以每個執行個體為基礎來決定。
計費模式
描述
隨選
在 [隨選] 模式中執行時,您只需根據函式程式碼在可用執行個體上執行的時間支付費用。 在隨選模式中,不需要最低執行個體計數。 計費項目如下: • 每個隨需執行個體主動 執行函式時佈建的記憶體總數 (以 GB-秒為單位),減去每月免費授與的 GB-秒。 • 執行總數,減去每月執行的免費授與 (數目)。
隨時可用
您可以設定一個或多個執行個體,指派給特定觸發程序類型 (HTTP/Durable/Blob) 和個別函式,讓其隨時都可用於處理要求。 啟用任何隨時可用執行個體時,計費項目如下: • 在所有隨時可用執行個體上佈建的記憶體總數,也稱為基準 (以 GB-秒為單位)。 • 每個隨時可用執行個體主動 執行函式時佈建的記憶體總數 (以 GB-秒為單位)。 • 執行總數。 使用隨時可用計費時,沒有免費授權。
此圖表代表此方案中如何判斷隨選成本:
除了執行時間之外,使用一個或多個隨時可用執行個體時,也會針對您維護的隨時可用執行個體數目,以較低的基準費率計費。 隨時可用執行個體的執行時間可能比隨選執行的執行個體執行時間便宜。
如需本節中的範例,請考慮此表格中適用於美國東部隨用隨付的折扣預覽定價。
[模式]
計量
免費的每月授與
使用量費率
依需求
執行時間 (GB-秒)
100,000
每個 GB-秒 $0.000016
依需求
執行 (計數)
250,000
每百萬次執行 $0.20
隨時可用
基準 (閒置) 時間 (GB-秒)
-
每個 GB-秒 $0.000004
隨時可用
執行時間 (GB-秒)
-
每個 GB-秒 $0.000009
隨時可用
執行 (計數)
-
每百萬次執行 $0.20
請考慮使用只包含 HTTP 觸發程序及下列基本事實的函數應用程式:
HTTP 觸發程序每秒會處理 40 個常數要求。
HTTP 觸發程序會處理 10 個並行要求。
執行個體記憶體大小設定為 2048 MB
。
未設定隨時可用執行個體 ,這表示應用程式可以調整為零。
在這類情況下,定價會更取決於程式碼執行期間要完成的工作類型。 讓我們看看兩個工作負載案例:
CPU 繫結工作負載: 在 CPU 繫結的工作負載中,在相同執行個體中平行處理多個要求沒有好處。 這表示您應將每個要求分配到其自己的執行個體,讓要求儘快完成,而不會發生爭用。 在此案例中,您應該設定低 HTTP 觸發程序並行 :1
。 使用 10 個並行要求時,應用程式會調整為大約 10 個執行個體的穩定狀態,而且每個執行個體一次都會持續主動處理一個要求。
由於每個執行個體的大小約 2 GB,因此單一持續主動執行個體的使用量為 2 GB * 3600 s = 7200 GB-s
,其採用的假設隨選執行費率 (未套用任何免費授與) 為每個執行個體每小時 $0.1152 USD
。 由於 CPU 繫結應用程式會調整為 10 個執行個體,因此執行時間的每小時費率總計為 $1.152 USD
。
同樣地,在隨選的每次執行費用中,每秒 40 個要求的費用 (不含任何免費授與) 等於每小時 40 * 3600 = 144,000
(或 14 萬 4 千) 次執行。 執行的每小時成本總計 (免費授與) 為 0.144 * $0.20
,也就是每小時 $0.0288
。
在此案例中,依需求執行 10 個執行個體的每小時成本總計為 $1.152 + $0.0288 = $1.1808 USD
。
IO 繫結工作負載: 在 IO 繫結的工作負載中,大部分的應用程式時間都花在等候傳入要求時,這可能會受到網路輸送量或其他上游因素的限制。 由於輸入受限,程式碼可以同時處理多個作業,而不會產生負面影響。 在此案例中,假設您可以在相同的執行個體上處理所有 10 個並行要求。
由於使用量費用僅以每個主動執行個體的記憶體為依據,因此使用量費用計算為 2 GB * 3600 s = 7200 GB-s
,其採用的假設隨選執行費率 (未套用任何免費授與) 是單一執行個體每小時 $0.1152 USD
。
如同在 CPU 繫結案例中,在隨選的每次執行費用中,每秒 40 個要求的費用 (不含任何免費授與) 等於每小時 40 * 3600 = 144,000
(或 14 萬 4 千) 次執行。 這使得執行的每小時成本總計 (免費授與) 為 0.144 * $0.20
,也就是每小時 $0.0288
。
在此案例中,依需求執行單一執行個體的每小時成本總計為 $0.1152 + $0.0288 = $0.144 USD
。
預估在任何方案中執行函數的整體成本時,請記住 Functions 執行階段會使用數個其他 Azure 服務,而這些服務會分別進行計費。 預估函數應用程式的定價時,您與其他 Azure 服務整合的任何觸發程序和繫結都需要建立並支付這些其他服務的費用。
針對使用量方案中所執行的函式,總成本是您函式的執行成本,加上頻寬和其他服務的成本。
預估函式應用程式和相關服務的整體成本時,請使用 Azure 定價計算機 。
影響執行時間的行為
函式的下列行為可能會影響執行時間:
觸發程序和繫結 :從函數繫結 讀取輸入以及將輸出寫入其中所需的時間會計算為執行時間。 例如,當您的函數使用輸出繫結將訊息寫入至 Azure 儲存體佇列時,您的執行時間會包括將訊息寫入至佇列所花費的時間,而這包括在函數成本的計算中。
非同步執行 :函數等待非同步要求結果的時間會計入為執行時間 (在 C# 中為 await
)。 GB/秒計算是根據函數的開始和結束時間,以及該期間內的記憶體使用量。 根據 CPU 活動,該時間發生的情況不會納入計算中。 您可以使用 Durable Functions ,在非同步作業期間降低成本。 您不需要支付協調器函數中等候所花費的時間。
在發票 中,您可以檢視 [執行總計 - 函數] 和 [執行時間 - 函數] 的成本相關資料,以及實際計費成本。 不過,此發票資料是過去發票期間的每月彙總。
函數應用程式層級計量
若要更恰當地了解函數的成本影響,您可以使用 Azure 監視器來檢視函數應用程式目前產生的成本相關計量。
使用 Azure 監視器計量瀏覽器 ,以圖形格式檢視使用量方案函式應用程式的成本相關資料。
在 Azure 入口網站 中,瀏覽至您的函式應用程式。
在左側面板中,向下捲動至 [監視] ,然後選擇 [計量] 。
從 [計量] 選擇 [函數執行計數] 和 [彙總] 的 [加總]。 這會新增所選期間的執行計數總和至圖表。
選取 [新增計量] ,然後重複步驟 2-4,即可新增 [函數執行單位] 至圖表。
產生的圖表包含所選時間範圍中 (在此案例中為兩小時) 的兩個執行計量總計。
因為執行單位數目遠大於執行計數,所以圖表只會顯示執行單位。
此圖表顯示兩小時期間總計使用的 11.1 億 Function Execution Units
(測量單位為 MB/毫秒)。 若要轉換成 GB/秒,請除以 1024000。 在此範例中,函數應用程式已使用 1110000000 / 1024000 = 1083.98
GB/秒。 假設您已使用任何免費授與的執行時間,即可採用此值,並乘以 Functions 定價頁面 上目前的執行時間價格 (定價頁面會提供這兩小時的成本)。
Azure CLI 包含用來擷取計量的命令。 您可以從本機命令環境使用 CLI,或使用 Azure Cloud Shell 直接從入口網站使用 CLI。 例如,下列 az monitor metrics list 命令會傳回之前使用相同期間的每小時資料。
請務必以執行命令的 Azure 訂閱識別碼取代 <AZURE_SUBSCRIPTON_ID>
。
az monitor metrics list --resource /subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/metrics-testing-consumption/providers/Microsoft.Web/sites/metrics-testing-consumption --metric FunctionExecutionUnits,FunctionExecutionCount --aggregation Total --interval PT1H --start-time 2019-09-11T21:46:00Z --end-time 2019-09-11T23:18:00Z
此命令會傳回類似於下列範例的 JSON 承載:
{
"cost": 0.0,
"interval": "1:00:00",
"namespace": "Microsoft.Web/sites",
"resourceregion": "centralus",
"timespan": "2019-09-11T21:46:00Z/2019-09-11T23:18:00Z",
"value": [
{
"id": "/subscriptions/XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX/resourceGroups/metrics-testing-consumption/providers/Microsoft.Web/sites/metrics-testing-consumption/providers/Microsoft.Insights/metrics/FunctionExecutionUnits",
"name": {
"localizedValue": "Function Execution Units",
"value": "FunctionExecutionUnits"
},
"resourceGroup": "metrics-testing-consumption",
"timeseries": [
{
"data": [
{
"average": null,
"count": null,
"maximum": null,
"minimum": null,
"timeStamp": "2019-09-11T21:46:00+00:00",
"total": 793294592.0
},
{
"average": null,
"count": null,
"maximum": null,
"minimum": null,
"timeStamp": "2019-09-11T22:46:00+00:00",
"total": 316576256.0
}
],
"metadatavalues": []
}
],
"type": "Microsoft.Insights/metrics",
"unit": "Count"
},
{
"id": "/subscriptions/XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX/resourceGroups/metrics-testing-consumption/providers/Microsoft.Web/sites/metrics-testing-consumption/providers/Microsoft.Insights/metrics/FunctionExecutionCount",
"name": {
"localizedValue": "Function Execution Count",
"value": "FunctionExecutionCount"
},
"resourceGroup": "metrics-testing-consumption",
"timeseries": [
{
"data": [
{
"average": null,
"count": null,
"maximum": null,
"minimum": null,
"timeStamp": "2019-09-11T21:46:00+00:00",
"total": 33538.0
},
{
"average": null,
"count": null,
"maximum": null,
"minimum": null,
"timeStamp": "2019-09-11T22:46:00+00:00",
"total": 13040.0
}
],
"metadatavalues": []
}
],
"type": "Microsoft.Insights/metrics",
"unit": "Count"
}
]
}
此特定回應顯示從 2019-09-11T21:46
到 2019-09-11T23:18
,應用程式已使用 1110000000 MB/毫秒 (1083.98 GB/秒)。
Azure PowerShell 包含用來擷取計量的命令。 您可以從本機命令環境使用 Azure PowerShell,或使用 Azure Cloud Shell 直接從入口網站使用 CLI。 例如,下列 Get-AzMetric 命令會傳回之前使用相同期間的每小時資料。
請務必以執行命令的 Azure 訂閱識別碼取代 <AZURE_SUBSCRIPTON_ID>
。
Get-AzMetric -ResourceId /subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/metrics-testing-consumption/providers/Microsoft.Web/sites/metrics-testing-consumption -MetricName FunctionExecutionUnits,FunctionExecutionCount -AggregationType Total -TimeGrain 01:00:00 -StartTime 2019-09-11T21:46:00Z -EndTime 2019-09-11T23:18:00Z
此命令會傳回類似於下列範例的輸出:
Id : /subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/metrics-testing-consumption/providers/Microsoft.Web/sites/metrics-testing-consumption/providers/Microsoft.Insights/metrics/FunctionExecutionUnits
Name :
LocalizedValue : Function Execution Units
Value : FunctionExecutionUnits
Type : Microsoft.Insights/metrics
Unit : Count
Data : {Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue,
Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue,
Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue,
Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue…}
Timeseries : {Microsoft.Azure.Management.Monitor.Models.TimeSeriesElement}
Id : /subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/metrics-testing-consumption/providers/Microsoft.Web/sites/metrics-testing-consumption/providers/Microsoft.Insights/metrics/FunctionExecutionCount
Name :
LocalizedValue : Function Execution Count
Value : FunctionExecutionCount
Type : Microsoft.Insights/metrics
Unit : Count
Data : {Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue,
Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue,
Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue,
Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue…}
Timeseries : {Microsoft.Azure.Management.Monitor.Models.TimeSeriesElement}
Data
屬性會包含實際的計量值。
函數層級計量
函數執行單位是執行時間與您記憶體使用量的組合,這樣會讓您難以了解記憶體使用量的計量。 記憶體資料不是目前可透過 Azure 監視器取得的計量。 不過,如果您想要最佳化應用程式的記憶體使用量,則可以使用 Application Insights 所收集的效能計數器資料。
如果您尚未這麼做,則請在函數應用程式中啟用 Application Insights 。 啟用此整合之後,您可以在入口網站中查詢此遙測資料 。
您可以在 Azure 入口網站 或 REST API 中使用 Azure 監視器計量瀏覽器 來取得監視器計量資料。
決定記憶體使用量
在 [監視] 下,選取 [記錄 (分析)] ,並複製下列遙測查詢,然後將其貼入查詢視窗,再選取 [執行] 。 此查詢會傳回每個取樣時間的總記憶體使用量。
performanceCounters
| where name == "Private Bytes"
| project timestamp, name, value
結果與下列範例類似:
時間戳記 [UTC]
NAME
value
9/12/2019, 1:05:14.947 AM
私用位元組
209,932,288
9/12/2019, 1:06:14.994 AM
私用位元組
212,189,184
9/12/2019, 1:06:30.010 AM
私用位元組
231,714,816
9/12/2019, 1:07:15.040 AM
私用位元組
210,591,744
9/12/2019, 1:12:16.285 AM
私用位元組
216,285,184
9/12/2019, 1:12:31.376 AM
私用位元組
235,806,720
決定持續時間
Azure 監視器會追蹤資源層級的計量,而這對於 Functions 來說就是函式應用程式。 Application Insights 整合會根據每個函式來發出計量。 以下是取得函式平均持續時間的範例分析查詢:
customMetrics
| where name contains "Duration"
| extend averageDuration = valueSum / valueCount
| summarize averageDurationMilliseconds=avg(averageDuration) by name
NAME
averageDurationMilliseconds
QueueTrigger AvgDurationMs
16.087
QueueTrigger MaxDurationMs
90.249
QueueTrigger MinDurationMs
8.522
下一步