跳至內容

如何疑難排解並解決 Amazon DocumentDB 執行個體上的高 CPU 使用率?

2 分的閱讀內容
0

我想疑難排解 Amazon DocumentDB (with MongoDB compatibility) 執行個體上的高 CPU 使用率。

簡短說明

Amazon DocumentDB 執行個體的 CPU 使用率可協助您了解目前配置的資源在處理持續工作負載時的表現。

您可能會因以下原因看到 CPU 使用率增加:

  • 使用者發起的高負載工作負載
  • 效率不佳的查詢
  • 由於叢集中的讀取負載未取得平衡,叢集中的寫入器負擔過重
  • 讀取器的硬體組態低於寫入器,因此無法跟上高寫入工作負載的同步需求
  • Amazon DocumentDB 叢集中的內部任務,例如垃圾收集
  • 過多的資料庫連線 (閒置)
  • 短暫的大量連線

解決方法

使用 Amazon CloudWatch 指標

使用 CloudWatch 收集並分析叢集的操作指標。使用 CloudWatch 指標來識別 CPU 及其成比例指標在較長時間內的模式。

在 CloudWatch 主控台中檢閱並監控以下指標:

  • 使用 DatabaseConnectionsDatabaseConnectionsMax 來識別相關時間軸上已開啟的連線數量。
  • 使用 WriteIOPsReadIOPsReadThroughputWriteThroughput 來了解 Amazon DocumentDB 執行個體上的整體工作負載。
  • 使用 DocumentsDeletedDocumentsInsertedDocumentsReturnedDocumentsUpdated 來了解 Amazon DocumentDB 執行個體上的使用者工作負載。
  • 如果您使用 T3 或 T4 執行個體類別,請檢閱 CPUCreditBalanceCPUSurplusCreditBalance 以檢查運算限流。

使用 Performance Insights 指標

使用 Amazon DocumentDB Performance Insights 來識別對資料庫負載和等待狀態有貢獻的查詢。在 Manage Metrics (管理指標) 選項下,使用 average active sessions (平均作用中工作階段) 來檢閱負載和 CPU 分佈 (系統、使用者或總計)。

當平均負載超過執行個體上的 vCPU 數量時,就會發生高負載。不過,如果平均負載低於資料庫執行個體類別的 vCPU 數量,則 CPU 限流可能不是應用程式延遲的原因。若要識別 CPU 使用量增加的原因,請檢閱平均負載,並分析與 I/O、鎖定和閂鎖相關的等待狀態

使用原生資料庫查詢

使用原生查詢來分析工作負載並檢查 CPU 使用量。若要列出目前在 Amazon DocumentDB 執行個體上執行的所有作業,請使用 MongoDB Shell 執行以下查詢:

db.adminCommand({currentOp: 1, $all: });

若要列出所有遭到封鎖或執行超過 10 秒的查詢,請執行使用 currentOp 命令的以下查詢:

db.adminCommand({
    aggregate: 1,
    pipeline: [
        {$currentOp: {}},
        {$match: {
            $or: [
                {secs_running: {$gt: 10}},
                {WaitState: {$exists: true}}
            ]
        }},
        {$project: {
            _id:0,
            opid: 1,
            secs_running: 1,
            WaitState: 1,
            blockedOn: 1,
            command: 1
        }}
    ],
    cursor: {}
});

若要分析系統使用結果,請在 CPU 使用率高的執行個體上執行以下查詢:

db.adminCommand({
    aggregate: 1,
    pipeline: [
        {
            $currentOp: {
                allUsers: true,
                idleConnections: true
            }
        },
        {
            $group: {
                _id: {
                    desc: "$desc",
                    ns: "$ns",
                    WaitState: "$WaitState"
                },
                count: {
                    $sum: 1
                }
            }
        }
    ],
    cursor: {}
});

上述查詢會傳回每個命名空間中執行之所有查詢的彙總結果。它也會列出所有內部系統任務,以及每個命名空間的唯一等待狀態數量。

**注意:**內部任務下的 GARBAGE_COLLECTION 指標是 Amazon DocumentDB 叢集中多版本並行控制 (MVCC) 的實作。這是一個背景清除程式,會移除失效的文件版本,並與資料庫中的更新或刪除次數相關。Amazon DocumentDB 會根據集合層級的內部臨界值啟動清理程序,並導致讀取或寫入 IOPs 及 CPU 使用量增加。

