DynamoDB 性能差/缓慢

3

我在AWS Lambda中使用Python和Flask创建了一个非常简单的Web服务(Service A)。该服务接收请求并执行DynamoDB查询,然后返回结果。DynamoDB具有按需容量,在几乎所有情况下都返回1个结果。

我使用以下函数执行查询:

class DynamoDB:

    def __init__( self ):
        session = boto3.Session( )
        self.dynamodb = session.resource( 'dynamodb' )

    def query( self, table_name, **kwargs ):

        # Selected Table
        table = self.dynamodb.Table( table_name )

        # Request to table
        response = table.query( **kwargs )

        return response

查询表达式

"#user_id = :user_id and begins_with( #sort_key, :sort_key)" 

响应大小约为400B

我遇到了一些性能问题,例如单个请求需要1040ms,并且使用AWS Lambda Memory为128MB和最大内存使用量为95-100 MB。除了DynamoDB查询消耗的4ms之外,所有时间都被消耗。

以下是当我增加内存时的响应时间。

128  MB  -> 1040 ms
512  MB  -> 520  ms
1024 MB  -> 210  ms  

现在我有一个使用Python、Flask、Pandas和PyODBC的AWS Lambda中的另一个Web服务(Service B)。该服务接收请求并向未托管在AWS上的MSSQL服务器执行两个简单的查询,然后返回结果。该服务有128MB的内存,并且最大使用内存为128MB(占据了所有的内存)。对于单个请求,该服务的响应时间为500毫秒。

有人能解释一下这是如何可能的吗?

是否有任何解决方案可以使Service A中的查询更快?


这个帖子可能会有用。 - amitd
网络带宽也是根据函数的内存进行扩展的。物品有多大,您能分享更多关于查询条件的信息吗? - Maurice
1
@Maurice,感谢您的回答。我已经更新了我的问题并提供了您需要的信息。 - dapo
请确保在处理程序之外(上方)实例化boto3库。由于代码未包含在内,因此无法确定您是否正在执行此操作。 - F_SO_K
@F_SO_K 是的,那就是解决方案。我把 ddb = DynamoDB() 移到处理程序之外,并将内存增加到 256MB。结果响应时间缩短为 67ms。 - dapo
显示剩余2条评论
2个回答

3
以下是翻译的结果:

以下是可能有助于您的几件事情:

  • 您预配的 RAM 不仅会影响计算,还会影响 Lambda 函数的网络吞吐量,因此根据您的工作负载,这可能是一个限制。
  • 实例化 boto3 资源和客户端通常在计算方面相对昂贵,值得缓存以从时间上节省几毫秒。在我的相对强大的笔记本电脑上,实例化第一个 boto3 客户端或资源需要约 150ms ,因为在第一次实例化时它会读取和解析一些 JSON 描述并构建整个对象层次结构,这需要一段时间。
  • 您可以考虑将 X-Ray SDK 添加到函数中,并在其中启用 X-Ray。这将为您提供更详细的洞察力,了解应用程序的哪个部分和哪个 API 调用所需的时间较长。

编辑

当实例化 boto3 时,内存大小很重要!我正在撰写一篇关于方法论的博客文章,但看起来如果内存参数非常小,则在 lambda 冷启动后首次实例化 boto3 客户端/资源需要很长时间。

Graph


3

我将ddb = DynamoDB()移至处理程序外部,并将Lambda函数的内存增加到256MB。结果,我将响应时间缩短至67ms - 75ms。


这是文档在此处的建议:https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html#function-code - Joris Kok
谢谢,谢谢,Dapo,非常好的回答。我相信将dynamodb实例化放在lambda的初始化中,而不是lambda的函数处理程序中,是这里要做的第一件事。我使用的是128mb,这样做将我的总运行时间从1600-2000毫秒减少到120-160毫秒。我相信增加内存可能会减少一些毫秒,但现在已经在预期的时间范围内,所以几乎不需要这样做。这刚刚拯救了这个项目。再次感谢你。!!! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接