Azure Functions 的触发和执行之间的延迟

问题描述 投票:0回答:1

我有一个 Azure 函数(定价计划:消费计划 Y1),它托管一个 Python 端点,移动应用程序使用该端点来检查某个事件是否已开始。它连接到 NoSql CosmosDB 并获取数据,然后将其返回到正文中。有时它可能会收到大量呼叫(在有人询问之前无法缓存)。

我决定检查该解决方案在压力下如何工作,并在短时间内(1-5 秒)通过大约 100 个调用来实现它。每个调用都需要更多的时间才能完成,但我注意到一些奇怪的事情,因为每个调用在触发和实际执行第一个命令之间等待的时间越来越长。其中一些花了超过30秒。我假设有太多的调用,但是当我运行一个更简单的函数(不调用任何数据库,只返回一个 json)时,每次执行大约花费相同的时间。

这使我得出的结论是,与数据库的连接可能是一个问题,但是当我尝试测量从数据库检索数据需要多长时间时,它表明它不应该导致问题。处理调用的时间的主要因素似乎是触发和开始执行之间的延迟。下面的日志更好地说明了我的意思。

代码:

@app.route(route="get_start_stop", auth_level=func.AuthLevel.ANONYMOUS)
def get_start_stop(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('get_start_stop - HTTP trigger')

    start_stop_tic = time.perf_counter()
    # retrival of data from database
    start_stop = repository_service.get_start_stop()
    start_stop_toc = time.perf_counter()
    logging.info(f'get_start_stop returned start: {start_stop.get("start")},'
             f'stop: {start_stop.get("stop")},'
             f'time of execution: {start_stop_toc - start_stop_tic:.6f} seconds')
    return func.HttpResponse(json.dumps(start_stop), status_code=200)

jmeter 执行时间增长的图片:https://i.sstatic.net/kZfYUQOb.png

日志:

2024-05-08 20:42:13.033 Executing 'Functions.get_start_stop' (Reason='This function was programmatically called via the host APIs.', Id=f55d807c-1dfc-4b30-86d7-cb351d310dd2) Information
2024-05-08 20:42:31.179 get_start_stop - HTTP trigger Information
[...]
2024-05-08 20:42:31.314 get_start_stop returned start: 2024-04-10T22:00:00Z,stop: 2024-06-13T22:00:00Z,time of execution: 0.136382 seconds Information
2024-05-08 20:42:31.315 Executed 'Functions.get_start_stop' (Succeeded, Id=f55d807c-1dfc-4b30-86d7-cb351d310dd2, Duration=18282ms) Information

在前两行中,您可以看到触发和执行第一个命令之间有 18 秒的延迟 (

logging.info('get_start_stop - HTTP trigger')
)。从数据库检索数据只需要 0.1 秒。我假设消耗计划会自动扩展(最大扩展限制设置为 200)。所以我的问题是:

  1. 为什么会出现延迟?您能指导我还应该检查什么吗?
  2. 连接DB与延迟有关系吗?还是这几次操作力挽狂澜,加起来?
  3. 缩放是自动的吗?我可以检查是否正在创建附加节点吗?
python azure azure-functions azure-cosmosdb
1个回答
0
投票

为什么会出现延迟?您能指导我还应该检查什么吗?

延迟很可能是由横向扩展操作引起的。消费计划中的 API 请求被池化,工作代理触发横向扩展操作并相应地分配请求。如果在所有请求完成后立即向该函数再抛出 100 个请求,您可能会看到更好的结果,因为实例计数仍然会更高,因为该函数尚未缩小。

作为最佳实践的一种手段,还要确保您的函数代码是非阻塞的。确保在适用的情况下使用 async/await。

连接DB与延迟有关系吗?还是这几次操作力挽狂澜,加起来?

并发会影响数据库性能,是的。但是,根据您的 Cosmos DB 计划,并且在不知道完成查询所需的工作量的情况下,很难说这是否是性能瓶颈。

缩放是自动的吗?我可以检查是否正在创建附加节点吗?

它是平台的一部分,所以是自动的,是的。

您可以通过 Azure Monitor 监视在任何给定时刻运行的 Azure Function 应用程序的实例数量。 Azure Monitor 提供有关函数应用的性能和使用情况的见解,包括与实例计数和资源利用率相关的指标。

查看实例数量:

  1. Azure 门户:导航到 Azure 门户中的 Azure Function 应用。在“监控”部分下,选择“指标”。在这里,您可以选择“函数执行计数”或“函数调用率”等指标,并按特定函数或函数应用进行筛选以查看实例计数。

  2. Azure Monitor Metrics Explorer:您还可以使用 Azure Monitor 中的 Metrics Explorer 来查询和可视化与函数应用相关的指标,包括实例计数。您可以自定义图表和查询来监控您感兴趣的特定指标。

  3. Azure CLI 或 PowerShell:您可以使用 Azure CLI 或 PowerShell 命令以编程方式检索指标。例如,您可以使用

    az monitor metrics list
    命令列出函数应用的指标并检索实例计数。

© www.soinside.com 2019 - 2024. All rights reserved.