如何最大化 WebJob CPU 使用率
Posted
技术标签:
【中文标题】如何最大化 WebJob CPU 使用率【英文标题】:How to maximize WebJob CPU Usage 【发布时间】:2016-06-11 06:01:20 【问题描述】:我有一个 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 更好地利用我的应用服务计划实例?
【问题讨论】:
我遇到了同样的性能问题。无论我做什么,Webjobs 占用的 CPU 时间都不会超过 5%。即使使用虚假的 webjob 样本也会发生这种情况,该样本只会消耗高 CPU 进行近一分钟的排序和重新排序多次,而不是消耗 CPU 更有意义的项目列表。 5% 最大 CPU 使用率。 ...批次大小和批次阈值没有用,因为问题不在于从队列中获取批次,而只是使用机器中可用的 CPU。有什么想法吗? 【参考方案1】:请注意,BatchSize
的最大值为 32 是 Azure 队列施加的限制,WebJobs SDK 无法控制。单个队列侦听器一次最多只能提取 32 条消息,因为这是所有队列都允许的。这就是为什么当您将其设置为大于 32 时您的工作无法正常启动的原因 - 如果您检查错误日志,您应该会看到与此相关的错误。
但是,您还可以配置第二个与并行吞吐量相关的配置旋钮。见config.Queues.NewBatchThreshold
。当未明确设置时,此值默认为 BatchSize
的一半。基本上,此设置是控制何时获取新批次的阈值。因此,如果您增加此值(例如将其设置为 100),将会并行处理更多队列消息。如果设置为 100,当正在处理的消息数量低于 100 时,将获取新批次。
您还可以通过将作业扩展到多个实例来进一步提高吞吐量。我建议先尝试 NewBatchThreshold 设置,然后看看它会带来什么。
【讨论】:
在 1.1.1 中是否知道 NewBatchThreshold?我在 1.0.1 中没有看到它...感谢您提供的信息!看来我也必须升级 Azure 存储!娱乐时间!我会尝试一下,让你们知道性能是什么样的!谢谢!现在,我正在手动向外扩展。【参考方案2】:代码中的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 上提出的问题,以便进一步讨论以了解可以做什么。但就目前而言,这确实是限制。
【讨论】:
另一件值得注意的事情是,可以根据队列长度启用 Web App 自动缩放(尽管设置起来有些困难)。但我了解您希望从现有实例中获得更多利用,因为它显示为未充分利用。以上是关于如何最大化 WebJob CPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章
如何防止 CPU “最大化”:同步方法异步调用多个工作人员并使用 SemaphoreSlim 进行节流?