檢查查詢的效率

檢查寫入查詢的索引額外負荷

過多或未使用的索引會減慢寫入作業。若要改善效能,請檢查索引使用統計資料,以識別並移除不必要的索引。

檢查查詢的 explain-plan

當查詢需要搜尋集合中的每一份文件時,查詢就會變慢。建立適當的索引以提升查詢速度。

使用 explain 命令來識別您要建立索引的欄位。您也可以使用 Profiler 日誌擷取長時間執行的查詢及其作業詳細資訊。

檢查集合的統計資料

檢查您所使用集合的以下統計資料:

  • 檢閱 Performance Insights 中的 Top Queries (熱門查詢) 區段,以識別對負載貢獻最大的集合。
  • 檢閱集合的統計資料,以了解 DocumentDB 執行了多少次插入、更新和刪除作業。您也可以檢查發生了多少次索引掃描和完整集合掃描。
  • 分割您的集合,以減少需要處理的文件大小,特別是在您有大量更新作業時。

檢查 Aggressive Logging 設定

Amazon DocumentDB 會優先處理事件稽核,而非資料庫流量。如果您不需要稽核,則可以將其關閉。如果您需要稽核,請將 audit_logs 參數設為只記錄必要事件。為負載增加做好規劃,並在需要時切換到較大的執行個體類別。

若要避免 Profiler 日誌的積極記錄,請確認您已為 profiler_threshold_ms 參數設定正確的值。檢閱應用程式工作負載,以識別您需要的正確臨界值,將查詢歸類為長時間執行查詢。

針對您要匯出到 CloudWatch 的日誌,啟用 log exports (日誌匯出) 選項。

使用最佳實務

將讀取工作負載卸載至讀取器

如果您的 Amazon DocumentDB 叢集中有多個資料庫執行個體,請將讀取工作負載卸載到讀取器執行個體。當您以複本集方式連線時,請為連線指定 readPreference。如果您指定 secondaryPreferred 的讀取偏好設定,則用戶端會嘗試將讀取查詢路由至複本。用戶端會嘗試將寫入查詢路由至主要資料庫執行個體。

注意:讀取器具有最終一致性。如果工作負載需要較強的寫入後讀取一致性,請使用動態讀取偏好設定,並在查詢層級進行覆寫。例如,您可以在連線層級預設使用 secondaryPreferred,讓查詢傳送至次要節點。如果您有需要較強寫入後讀取一致性的查詢,則可以覆寫預設值並從主要節點讀取。

範例:

db.collection.find().readPref("primary")

將一個或多個讀取器執行個體新增至叢集

如果您的 Amazon DocumentDB 叢集只有一個資料庫執行個體 (僅限寫入器),請將一個或多個讀取器資料庫執行個體新增至叢集。然後使用 readPreference=secondaryPreferred 來有效處理負載。

使用 Amazon DocumentDB Profiler 識別慢速查詢

使用 Amazon DocumentDB Profiler 記錄慢速查詢。如果某個查詢反覆出現在慢速查詢日誌中,則您可能需要額外的索引來改善效能。

檢查長時間執行的查詢,其執行計畫中是否包含 COLLSCAN 階段。COLLSCAN 階段表示查詢必須讀取集合中的每一份文件,才能對查詢提供回應。

如需更多資訊,請參閱在 Amazon DocumentDB (with MongoDB compatibility) 中分析長時間執行的查詢

使用 CloudWatch 建立警示通知

建立 CloudWatch 警示,在 CPU 使用率指標超過特定臨界值時通知您。

擴展資料庫執行個體的執行個體類別

如果已無進一步調整查詢的空間,請擴展叢集中執行個體的執行個體類別,以處理工作負載。

**注意:**如果您擴展執行個體類別,則成本會增加。如需更多資訊,請參閱 Amazon DocumentDB (with MongoDB compatibility) 定價

相關資訊

擴展 Amazon DocumentDB 叢集

疑難排解效能和資源使用率

如何在 Amazon DocumentDB (with MongoDB compatibility) 上建立索引

AWS 官方已更新 6 個月前