2017-05-25 82 views
0

對於消費計劃中的Azure函數應用程序,我有兩個定時器觸發的C#函數,大約需要1分鐘才能運行。Azure函數併發超時

如果他們在不同的時間運行,他們每個人都能成功運行。但是,如果我在時間上重疊運行它們,那麼這些功能將永遠無法完成,並且會超時。

我看不到併發問題可能來自哪裏。這些函數通過EF從Azure SQL讀取數據並將結果寫入Azure存儲上的不同Blob。

這兩個函數在ASP.NET MVC Web應用程序(Web應用程序)中承載Azure應用程序服務並同時正確運行的webjobs之前實現。

當我將兩個webjob移動到Azure函數應用程序時,我將Web App bin文件夾的內容複製到Function App bin文件夾中,然後在每個函數中引用必要的dll。

我認爲這個併發問題的一個原因是複製Web App bin文件夾的內容。

我能想到的另一個原因是,如果消費計劃沒有對每個新功能的內存進行預算,從而正確縮放。例如,如果觸發的新功能本身需要大量內存,則可能應將其分配給新的計算實例,而不是共享先前的計算實例。因爲我的函數佔用大量內存,所以如果第一個函數被分配給一個小的計算實例,並且第二個函數被分配給同一個小計算實例,則兩者都可能超過導致超時的限制。

編輯

從Matt Mason MSFT的建議之後的其他結果。

  • 使用第二個功能應用程序。也在消費模式下,並在bin文件夾中具有相同的 文件。我能夠在不同的功能應用上以相同的 時間運行這兩個功能,並且他們成功完成。這 讓我相信問題應該來自功能應用程序和 而不是Azure SQL或Blob存儲依賴項。

但是,在單獨的應用程序中運行功能不是一個可接受的解決方案。從相同功能的應用程序同時運行的功能和 監控實況度量流

  • 結果:

    一個。每個函數都單獨成功運行,並顯示CPU總數爲70%至97%,內存爲400至700 MB。見第一張圖片。

    b。兩個功能在同一時間。我看到110%的CPU和800 MB的內存,然後指標流空白,我看到了。 「無在線服務器」。一段時間後,我再次看到一臺服務器在線,但兩種功能狀態是「從未完成」。這是功能應用程序崩潰嗎?請參閱下面的圖像2,3和4。 one functiontwo functions at beginningtwo functions after some timeenter image description here

+0

您是否使用EF的共享(靜態)Db連接實例?運行在同一個底層主機上的函數共享一個AppDomain,這可能會導致一些怪異。 –

+0

每個函數都將投射自己的EF的DbContext實例。作爲額外的結果。我可以在單獨的功能應用上同時運行這兩個功能(請參閱上面的編輯)。 – donquijote

回答

1

嘗試使用應用程式深入分析來分析你的函數:

https://github.com/Azure/Azure-Functions/wiki/App-Insights-(Preview)

你應該能夠看到每個實例的性能計數器(使用多少內存有,等等) ,彙總的執行指標和執行日誌。

如果函數絕對不能一起運行,請嘗試將它們放在單獨的函數應用程序中,以使它們不會在同一個實例上運行。


更新: 這可能是該功能的應用程序崩潰。這也可能是因爲CPU太高,它會影響App Insights數據上傳 - 檢查服務器ID是否已更改。

您可以在函數中使用​​參數綁定,並記錄進度更新以查看應用程序洞察分析中的一些執行跟蹤。

不幸的是縮放在這些情況下效果不好,我建議你在https://github.com/azure/azure-webjobs-sdk-script/issues上提出一個問題,要求跨實例更好地分配重量級定時器功能 - 但是,最好的辦法是使用單獨的應用程序或添加租賃管理/調度以確保您的功能不會同時運行。

+0

謝謝。請參閱上面的編輯以獲得新的結果。 – donquijote

+0

更新了我的答案。 –

+0

再次感謝。我根據您的建議創建了該問題。你也知道在函數的設置中,我可以爲這兩個函數中的每一個定義它們應該總是被分派到一個新的實例嗎? – donquijote