如何最大化WebJob CPU使用率

ems*_*tea 5 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();
Run Code Online (Sandbox Code Playgroud)

如果我将其设置为高于32,则webjob将无法启动并保持翻转(等待重启和启动),因此我假设32是最大批量大小.

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

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

mat*_*ewc 10

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

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

您还可以通过将作业扩展到多个实例来进一步提高吞吐量.我建议先尝试NewBatchThreshold设置,看看它能带给你什么.


Dav*_*bbo 5

代码中的这条评论解释了这种情况:

    // 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;
Run Code Online (Sandbox Code Playgroud)

有关这方面的更多信息,请访问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上进行进一步讨论,了解可以做些什么.但就目前而言,这确实是限制.