Python dynamodb简单查询执行时间
我有一个python aws lambda函数,用于查询aws dynamodb。 由于我的api现在需要大约1秒的时间来响应一个非常简单的查询/表设置,所以我想了解我可以在哪里进行优化 该表目前只有3项(用户),结构如下: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
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()