首页 > 解决方案 > 如何查找/解决函数应用吞吐量问题的根源

问题描述

我有一个由 HttpRequest 触发的 Azure 函数应用。函数应用程序读取请求,将它的一个副本扔到存储表中以进行保管,并将另一个副本发送到队列以供系统的另一个元素进一步处理。我有一个运行 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 错误吗?

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

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

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

提前感谢您提供的任何帮助。

标签: azureapachebenchhttp-status-code-429azure-function-app

解决方案


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

  1. 如果您想要更多控制,您需要使用始终开启的应用服务计划以避免冷启动,您还需要配置自动缩放,因为您在此计划中负责并且默认情况下在应用服务计划中不启用​​自动缩放。

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

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

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


推荐阅读