2016-11-24 53 views
1

我正在評估Azure函數以創建縮略圖圖像。較大圖像的源URL被放置在一個存儲隊列中,帶有隊列觸發器的C#函數用於處理這些URL(從源代碼下載,調整大小並上傳到另一個位置)。Azure函數吞吐量不佳

每個函數調用都需要500ms以下的時間進行處理,這很好。但是,在運行一系列測試之後,我發現整體並行處理吞吐量並不是那麼好。在隊列中有1500-2000個項目的工作負載時,平臺每秒只能執行大約10個函數實例。

是否有任何擴展方法並使平臺同時執行更多的函數實例?

+0

你能分享你的function.json和你的一些函數代碼嗎?另外,請說明您正在運行哪個計劃(消費/應用程序服務)。 – mathewc

回答

5

當在消費(動態)計劃下運行時,系統會在我們發現您的功能沒有跟上時自動擴展到更多實例。這種擴展並不是瞬時的,因此可能是在您添加更多實例之前或稍後才能看到您的測試結果,然後才能看到這些新實例的效果。在應用服務(經典)計劃中運行時,您可以預先控制實例的數量,並可擴展到所需的數量。

有針對你可以在你host.json文件設置影響每個功能的App實例並行量隊列幾個配置旋鈕。下queues配置部分,可以設置batchSizenewBatchThreshold,例如:

{ 
    "queues": { 
     "batchSize": 32, 
     "newBatchThreshold": 50 
    } 
} 

batchSize是被從隊列中拉出上每次提取的消息的數量。然後並行處理批次中的所有消息。 newBatchThreshold管理何時將獲取下一批消息。只有當前正在處理的消息數量低於此閾值時,纔會從隊列中提取新批消息。因此,增加newBatchThreshold將允許並行處理更多消息。有關這些設置的更多詳細信息,請參閱wiki here

請注意,您在調整這些設置時必須考慮到您的工作量。例如,如果你的函數非常內存/ CPU密集型,你不能在單個實例上並行運行太多它們。所以你可能需要嘗試一下。

除上述所有功能外,還應確保功能正確async函數,以確保線程在IO上不會被不必要地阻塞,並且功能代碼中不存在其他潛在瓶頸本身。