簡體   English   中英

DynamoDB 性能差/慢

[英]DynamoDB Poor/Slow Performance

我在 AWS Lambda 中有一個非常簡單的網絡服務,使用 Python 和 Flask(服務 A)。 該服務接收請求並執行 DynamoDB 查詢並返回結果。 DynamoDB 具有按需容量,幾乎在所有情況下都返回 1 個結果。

我使用以下 function 執行查詢。

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 Memory 到 128MB,最大 Memory 用於 95-100 MB。 除了 DynamoDB 查詢中消耗的 4 毫秒外,所有時間都是如此。

下面是我增加 memory 時的響應時間。

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

現在我在 AWS Lambda(服務 B)中有另一個網絡服務,它使用 Python、Flask、Pandas 和 PyODBC。 該服務接收請求並對未托管在 AWS 中的 MSSQL 服務器執行 2 個簡單查詢並返回結果。 此服務有 128MB 的 Memory 和 Max Memory Used:128 MB(消耗所有內存)。 對該服務的單個請求的性能為 500 毫秒。

有人可以向我解釋這怎么可能嗎?

是否有任何解決方案可以使服務 A 中的查詢更快?

一些可能對您有幫助的事情:

  • 您提供的 RAM 量不僅會影響計算,還會影響 Lambda function 的網絡吞吐量,因此根據您的工作負載,這可能是一個限制。
  • 實例化 boto3 資源和客戶端在計算方面通常相對昂貴,緩存這些資源絕對值得,以便節省幾毫秒的時間——在我相對強大的筆記本上,實例化第一個150ms客戶端或資源大約需要 150 毫秒,因為在第一次實例化時它讀取並解析一些 JSON 描述並構建整個 object 層次結構,這需要一段時間。
  • 您可以考慮將 X-Ray SDK 添加到您的 function 並在其上啟用 X-Ray。 這將使您更詳細地了解應用程序的哪一部分以及哪個 API 調用花費了這么長時間。

編輯

男孩在第一次實例化 boto3 時確實 memory 大小很重要,我正在寫一篇關於該方法的博客文章。 但如果 memory 參數非常小,在 lambda 冷啟動后初始化第一個 boto3 客戶端/資源似乎需要很長時間。

圖形

我將ddb = DynamoDB()移到處理程序之外,並將 lambda function 的 memory 增加到 256MB。 因此,我將響應時間減少到 67 毫秒 - 75 毫秒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM