

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 評估您的 DynamoDB 資料表佈建容量是否合適
<a name="CostOptimization_RightSizedProvisioning"></a>

本節概述如何評估 DynamoDB 資料表是否有適當大小的佈建。隨著工作負載的演變，您應該適時修改操作程序，尤其是在佈建模式下設定 DynamoDB 資料表時，可能會有過度佈建或佈建不足的風險。

以下描述的程序需要統計資訊，這些資訊應從支援您生產應用程式的 DynamoDB 資料表擷取。若要了解您的應用程式行為，您應定義足以從應用程式擷取資料季節性的時段。例如，若應用程式顯示每週模式，三週時間便應足夠來分析應用程式輸送量需求。

若您不知道從何下手，請使用至少一個月的資料用量進行以下計算。

評估容量時，DynamoDB 資料表可以獨立設定**讀取容量單位 (RCU)** 和**寫入容量單位 (WCU)**。如果資料表設定了任何全域次要索引 (GSI)，則需指定耗用輸送量，這也與基礎資料表的 RCU 和 WCU 無關。

**注意**  
本機次要索引 (LSI) 會耗用基礎資料表的容量。

**Topics**
+ [如何擷取 DynamoDB 資料表上的耗用指標](#CostOptimization_RightSizedProvisioning_ConsumptionMetrics)
+ [如何識別佈建不足的 DynamoDB 資料表](#CostOptimization_RightSizedProvisioning_UnderProvisionedTables)
+ [如何識別過度佈建的 DynamoDB 資料表](#CostOptimization_RightSizedProvisioning_OverProvisionedTables)

## 如何擷取 DynamoDB 資料表上的耗用指標
<a name="CostOptimization_RightSizedProvisioning_ConsumptionMetrics"></a>

若要評估資料表和 GSI 容量，請監控下列 CloudWatch 指標，然後選取適當維度，擷取資料表或 GSI 資訊：


| 讀取容量單位 | 寫入容量單位 | 
| --- | --- | 
|  `ConsumedReadCapacityUnits`  |  `ConsumedWriteCapacityUnits`  | 
|  `ProvisionedReadCapacityUnits`  |  `ProvisionedWriteCapacityUnits`  | 
|  `ReadThrottleEvents`  |  `WriteThrottleEvents`  | 

您可以透過 AWS CLI 或 執行此操作 AWS 管理主控台。

------
#### [ AWS CLI ]

在擷取資料表耗用指標前，我們需要先用 CloudWatch API 擷取一些歷史資料點。

首先要建立兩個檔案：`write-calc.json` 和 `read-calc.json`。這些檔案代表資料表或 GSI 的計算。您需要更新部分欄位 (如下表所示)，以符合您的環境。


| 欄位名稱 | 定義 | 範例 | 
| --- | --- | --- | 
| <table-name> | 您要分析的資料表名稱 | SampleTable | 
| <period> | 您將用來評估使用率目標的期間 (以秒為單位) | 針對 1 小時的時間，您應指定：3600 | 
| <start-time> | 評估間隔的開始時間，以 ISO8601 格式顯示 | 2022-02-21T23:00:00 | 
| <end-time> | 評估間隔的結束時間，以 ISO8601 格式顯示 | 2022-02-22T06:00:00 | 

寫入計算檔案將擷取指定日期範圍時段內佈建和耗用的 WCU 數。同時也會產生用於分析的使用率百分比。`write-calc.json` 檔案的完整內容應如下所示：

```
{
  "MetricDataQueries": [
    {
      "Id": "provisionedWCU",
      "MetricStat": {
        "Metric": {
          "Namespace": "AWS/DynamoDB",
          "MetricName": "ProvisionedWriteCapacityUnits",
          "Dimensions": [
            {
              "Name": "TableName",
              "Value": "<table-name>"
            }
          ]
        },
        "Period": <period>,
        "Stat": "Average"
      },
      "Label": "Provisioned",
      "ReturnData": false
    },
    {
      "Id": "consumedWCU",
      "MetricStat": {
        "Metric": {
          "Namespace": "AWS/DynamoDB",
          "MetricName": "ConsumedWriteCapacityUnits",
          "Dimensions": [
            {
              "Name": "TableName",
              "Value": "<table-name>""
            }
          ]
        },
        "Period": <period>,
        "Stat": "Sum"
      },
      "Label": "",
      "ReturnData": false
    },
    {
      "Id": "m1",
      "Expression": "consumedWCU/PERIOD(consumedWCU)",
      "Label": "Consumed WCUs",
      "ReturnData": false
    },
    {
      "Id": "utilizationPercentage",
      "Expression": "100*(m1/provisionedWCU)",
      "Label": "Utilization Percentage",
      "ReturnData": true
    }
  ],
  "StartTime": "<start-time>",
  "EndTime": "<ent-time>",
  "ScanBy": "TimestampDescending",
  "MaxDatapoints": 24
}
```

讀取計算檔案會使用類似檔案。此檔案將擷取指定日期範圍時段內佈建和耗用的 RCU 數。`read-calc.json` 檔案的內容應如下所示：

```
{
  "MetricDataQueries": [
    {
      "Id": "provisionedRCU",
      "MetricStat": {
        "Metric": {
          "Namespace": "AWS/DynamoDB",
          "MetricName": "ProvisionedReadCapacityUnits",
          "Dimensions": [
            {
              "Name": "TableName",
              "Value": "<table-name>"
            }
          ]
        },
        "Period": <period>,
        "Stat": "Average"
      },
      "Label": "Provisioned",
      "ReturnData": false
    },
    {
      "Id": "consumedRCU",
      "MetricStat": {
        "Metric": {
          "Namespace": "AWS/DynamoDB",
          "MetricName": "ConsumedReadCapacityUnits",
          "Dimensions": [
            {
              "Name": "TableName",
              "Value": "<table-name>"
            }
          ]
        },
        "Period": <period>,
        "Stat": "Sum"
      },
      "Label": "",
      "ReturnData": false
    },
    {
      "Id": "m1",
      "Expression": "consumedRCU/PERIOD(consumedRCU)",
      "Label": "Consumed RCUs",
      "ReturnData": false
    },
    {
      "Id": "utilizationPercentage",
      "Expression": "100*(m1/provisionedRCU)",
      "Label": "Utilization Percentage",
      "ReturnData": true
    }
  ],
  "StartTime": "<start-time>",
  "EndTime": "<end-time>",
  "ScanBy": "TimestampDescending",
  "MaxDatapoints": 24
}
```

一旦您建立了檔案，就可以開始擷取使用率資料。

1. 若要擷取寫入使用率資料，請發出下列命令：

   ```
   aws cloudwatch get-metric-data --cli-input-json file://write-calc.json
   ```

1. 若要擷取讀取使用率資料，請發出下列命令：

   ```
   aws cloudwatch get-metric-data --cli-input-json file://read-calc.json
   ```

這兩個查詢結果將為一系列 JSON 格式的資料點，這些資料點會用於分析。您的結果將取決於您指定的資料點數量、期間以及您自己的特定工作負載資料。這可能看起來如下：

```
{
    "MetricDataResults": [
        {
            "Id": "utilizationPercentage",
            "Label": "Utilization Percentage",
            "Timestamps": [
                "2022-02-22T05:00:00+00:00",
                "2022-02-22T04:00:00+00:00",
                "2022-02-22T03:00:00+00:00",
                "2022-02-22T02:00:00+00:00",
                "2022-02-22T01:00:00+00:00",
                "2022-02-22T00:00:00+00:00",
                "2022-02-21T23:00:00+00:00"
            ],
            "Values": [
                91.55364583333333,
                55.066631944444445,
                2.6114930555555556,
                24.9496875,
                40.94725694444445,
                25.61819444444444,
                0.0
            ],
            "StatusCode": "Complete"
        }
    ],
    "Messages": []
}
```

**注意**  
若您指定一個短期和一個長期時間範圍，您可能需要修改指令碼中預設為 24 的 `MaxDatapoints`。這代表每小時產生一個資料點，每天 24 個資料點。

------
#### [ AWS 管理主控台 ]

1. 登入 AWS 管理主控台 並導覽至 CloudWatch 服務頁面。 AWS 區域 如有必要，請選取適當的 。

1. 在左側導覽窗格中找到**指標**區段，並選取**所有指標**。

1. 這會開啟一份儀表板，其中包含兩個面板。上方面板顯示圖表，下方面板顯示您要繪製的指標。選擇 **DynamoDB**。

1. 選擇**資料表指標**。接著會顯示目前區域中的資料表。

1. 使用搜尋方塊搜尋您的資料表名稱，然後選擇寫入操作指標：`ConsumedWriteCapacityUnits` 和 `ProvisionedWriteCapacityUnits`。
**注意**  
此範例討論寫入操作指標，但您也可以用這些步驟來繪製讀取操作指標的圖形。

1. 選取**圖表化指標 (2)**分頁以修改公式。預設情況下，CloudWatch 會為圖表選取統計函數**平均值**。  
![\[已選取的圖表指標以平均值作為預設統計函數。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning1.png)

1. 同時選取兩個圖形化指標 (左側的核取方塊) 後，選取選單 **Add math** (新增數學)，再選取 **Common** (一般) 及 **Percentage** (百分比) 函數。重複該過程兩次。

   第一次選取 **Percentage** (百分比) 函數：  
![\[CloudWatch 主控台。為圖表指標選取了百分比函數。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning2.png)

   第二次選取 **Percentage** (百分比) 函數：  
![\[CloudWatch 主控台。第二次為圖表指標選取了百分比函數。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning3.png)

1. 此時，選單底部應有四個指標。接著進行 `ConsumedWriteCapacityUnits` 計算。為了保持一致，我們需要比對我們在 AWS CLI 區段中使用的名稱。按一下 **m1 ID**，並將此值變更為 **consumedWCU**。  
![\[CloudWatch 主控台。將 ID 為 m1 的圖表指標重新命名為 consumedWCU。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning4.png)

   將 **ConsumedWriteCapacityUnit** 標籤重新命名為 **consumedWCU**。  
![\[將標籤為 ConsumedWriteCapacityUnit 的圖表指標重新命名為 consumedWCU。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning5.png)

1. 將統計資料從 **Average** (平均值) 變更為 **Sum** (總和)。此動作會自動建立另一個稱為 **ANOMALY\$1DETECTION\$1BAND** 的指標。在本程序範圍內，可取消勾選新產生的 **ad1 指標**，以忽略該項。  
![\[CloudWatch 主控台。在圖表化指標的下拉清單中選取統計值 SUM。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning6.png)  
![\[CloudWatch 主控台。ANOMALY_DETECTION_BAND 指標已從圖表化指標清單中移除。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning7.png)

1. 重複步驟 8，將 **m2 ID** 重新命名為 **provisionedWCU**。將統計資料設定保留為 **Average** (平均值)。  
![\[CloudWatch 主控台。ID 為 m2 的圖表指標已重新命名為 provisionedWCU。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning8.png)

1. 選取 **Expression1** 標籤，並將值更新為 **m1**，將標籤更新為 **Consumed WCUs**。
**注意**  
請確認您只選取 **m1** (左側的核取方塊) 及 **provisionedWCU**，適當地視覺化資料。按一下 **Details** (詳細資料)，並將公式變更為 **consumedWCU/PERIOD(consumedWCU)**，以更新公式。此步驟也可能產生另一個 **ANOMALY\$1DETECTION\$1BAND** 指標，但針對此程序的範圍，我們可加以忽略。  

![\[已選取 m1 與 provisionedWCU。m1 的詳細資訊已更新為 consumedWCU/PERIOD(consumedWCU)。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning10.png)


1. 您現在應有兩個圖形：一個表示資料表上已佈建的 WCU，另一個表示已耗用的 WCU。圖形的形狀可能與下方形狀不同，但您可以將其做為參考：  
![\[繪製包含資料表佈建 WCU 與使用 WCU 的圖表。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning11.png)

1. 選取 Expression2 圖形 (**e2**) 以更新百分比公式。將標籤和 ID 重新命名為 **utilizationPercentage**。將公式重新命名，以符合 **100\$1(m1/provisionedWCU)**。  
![\[CloudWatch 主控台。Expression2 的標籤與 ID 已重新命名為 utilizationPercentage。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning12.png)  
![\[CloudWatch 主控台。Expression2 的百分比公式已更新為 100*(m1/provisionedWCU)。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning13.png)

1. 除了 **utilizationPercentage** 之外，從所有指標移除核取方塊，視覺化您的使用率模式。預設間隔設為 1 分鐘，但您可以根據需要修改。  
![\[所選時間區間的 utilizationPercentage 指標圖表。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning14.png)

這是一個更長時間及 1 小時的視圖。您可以看到有些間隔使用率高於 100%，但這個特定的工作負載具有較長的間隔，使用率為零。

![\[延長時間段的使用率模式。系統會反白顯示使用率超過 100% 或為零的時間段。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/RightSizedProvisioning15.png)


您可能得到與此範例中的圖片不同的結果。取決於您工作負載中的資料。使用率超過 100% 的間隔容易發生限流。DynamoDB 提供[高載容量](burst-adaptive-capacity.md#burst-capacity)，但是一旦高載容量完成，高於 100% 的任何項目都會受到限流。

------

## 如何識別佈建不足的 DynamoDB 資料表
<a name="CostOptimization_RightSizedProvisioning_UnderProvisionedTables"></a>

針對多數工作負載，當資料表持續耗用超過其佈建容量的 80%，就會被視為佈建不足。

[高載容量](burst-adaptive-capacity.md#burst-capacity)是一項 DynamoDB 功能，可讓客戶暫時耗用比原先佈建更多的 RCU/WCU (超過資料表定義的每秒佈建輸送量)。高載容量是為了吸收由於特殊事件或使用量尖峰而突增的流量。高載容量不會一直持續執行。一旦耗盡未使用的 RCU 和 WCU，若您嘗試耗用超過佈建的容量，就會受到限流。當應用程式流量接近 80% 使用率時，限流風險就會大幅提高。

80% 使用率規則會因資料的季節性和流量成長而有所不同。請考量下列情況：
+ 如果您的流量在過去 12 個月內**穩定**保持約 90% 的使用率，那麼您的資料表容量剛好
+ 如果您的應用程式流量在 3 個月內以每月 8% 的速度**增加**，您將達到 100%
+ 如果您的應用程式流量在略多於 4 個月的期間以 5% 的速度**增加**，您仍會達到 100%

上述查詢結果能讓您得知使用率的情況。您可以使用這些結果做為指引，進一步評估其他指標，以協助您根據需要增加資料表容量 (例如：每月或每週成長率)。與您的營運團隊合作，為工作負載和資料表定義合理的百分比。

在部分特殊情況下，每天或每週進行分析時，資料會出現偏斜。例如，若季節性應用程式在工作時段使用量高峰 (但在非工作時段幾乎降至零)，您可透過[排程的自動擴展](https://docs.aws.amazon.com/autoscaling/application/userguide/examples-scheduled-actions.html)指定每日特定時段 (與一週內哪幾天)，以調整佈建容量的增減。若應用季節性不明顯，與其提高容量以應對尖峰時段，不如使用 [DynamoDB 資料表自動擴展](AutoScaling.md)組態以最佳化效能。

**注意**  
當您為基礎資料表建立 DynamoDB 自動擴展組態時，請記得將任何與資料表相關的 GSI 加入其他組態。

## 如何識別過度佈建的 DynamoDB 資料表
<a name="CostOptimization_RightSizedProvisioning_OverProvisionedTables"></a>

從以上指令碼獲得的查詢結果提供了執行部分初始分析所需的資料點。若您的資料集在數個間隔內顯示的使用率低於 20%，表示資料表可能過度佈建。若要進一步判斷是否需減少 WCU 和 RCU 數量，您應重新檢視間隔中的其他讀數。

當資料表出現多個低使用率時段時，您可透過排程或預設的使用率型自動擴展政策有效提升資源利用率。

若您的工作負載使用率低且限流率高 (間隔中 **Max(ThrottleEvents)/Min(ThrottleEvents)**)，則當工作負載尖峰相當明顯，流量在部分日子 (或小時) 大幅增加，但通常流量一直很低時，可能會發生這種情況。在此類情境中，採用[排程的自動擴展](https://docs.aws.amazon.com/autoscaling/application/userguide/examples-scheduled-actions.html)可發揮效益。