如何最大化WebJob CPU使用率

时间:2016-02-28 03:59:39

标签: azure batch-processing azure-webjobs azure-webjobssdk

我有一个azure存储队列,其上有超过100,000个队列项。完成每个项目的平均处理时间约为1分钟(如WebJob仪表板中所报告)。

我已将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是最大批量大小。

但是,我的应用服务计划运行时具有很低的4%CPU利用率。我已根据CPU使用情况启用了自动缩放。

我想要做的是弄清楚如何让web作业并行执行更多任务,以便在需要时可以开始使用更多的CPU使用量,并希望使其自动扩展然后处理更多。我可以使用哪些杠杆来使我的WebJob更好地利用我的App Service Plan实例?

2 个答案:

答案 0 :(得分:10)

请注意,BatchSize最大值为32是Azure Queues强加的限制,WebJobs SDK无法控制。单个队列侦听器一次最多只能拉出32条消息,因为这是所有队列允许的。这就是为什么当你的工作设置大于32时你的工作没有正常启动的原因 - 如果你检查你的错误日志,你会看到一个错误就是这样。

但是,还有第二个配置旋钮,它与您可以配置的并行吞吐量相关。见config.Queues.NewBatchThreshold。未明确设置时,此值默认为BatchSize的一半。基本上,此设置是控制何时获取新批次的阈值。因此,如果增加此值(例如将其设置为100),将并行处理更多队列消息。如果设置为100,当正在处理的邮件数量低于100时,将获取新批次。

您还可以通过将作业扩展到多个实例来进一步提高吞吐量。我建议先尝试NewBatchThreshold设置,然后看看它的位置。

答案 1 :(得分:5)

代码中的

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 )。 [等等...]

这就是这个限制的来源。但是,我认为WebJobs SDK理论上可以同时处理多个队列批次,因此它不必受此存储队列限制的约束。您应该在https://github.com/Azure/azure-webjobs-sdk/issues上提出一些建议,以便进一步讨论可以做些什么。但就目前而言,这确实是限制。