

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

当线程在 CPU 中处于活动状态或正在等待 CPU 时，会发生 `cpu` 等待事件。

**Topics**
+ [支持的引擎版本](#ams-waits.cpu.context.supported)
+ [上下文](#ams-waits.cpu.context)
+ [等待次数增加的可能原因](#ams-waits.cpu.causes)
+ [操作](#ams-waits.cpu.actions)

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

以下引擎版本支持此等待事件信息：
+ Aurora MySQL 版本 2 和 3

## 上下文
<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`

性能详情将数据库引擎的 CPU 使用情况报告为 `os.cpuUtilization.nice.avg`。

## 等待次数增加的可能原因
<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>

要查找会话和查询，请查看性能详情的**主要 SQL** 表格，以了解 CPU 负载最高的 SQL 语句。有关更多信息，请参阅 [使用 Performance Insights 控制面板分析指标](USER_PerfInsights.UsingDashboard.md)。

通常，一两条 SQL 语句会占用大部分的 CPU 周期。把精力集中在这些语句上。假设您的数据库实例有 2 个数据库负载为 3.1 个平均活动会话 (AAS) 的 vCPU，且它们全部处于 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。该值低于 2.0 的最大 vCPU 行。

有关使用性能详情进行故障排除的有用概览，请参阅博客文章[利用性能详情分析 Amazon Aurora MySQL 工作负载](https://aws.amazon.com/blogs/database/analyze-amazon-aurora-mysql-workloads-with-performance-insights/)。另请参阅 AWS Support 文章[如何对 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 并行查询。您可以使用此方法通过向下推送 `WHERE` 子句的函数处理、行筛选和列投影，减少头节点上的 CPU 使用率。
+ 了解每秒 SQL 执行次数是否达到预期阈值。
+ 了解索引维护或新索引创建是否占用生产工作负载所需的 CPU 周期。在活动高峰时间之外安排维护活动。
+ 了解是否可以使用分区来帮助减少查询数据集。有关更多信息，请参阅博客文章[如何计划和优化与 MySQL 兼容的 Amazon Aurora 以实现工作负载整合](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 使用率高的原因在于数据库引擎之外。一个典型的例子是连接风暴。

检查以下条件是否为真：
+ 性能详情 `CPUUtilization` 指标和 Amazon CloudWatch `DatabaseConnections` 指标都有所提高。
+ CPU 中的线程数大于 vCPU 的数量。

如果上述条件为真，请考虑减少数据库连接的数量。例如，您可以使用 RDS 代理之类的连接池。要了解有效的连接管理和扩缩的最佳实践，请参阅白皮书 [Amazon Aurora MySQL DBA 连接管理手册](https://d1.awsstatic.com/whitepapers/RDS/amazon-aurora-mysql-database-administrator-handbook.pdf)。