Python dynamodb简单查询执行时间

Python dynamodb简单查询执行时间,python,optimization,aws-lambda,amazon-dynamodb,Python,Optimization,Aws Lambda,Amazon Dynamodb,我有一个python aws lambda函数,用于查询aws dynamodb。 由于我的api现在需要大约1秒的时间来响应一个非常简单的查询/表设置,所以我想了解我可以在哪里进行优化 该表目前只有3项(用户),结构如下: user_id (Primary Key, String), details ("[{ "_nested_atrb1_str": "abc", "_nested_atrb2_str": "def", "_nested_map": [nes

我有一个python aws lambda函数,用于查询aws dynamodb。 由于我的api现在需要大约1秒的时间来响应一个非常简单的查询/表设置,所以我想了解我可以在哪里进行优化

该表目前只有3项(用户),结构如下:

user_id (Primary Key, String),
details ("[{
      "_nested_atrb1_str": "abc",
      "_nested_atrb2_str": "def",
      "_nested_map": [nested_item1,nested_item2]},
      {..}]
查询非常简单:

response = table.query(
        KeyConditionExpression=Key('userid').eq("xyz")
    )
查询需要0.8-0.9秒

  • 对于只有3个项目的表,这是正常的查询时间吗 用户最多只有5个属性(包括嵌套属性)
  • 如果是,我能期待吗 如果结构保持不变,但项目数量不变,则时间相似 (用户)增加百倍

    • 有几件事需要调查。首先,您的0.8-0.9秒计时是基于直接通过将查询包装在时间或timeit-like计时器中来计时查询?如果查询真的需要花费时间,那么Lambda与Dynamo的交互肯定有一些不太正确的地方

      如果您看到的时间实际上来自Lambda的调用(我假设这是通过API网关作为REST API,因为您提到了“API”),那么您看到的时间可能是由许多因素造成的。你能分析一下API调用吗?如果您可以通过配置文件查看DNS查找、SSL设置等的时间,我会查看Postman甚至浏览器工具。此外,一旦请求到达Lambda,CloudWatch将为您提供特定于Lambda呼叫时间的指标。您还可以查看启用X射线,这将为您提供有关Lambda执行的更多详细信息。如果您的Lambda在VPC中运行,您也可能会遇到冷启动,导致您看到的延迟

      X光:


      冷启动:只要在谷歌上搜索“AWS Lambda冷启动”,你就会发现各种各样的信息

      有一些事情需要调查。首先,您的0.8-0.9秒计时是基于直接通过将查询包装在时间或timeit-like计时器中来计时查询?如果查询真的需要花费时间,那么Lambda与Dynamo的交互肯定有一些不太正确的地方

      如果您看到的时间实际上来自Lambda的调用(我假设这是通过API网关作为REST API,因为您提到了“API”),那么您看到的时间可能是由许多因素造成的。你能分析一下API调用吗?如果您可以通过配置文件查看DNS查找、SSL设置等的时间,我会查看Postman甚至浏览器工具。此外,一旦请求到达Lambda,CloudWatch将为您提供特定于Lambda呼叫时间的指标。您还可以查看启用X射线,这将为您提供有关Lambda执行的更多详细信息。如果您的Lambda在VPC中运行,您也可能会遇到冷启动,导致您看到的延迟

      X光:


      冷启动:只需在谷歌上搜索“AWS Lambda冷启动”,你就会发现各种信息

      如果你只在第一次调用时看到这个问题,那么肯定是因为Lambda的冷启动。否则,对于后续的请求,应该有一个改进,这可能有助于您诊断实际的痛点。此外,cloudwatch日志将有助于跟踪请求

      如果您仅在第一次调用时才看到此问题,那么肯定是由于lambda的冷启动。否则,对于后续的请求,应该有一个改进,这可能有助于您诊断实际的痛点。此外,cloudwatch日志将有助于跟踪请求

      我假设您正在重用连接,因为它缩短了几毫秒的执行时间。如果没有,这将帮助您实现这一目标。
      lambda_处理程序
      函数之外的任何变量都将在lambda调用之间冻结,并可能重新使用。文档声明“不假设AWS Lambda总是重用容器,因为AWS Lambda可能会选择不重用容器。”但据观察,根据执行量,容器几乎总是被重用的。

      我假设您正在重用连接,因为它缩短了几毫秒的执行时间。如果没有,这将帮助您实现这一目标。
      lambda_处理程序
      函数之外的任何变量都将在lambda调用之间冻结,并可能重新使用。文档声明“不假设AWS Lambda总是重用容器,因为AWS Lambda可能会选择不重用容器。”但据观察,根据执行量的不同,容器几乎总是被重用的。

      对于具有类似经验的任何人,我收到了以下AWS开发者支持回复,其中包含一些有用的参考资料。这并没有解决我的问题,但我现在明白这主要与低(测试)卷和lambda启动时间有关

      1) 对于每个用户最多只有5个属性(包括嵌套属性)的只有3个项的表,这是正常的查询时间吗

      时间很慢,但可能是由于基于您的设置的许多因素造成的。因为您使用的是Lambda,所以需要记住,每次触发Lambda函数时,它都会设置您的环境,然后执行代码。AWS Lambda函数在与其他函数隔离的执行环境中的容器中运行。首次运行函数时,AWS Lambda将创建一个新容器并开始执行函数的代码。Lambda函数有一个处理程序,每次调用执行一次。函数执行后,AWS Lambda可能会选择重用容器以进行后续函数调用。在这种情况下,函数处理程序可能能够重用在初始化代码中定义的资源。(请注意,您无法控制AWS Lambda将保留容器多长时间,或者容器是否将被重用。)您的表非常小,我已经看过了。[1]

      2) 我能期待西米拉吗
      Times in milliseconds
      
      # Initially
      
      3 calls to DB, 
      1350 ms 1st call (read)
      1074 ms 2nd call (write)
      1051 ms 3rd call (read)
      
      
      # After doing this outside the DB calls and providing it to each one
      dynamodb = boto3.resource('dynamodb',region_name=REGION_NAME)
      
        12   ms executing the line above
      1324     ms 1st call (read)  
       285     ms 2nd call (write)
       270     ms 3rd call (read)
      
      
      # seeing that reusing was producing savings I did the same with
      tableusers = dynamodb.Table(TABLE_USERS)
      
        12 create dynamodb handler
         3 create table handler
      1078 read reusing dynamodb and table
       280 write reusing dynamodb and table
       270 read reusing dynamodb (not table)
      
      # The -u 0.001 sets the time unit at 1ms (default is 1 microsecond)
      %lprun  -u 0.001 -f lambdaquick lambdaquick()