

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

# cpu
<a name="ams-waits.cpu"></a>

`cpu` 等待事件表示執行緒活躍於 CPU 中或正在等待 CPU。

**Topics**
+ [支援的引擎版本](#ams-waits.cpu.context.supported)
+ [Context](#ams-waits.cpu.context)
+ [等待變多的可能原因](#ams-waits.cpu.causes)
+ [動作](#ams-waits.cpu.actions)

## 支援的引擎版本
<a name="ams-waits.cpu.context.supported"></a>

下列引擎版本支援這個等待事件資訊：
+ Aurora MySQL 2 版和 3 版

## Context
<a name="ams-waits.cpu.context"></a>

對於每個 vCPU，連線都可以在此 CPU 上執行工作。在某些情況下，準備好執行的作用中連線數量高於 vCPU 的數量。這種不平衡會導致連線等待 CPU 資源。如果作用中連線的數量持續地高於 vCPU 的數量，則您的執行個體會遭遇 CPU 爭用。爭用會導致 `cpu` 等待事件發生。

**注意**  
CPU 的績效詳情指標為 `DBLoadCPU`。`DBLoadCPU` 的值與 CloudWatch 指標 `CPUUtilization` 的值可能不同。後者是從 HyperVisor 為資料庫執行個體收集的指標。

績效詳情作業系統指標提供 CPU 使用率的詳細資訊。例如，您可以顯示下列指標：
+ `os.cpuUtilization.nice.avg`
+ `os.cpuUtilization.total.avg`
+ `os.cpuUtilization.wait.avg`
+ `os.cpuUtilization.idle.avg`

績效詳情以 `os.cpuUtilization.nice.avg` 報告資料庫引擎的 CPU 使用率。

## 等待變多的可能原因
<a name="ams-waits.cpu.causes"></a>

此事件比平時更常發生時，可能表示有效能問題，典型原因包括：
+ 分析查詢
+ 高度並行交易
+ 長時間執行的交易
+ 連線數量突然增加，稱為「登入風暴」**
+ 內容切換變多

## 動作
<a name="ams-waits.cpu.actions"></a>

如果 `cpu` 等待事件在資料庫活動中佔多數，則不見得表示有效能問題。效能降低時才需要回應此事件。

根據 CPU 使用率增加的原因，請考慮下列策略：
+ 增加主機的 CPU 容量。這種方法通常只是應急而已。
+ 識別潛在最佳化的熱門查詢。
+ 如適用，請將一些唯讀工作負載重新導向至讀取器節點

**Topics**
+ [識別造成問題的工作階段或查詢](#ams-waits.cpu.actions.az-vpc-subnet)
+ [分析並最佳化高 CPU 工作負載](#ams-waits.cpu.actions.db-instance-class)

### 識別造成問題的工作階段或查詢
<a name="ams-waits.cpu.actions.az-vpc-subnet"></a>

若要尋找工作階段和查詢，請查看績效詳情中的 **Top SQL** (最高 SQL) 資料表，以取得 CPU 負載最高的 SQL 陳述句。如需詳細資訊，請參閱[使用績效詳情儀表板來分析指標](USER_PerfInsights.UsingDashboard.md)。

通常，一或兩個 SQL 陳述式會耗用大部分的 CPU 週期。將精力集中在這些陳述式上。假設您的資料庫執行個體有 2 個 vCPU，資料庫負載為 3.1 平均作用中工作階段 (AAS)，全部都處於 CPU 狀態。在此情況下，您的執行個體受到 CPU 限制。請考慮下列策略：
+ 升級至 vCPU 更多的大型執行個體類別。
+ 調校您的查詢以降低 CPU 負載。

在此範例中，最高 SQL 查詢具有 1.5 AAS 的資料庫負載，全部都處於 CPU 狀態。另一個 SQL 陳述式在 CPU 狀態下有 0.1 的負載。在此範例中，如果您已停止負載最低的 SQL 陳述式，則不會大幅減少資料庫負載。不過，如果您將兩個高負載查詢最佳化為效率的兩倍，則可以消除 CPU 瓶頸。如果您將 1.5 AAS 的 CPU 負載減少 50%，則每個陳述式的 AAS 會降低至 0.75。CPU 上花費的總資料庫負載現在為 1.6 AAS。此值低於最大 vCPU 數線，即 2.0。

如需使用績效詳情進行疑難排解的實用概觀，請參閱部落格文章[利用績效詳情分析 Amazon Aurora MySQL 工作負載](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/)。另請參閱 AWS 支援文章 [如何疑難排解和解決 Amazon RDS for MySQL 執行個體上的高 CPU 使用率？](https://aws.amazon.com/premiumsupport/knowledge-center/rds-instance-high-cpu/)。

### 分析並最佳化高 CPU 工作負載
<a name="ams-waits.cpu.actions.db-instance-class"></a>

在找出增加 CPU 使用率的查詢之後，您可以將其最佳化或結束連線。下列範例示範如何結束連線。

```
CALL mysql.rds_kill(processID);
```

如需詳細資訊，請參閱[mysql.rds\$1kill](mysql-stored-proc-ending.md#mysql_rds_kill)。

如果您結束工作階段，動作可能會觸發長時間回復。

#### 遵循最佳化查詢的指導方針
<a name="ams-waits.cpu.actions.db-instance-class.optimizing"></a>

若要最佳化查詢，請考慮以下指導方針：
+ 執行 `EXPLAIN` 陳述式。

  這個命令會顯示執行查詢所涉及的個別步驟。如需詳細資訊，請參閱 MySQL 文件中的[利用 EXPLAIN 最佳化查詢](https://dev.mysql.com/doc/refman/5.7/en/using-explain.html)。
+ 執行 `SHOW PROFILE` 陳述式。

  使用此陳述式可檢閱設定檔詳細資訊，此詳細資訊可以指出在目前工作階段期間執行之陳述式的資源使用情形。如需詳細資訊，請參閱 MySQL 文件中的 [SHOW PROFILE 陳述式](https://dev.mysql.com/doc/refman/5.7/en/show-profile.html)。
+ 執行 `ANALYZE TABLE` 陳述式。

  使用此陳述式，可重新整理高 CPU 耗用查詢所存取之資料表的索引統計資料。藉由分析敘述句，您可以協助最佳化工具選擇適當的執行計劃。如需詳細資訊，請參閱 MySQL 文件中的 [ANALYZE TABLE 陳述式](https://dev.mysql.com/doc/refman/5.7/en/analyze-table.html)。

#### 遵循改善 CPU 使用率的指導方針
<a name="ams-waits.cpu.actions.db-instance-class.considerations"></a>

若要改善資料庫執行個體中的 CPU 使用率，請遵循下列指導方針：
+ 確保所有查詢都是使用適當的索引。
+ 了解您是否可以使用 Aurora 平行查詢。您可以使用此技術，減少前端節點上的 CPU 使用量，方法是下推 `WHERE` 子句的函數處理、資料列篩選和資料欄投影。
+ 了解每秒 SQL 執行次數是否符合預期的閾值。
+ 了解索引維護或建立新索引是否佔用生產工作負載所需的 CPU 週期。將維護活動排定在尖峰活動時間之外。
+ 了解您是否可以使用分割來協助減少查詢資料集。如需詳細資訊，請參閱部落格文章[如何為合併的工作負載規劃並最佳化 Amazon Aurora 與 MySQL 相容性](https://aws.amazon.com/blogs/database/planning-and-optimizing-amazon-aurora-with-mysql-compatibility-for-consolidated-workloads/)。

#### 檢查連線風暴
<a name="ams-waits.cpu.actions.db-instance-class.cpu-util"></a>

 如果 `DBLoadCPU` 指標不是非常高，但 `CPUUtilization` 指標很高，CPU 使用率高的原因是在資料庫引擎之外造成的。典型範例是連線風暴。

檢查下列條件是否為 true：
+ 績效詳情 `CPUUtilization` 指標和 Amazon CloudWatch `DatabaseConnections` 指標都有所增加。
+ CPU 中的執行緒數量大於 vCPU 的數量。

如果上述條件為 true，請考慮減少資料庫連線數量。例如，您可以使用連線集區，如 RDS Proxy。若要了解有效連線管理和擴展的最佳實務，請參閱白皮書[用於連線管理的 Amazon Aurora MySQL DBA 手冊](https://d1.awsstatic.com/whitepapers/RDS/amazon-aurora-mysql-database-administrator-handbook.pdf)。