2017-08-01 63 views
4

我們有一個簡單的Azure函數來生成一個DocumentDB查詢。這似乎是我們第一次稱之爲需要等待很長時間才能完成,然後連續的呼叫非常快。爲什麼Azure函數需要花費過多時間才能「醒來」?

例如,我剛打開我們的應用程序,第一次函數調用花費了10760ms,絕對值得任何最終用戶注意。在此之後,所有的函數調用都需要大約100ms來處理,並且幾乎不可察覺。

似乎在Azure函數中有一些「喚醒」週期。有什麼方法可以最大限度地減少這種情況,或者更好的方式是將其記錄在某處,以便我們能夠理解這裏發生了什麼?

+0

您的意思是'Cosmos DB' ....根據我的理解,經過5分鐘的空閒時間後,您的功能進入冷啓動模式....防止更改爲冷啓動模式非常容易。只需在每5分鐘執行一次的相同功能應用程序中添加時間觸發功能即可。但請注意,如果您的免費執行信用超出,這可能會導致額外成本。 – Hackerman

+0

嗯,它仍然是CosmosDB DocumentDB(hehehe),但它可能是任何後端服務,我們仍然看到這個冷啓動。這是記錄在任何地方? – Graham

+4

我在這裏找到它https://blogs.msdn.microsoft.com/appserviceteam/2017/03/16/publishing-a-net-class-library-as-a-function-app/ ...它說:冷啓動發生在功能應用程序第一次請求空閒後,發生在5分鐘不活動之後。當一個Function App啓動時,它會索引所有函數,並將C#和F#腳本編譯到內存中的程序集中。所以編譯時間會增加冷啓動時間。由於功能執行尚未開始,因此客戶不需要支付冷啓動費用,但它確實會導致事件處理延遲。 – Hackerman

回答

4

運行在消費計劃上的功能應用程序的確有一段空閒時間,在這段時間之後,它們會有效地進入休眠狀態。需要下一次調用才能「喚醒它們」,正如您觀察到的,並且人們在評論中提到的那樣。

至於爲什麼會發生這種情況,微軟可以最優化地將計算工作負載分配到多租戶環境中,同時確保只在您的功能實際上正在工作的時間內收到第二個計算工作負載。這是無服務器的美麗。

對於這種不可接受的行爲的工作負載,您可以考慮從消費計劃中移出並實際應用服務計劃。或者,您可以實現定時器觸發的功能,例如每隔一分鐘關閉一次,並通過ping不想進入睡眠狀態的功能來將其用作「保持活動」機制。

+0

我在同一個函數應用中添加了一個帶有4分鐘定時器的函數,但我們仍然偶爾會看到閒置後偶爾會出現10-20秒的執行時間。這可能是其他的東西嗎? – Graham

+1

轉到應用服務計劃並利用永遠在線功能:https://github.com/Azure/Azure-Functions/wiki/Enable-Always-On-when-running-on-dedicated-App-Service-Plan – evilSnobu

+0

考慮到這一點之後,如果我要移動到應用程序服務計劃,那麼我只需編寫本機node.js代碼,而不用擔心函數開銷。 – Graham

相關問題