如何 find/cure 函数应用程序吞吐量问题的来源

How to find/cure source of function app throughput issues

我有一个由 HttpRequest 触发的 Azure 函数应用程序。函数应用程序读取请求,将它的一个副本扔到存储 table 中以供妥善保管,并将另一个副本发送到队列以供系统的另一个元素进一步处理。我有一个客户端 运行 一个 ApacheBench 测试,报告每秒处理大约 148 个请求。该处理速度不足以满足我们的预期负载。

我对函数应用程序的理解是它应该产生尽可能多的实例来处理发送给它的负载。但是这个函数应用程序可能无法快速扩展,因为它每秒只处理 148 个请求。我需要它每秒处理至少 200 个请求。

不过,我不是 100% 确定问题出在我这边。在分析我的函数应用程序的性能时,我发现了很多 429 错误。我在网上发现的内容,尤其是 https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits,表明这些错误可能是由于从单个 IP 发送的请求过多所致。在给定的一天内多次 ApacheBench 10K 和 20K 请求负载测试会导致 429 错误吗?

但是,如果不是这样,如果问题出在我的函数应用程序上,我该如何强制我的函数应用程序更快地生成更多实例?我认为这是每秒获得更多吞吐量的方法。但我在使用函数应用程序方面仍然很陌生,所以如果有不同的方法,我非常欢迎你的意见。

也许 public 预览中的高级应用服务计划可以处理更多的吞吐量?我考虑过切换到那个 运行 快速测试,但不确定我是否能够切换回去?

也许 EventHub 是我需要调查的东西?这是否可以通过捕获更多请求并保留它们直到函数应用程序可以接受和处理它们来增加我的表观吞吐量?

在此先感谢您提供的任何帮助。

Function 应用程序工作得很好,并且可以像它说的那样扩展。这可能是因为来自单一 IP 的请求和 Azure 可能正在考虑它是 DDOS。您可以执行以下操作

AzureDevOps 负载测试

您可以使用其中一项 azure 服务进行负载测试。我非常确定他们有更好的处理 IP 的标准。 Azure DeveOps Load Test

在 Azure 中配置 VM

我通常的做法是在 azure 中配置 VM (windows 10 pro) 并使用 JMeter 进行负载测试。我已经使用这种方法进行了测试,并且效果很好。您可以配置其中几个并细分负载。

使用专业的负载测试服务

如果可能,您可以使用 Loader.io 等服务。他们使用复杂的算法 运行 进行负载测试,并为 运行 相同的测试提供大量虚拟机。

使用 Application Insights

如果还没有,您必须使用应用程序洞察力从服务器的角度更好地了解。转到实时流,看看它会提供多少实例来处理负载测试。您可以轻松查看可能出现的事件和错误日志并进行调查。您可以深入了解每个关联的依赖项并调查问题。

您没有提供太多关于您的应用的上下文,但这是您可以改进的几个步骤

  1. 如果你想要更多的控制,你需要使用 App Service plan 和 always on 来避免冷启动,你还需要配置自动缩放,因为你负责这个计划和自动缩放默认情况下在应用程序服务计划中未启用。

  2. 你的 azure 函数必须是完全异步的,因为你有外部依赖,所以你不想在调用它们时阻塞线程。

  3. 查看限制。使用host.json你可以tweek它。

429 错误意味着函数正忙于处理您的请求,所以当您写入 table 时,您可能没有使用异步和阻塞线程