DynamoDB Poor/Slow 性能

DynamoDB Poor/Slow Performance

我在 AWS Lambda 中有一个非常简单的网络服务,使用 Python 和 Flask(服务 A)。该服务接收请求并执行 DynamoDB 查询和 returns 结果。 DynamoDB 具有按需容量,几乎在所有情况下 return 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

我遇到了一些性能问题,例如单个请求需要 1040 毫秒,AWS Lambda 内存达到 128MB,Max Memory Used 达到 95-100 MB。除了 DynamoDB 查询中消耗的 4 毫秒外,所有时间都是如此。

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

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

现在我在 AWS Lambda(服务 B)中有另一个网络服务,它使用 Python、Flask、Pandas 和 PyODBC。该服务接收到一个请求并对未托管在 AWS 中的 MSSQL 服务器执行 2 个简单查询,并获得 return 结果。此服务有 128MB 内存和最大内存使用量:128MB(消耗所有内存)。对该服务的单个请求的性能为 500 毫秒。

谁能解释一下这怎么可能?

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

一些可能对您有帮助的事情:

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

编辑

男孩第一次实例化 boto3 时内存大小很重要!我正在写一篇关于该方法的博客 post,但如果内存参数非常小,在 lambda 冷启动后初始化第一个 boto3 client/resource 似乎需要很长时间。

我将 ddb = DynamoDB() 移到了处理程序之外,并将 lambda 函数的内存增加到 256MB。因此,我将响应时间减少到 67 毫秒 - 75 毫秒。