2016-02-28 46 views
3

我有一個存儲隊列超過100,000個的azure存儲隊列。平均處理時間約爲1分鐘以完成每個項目(如WebJob儀表板中所報告的)。如何最大化WebJob CPU使用率

我已經設置了最大批量大小爲我webJob爲32這樣的:

JobHostConfiguration config = new JobHostConfiguration(); 
config.Queues.BatchSize = 32; 

var host = new JobHost(config); 
// The following code ensures that the WebJob will be running continuously 
host.RunAndBlock(); 

如果我將它設置任何高於32的webjob將無法啓動並保持(掛起的重新啓動和啓動之間翻轉)所以我假設32是最大批量大小。

但是,我的應用程序服務計劃運行時CPU利用率很低,爲4%。我已經啓用了基於CPU使用率的自動縮放。

我想要做的是弄清楚如何使Web作業並行執行更多任務,以便在需要時可以開始使用更多的CPU使用率,並有望使其自動縮放,然後處理更多內容。我可以利用哪些槓桿使我的WebJob更好地利用我的App Service計劃實例?

+0

我遭受同樣的性能問題。無論我做什麼,Webjobs的CPU時間都不會超過5%。這種情況甚至發生在一個虛假的webjob示例中,它絕對不會消耗高cpu幾乎一分鐘的排序次數,而是重複排序多個項目列表,而沒有消耗CPU的意義。最高cpu使用率爲5%。 ...批量大小和批閾值沒有用,因爲問題不在於從隊列中獲取批次,而僅僅是使用機器中可用的CPU。有任何想法嗎? – fernaramburu

回答

4

代碼This comment說明了情況:關於這個

// Azure Queues currently limits the number of messages retrieved to 32. We enforce this constraint here because 
    // the runtime error message the user would receive from the SDK otherwise is not as helpful. 
    private const int MaxBatchSize = 32; 

更多信息,請https://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-queues/發現:

有兩種方法可以從隊列中自定義消息檢索。首先,您可以獲得一批消息(多達32)。 [etc ...]

所以這就是這個限制來自哪裏。但是,我認爲WebJobs SDK理論上可以同時處理多個隊列批處理,因此不必受此存儲隊列限制的約束。這是你應該提出https://github.com/Azure/azure-webjobs-sdk/issues進一步討論,看看能做些什麼。但就目前而言,這確實是限制。

+0

另一件值得注意的事情是,可以根據隊列長度啓用Web App自動縮放(儘管設置起來有點困難)。但我知道您希望從現有實例中獲得更多利用,因爲它看起來在利用中。 –

8

請注意,BatchSize的最大值32是Azure隊列對WebJobs SDK無法控制的限制。單個隊列偵聽器一次最多隻能拖出32條消息,因爲這是所有隊列都允許的。這就是爲什麼當你的作業設置大於32時,你的作業不能正常啓動 - 如果你檢查你的錯誤日誌,你應該會看到一個錯誤。

但是,還有第二個配置旋鈕與並行吞吐量有關,您也可以配置它。見config.Queues.NewBatchThreshold。未明確設置時,此值默認爲BatchSize的一半。基本上,這個設置是在取得新批次時管理的閾值。所以如果你增加這個值(比如設置爲100),更多的隊列消息將被並行處理。如果設置爲100,當正在處理的消息數量低於100時,將獲取新批次。

您還可以通過將作業擴展到多個實例來進一步提高吞吐量。我建議首先嚐試NewBatchThreshold設置,然後查看可以獲取的位置。

+0

NewBatchThreshold是否在1.1.1中知道?我在1.0.1中沒有看到它...感謝您的信息!看起來我也必須升級Azure存儲!娛樂時間!我會試試看,讓你們知道表演的樣子!謝謝!現在我正在手動擴展以解決問題。 – emseetea