【问题标题】:What is the scaling algorithm for Azure Functions (never been able to get over 7 parallel instances running)Azure Functions 的缩放算法是什么(永远无法运行超过 7 个并行实例)
【发布时间】:2016-06-08 17:36:08
【问题描述】:

我正在尝试了解如何使用 azure 函数进行缩放。我们一直在测试一个在存储队列中生成 88 条消息的应用程序,这会触发我们的函数。该函数是用c#编写的。该函数下载一个文件,对其执行一些处理(它最终会将其发回,但出于测试目的我们还没有这样做)。该功能需要大约 30 秒才能完成每个请求(总共约 2500 秒的处理时间)。出于测试目的,我们将其循环 10 次。

我们的理想情况是,经过一些升温后,Azure 会自动扩展功能,以最方便的方式处理消息。使用某种考虑到启动时间等的算法。或者只是扩大到积压中的消息数量,并设置某种上限。

这是它应该如何工作的吗?我们从未能够获得超过 7 个“消费单位”。并且通常需要大约 45 分钟来处理消息队列。

关于可扩展性的其他几个问题......我们的函数是一个内存密集型操作,内存如何在函数的扩展实例之间“共享”?我问是因为我们看到了一些我们通常看不到的内存不足错误。我们已经为函数配置了最大内存(1536MB)。看到大约 2.5% 的操作因内存不足错误而失败

在此先感谢您,我们真的很想完成这项工作,因为它可以让我们将大量工作从 EC2 上的专用 Windows VM 转移到 Azure 功能上。

【问题讨论】:

    标签: azure azure-functions


    【解决方案1】:

    目的是让平台为您自动扩展,最终目标是您不必考虑或关心“消费单位”的数量(有时称为实例) 分配给您的函数应用。也就是说,总会有改进的余地,以确保我们为大多数用户提供正确的服务。 :)

    但要回答您关于内部细节的问题(就队列处理而言),我们现在拥有的是一个检查队列长度和数量的系统每条消息在被您的应用处理之前位于队列中的时间。如果我们认为您的函数应用在处理这些消息方面“落后”了,那么将添加更多消耗单元,直到我们认为您的应用能够跟上传入的负载。

    值得一提的非常重要的一点是,除了消费单位的数量之外,规模还有另一个方面。 每个消费单元都有能力并行处理许多消息。 我们经常看到人们遇到的问题不是分配的消费单元的数量,而是他们工作负载的默认并发配置。查看可以在 host.json 文件中调整的 batchSize 和 newBatchThreshold 设置。根据您的工作负载,您可能会发现更改这些值后吞吐量会显着提高(在某些情况下,减少并发已被证明可以显着提高吞吐量)。例如,如果每个函数执行需要大量内存,或者如果您的函数依赖于只能处理有限并发访问的外部资源(如数据库),您可能会观察到这一点。更多关于这些并发控制的文档可以在这里找到:https://github.com/Azure/azure-webjobs-sdk-script/wiki/host.json。

    正如我在上面所暗示的,使用按消耗单元并发可能有助于解决您遇到的内存压力问题。每个消耗单元都有自己的内存池(例如自己的 1.5 GB)。但是,如果您在单个消耗单元中处理太多消息,那么这可能是您看到的内存不足错误的根源。

    综上所述,我们一直在努力识别和优化我们认为最常见的某些负载场景,无论是从队列中排出一堆消息,还是消耗存储容器中的 Blob“流” ,处理大量的 HTTP 请求等。期待随着我们学习、成熟和从像你这样的人那里获得更多反馈,事情会发生变化。向产品组提供此类反馈的最佳位置是our GitHub repo's issue list,该地址会定期审核。

    感谢您的提问。我希望这些信息对您有所帮助,并且您能够获得您正在寻找的号码。

    【讨论】:

    • 嗨,克里斯,非常感谢。我们将探索并发选项,并在这个线程上记录,以防其他人通过搜索最终到达这里。我查看了根目录,虽然有一个主机文件,但它完全是空白的。我假设这是因为我们通过门户 UI 制作了该功能。我将从 github 副本中剪切并粘贴,然后看看我们最终的结果。
    • 嗨,克里斯,只是为了澄清您的上述答案。我们可以将批量大小设置为 1,这意味着每个消费单元一次只能处理 1 条消息。 newbatchthreshold 我们可以设置为 100。在这种情况下,如果我们将 88 条消息放入队列中,平台将启动 88 个消费单元来处理我们的消息。或多或少...使用它我们已经能够消除内存错误,但似乎无法获得超过 10 个消耗单位...
    • 10 是我们设置的临时最大值。这将在未来增加。
    • 更新我之前对那些感兴趣的人的评论。从 GA 开始,您可以在使用 Consumption 计划时为您的函数应用获得多达 60 个或更多的消耗单元。
    • @JurgenCuschieri 新的批次阈值设置可能有点令人困惑。它通过在单个 VM 上同时处理的消息数量低于配置的阈值时预取消息来工作。如果您想确保每条消息只有一个 VM,那么您需要将批量大小设置为 1,并将新批量阈值设置为 0(听起来这已经为您工作了)。
    猜你喜欢
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多